Skip to content

Commit

Permalink
fix: corner cases of visibility result readback
Browse files Browse the repository at this point in the history
  • Loading branch information
3Shain committed Dec 5, 2024
1 parent 6a91256 commit 42e0c49
Show file tree
Hide file tree
Showing 5 changed files with 23 additions and 31 deletions.
19 changes: 0 additions & 19 deletions src/d3d11/d3d11_context_impl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3602,25 +3602,6 @@ template <typename ContextInternalState> class MTLD3D11DeviceContextImplBase : p
});
});
}
// auto previous_encoder = GetLastEncoder();
// assert(previous_encoder->kind == EncoderKind::Render);
// auto previous_renderpass = (ENCODER_RENDER_INFO *)previous_encoder;
// if (!active_occlusion_queries.empty()) {
// previous_renderpass->use_visibility_result = 1;
// if (auto next_offset = vro_state.getNextWriteOffset(true); next_offset != ~0uLL) {
// EmitCommand([next_offset](CommandChunk::context &ctx) {
// ctx.render_encoder->setVisibilityResultMode(
// MTL::VisibilityResultModeCounting, (ctx.visibility_offset_base + next_offset) << 3
// );
// });
// }
// } else {
// if (vro_state.getNextWriteOffset(false) != ~0uLL && previous_renderpass->use_visibility_result) {
// EmitCommand([](CommandChunk::context &ctx) {
// ctx.render_encoder->setVisibilityResultMode(MTL::VisibilityResultModeDisabled, 0);
// });
// }
// }
dirty_state.clrAll();
if (cmdbuf_state == CommandBufferState::TessellationRenderPipelineReady) {
return UploadShaderStageResourceBinding<PipelineStage::Vertex, true>() &&
Expand Down
3 changes: 3 additions & 0 deletions src/d3d11/d3d11_query.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@ class OcculusionQuery : public MTLD3DQueryBase<IMTLD3DOcclusionQuery> {
} else {
*((uint64_t *)data) = accumulated_value;
}
query = new VisibilityResultQuery();
state = QueryState::Signaled;
return S_OK;
}
Expand All @@ -73,6 +74,7 @@ class OcculusionQuery : public MTLD3DQueryBase<IMTLD3DOcclusionQuery> {
if (state == QueryState::Issued) {
// discard previous issued query
state = QueryState::Building;
query = new VisibilityResultQuery();
return true;
}
// FIXME: it's effectively ignoring Begin() after Begin()
Expand All @@ -83,6 +85,7 @@ class OcculusionQuery : public MTLD3DQueryBase<IMTLD3DOcclusionQuery> {
End() override {
if (state == QueryState::Signaled) {
// ignore a single End()
accumulated_value = 0;
return false;
}
if (state == QueryState::Issued) {
Expand Down
2 changes: 1 addition & 1 deletion src/dxmt/dxmt_command_queue.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -192,10 +192,10 @@ class CommandChunk {

void
reset() noexcept {
visibility_readback = {};
list_enc.~CommandList();
cpu_arugment_heap_offset = 0;
gpu_arugment_heap_offset = 0;
visibility_readback = {};
attached_cmdbuf = nullptr;
}
};
Expand Down
3 changes: 1 addition & 2 deletions src/dxmt/dxmt_context.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -397,7 +397,7 @@ ArgumentEncodingContext::bumpVisibilityResultOffset() {
render_encoder->use_visibility_result = 1;
if (auto offset = vro_state_.getNextWriteOffset(true); offset != ~0uLL)
encodeRenderCommand([offset](RenderCommandContext &ctx) {
ctx.encoder->setVisibilityResultMode(MTL::VisibilityResultModeCounting, offset >> 3);
ctx.encoder->setVisibilityResultMode(MTL::VisibilityResultModeCounting, offset << 3);
});
} else {
if (vro_state_.getNextWriteOffset(false) != ~0uLL && render_encoder->use_visibility_result)
Expand Down Expand Up @@ -426,7 +426,6 @@ ArgumentEncodingContext::flushCommands(MTL::CommandBuffer *cmdbuf, uint64_t seqI
assert(encoder_index == encoder_count);
}

// TODO: optimize command order
if (encoder_count > 1) {
unsigned j, i;
EncoderData *prev;
Expand Down
27 changes: 18 additions & 9 deletions src/dxmt/dxmt_occlusion_query.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -115,16 +115,16 @@ class VisibilityResultQuery {

void
issue(uint64_t seqId, uint64_t const *readbackBuffer, unsigned numResults) {
seq_id_issued = seqId;
assert(seq_id_issued >= seq_id_begin);
assert(seq_id_issued <= seq_id_end);
assert(seqId >= seq_id_begin);
assert(seqId <= seq_id_end);
uint64_t const *start = seqId == seq_id_begin ? readbackBuffer + occlusion_counter_begin : readbackBuffer;
uint64_t const *end = seqId == seq_id_end ? readbackBuffer + occlusion_counter_end : readbackBuffer + numResults;
assert(start <= end);
while (start != end) {
accumulated_value_ += *start;
start++;
}
seq_id_issued = seqId;
}

bool
Expand All @@ -133,16 +133,25 @@ class VisibilityResultQuery {
*value = accumulated_value_;
return true;
}
*value = 0;
return false;
}

void
reset() {
accumulated_value_ = 0;
seq_id_begin = ~0uLL;
occlusion_counter_begin = ~0uLL;
seq_id_end = ~0uLL;
occlusion_counter_end = ~0uLL;
seq_id_issued = 0;
};

private:
uint64_t accumulated_value_ = 0;
uint64_t seq_id_begin = 0;
uint64_t occlusion_counter_begin = 0;
uint64_t seq_id_end = 0;
uint64_t occlusion_counter_end = 0;
uint64_t seq_id_begin = ~0uLL;
uint64_t occlusion_counter_begin = ~0uLL;
uint64_t seq_id_end = ~0uLL;
uint64_t occlusion_counter_end = ~0uLL;
uint64_t seq_id_issued = 0;
std::atomic<uint32_t> refcount_ = {0u};
};
Expand All @@ -156,7 +165,7 @@ class VisibilityResultReadback {
seq_id(seq_id),
num_results(num_results),
queries(queries),
visibility_result_heap(visibility_result_heap) {}
visibility_result_heap(std::move(visibility_result_heap)) {}
~VisibilityResultReadback() {
for (auto query : queries) {
query->issue(seq_id, (uint64_t *)visibility_result_heap->contents(), num_results);
Expand Down

0 comments on commit 42e0c49

Please sign in to comment.