diff --git a/src/d3d11/d3d11_context_impl.cpp b/src/d3d11/d3d11_context_impl.cpp index 4bc62a20..b8c67832 100644 --- a/src/d3d11/d3d11_context_impl.cpp +++ b/src/d3d11/d3d11_context_impl.cpp @@ -3602,25 +3602,6 @@ template 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() && diff --git a/src/d3d11/d3d11_query.cpp b/src/d3d11/d3d11_query.cpp index a04fb0a8..ca625cff 100644 --- a/src/d3d11/d3d11_query.cpp +++ b/src/d3d11/d3d11_query.cpp @@ -58,6 +58,7 @@ class OcculusionQuery : public MTLD3DQueryBase { } else { *((uint64_t *)data) = accumulated_value; } + query = new VisibilityResultQuery(); state = QueryState::Signaled; return S_OK; } @@ -73,6 +74,7 @@ class OcculusionQuery : public MTLD3DQueryBase { if (state == QueryState::Issued) { // discard previous issued query state = QueryState::Building; + query = new VisibilityResultQuery(); return true; } // FIXME: it's effectively ignoring Begin() after Begin() @@ -83,6 +85,7 @@ class OcculusionQuery : public MTLD3DQueryBase { End() override { if (state == QueryState::Signaled) { // ignore a single End() + accumulated_value = 0; return false; } if (state == QueryState::Issued) { diff --git a/src/dxmt/dxmt_command_queue.hpp b/src/dxmt/dxmt_command_queue.hpp index 012bf757..53439e4b 100644 --- a/src/dxmt/dxmt_command_queue.hpp +++ b/src/dxmt/dxmt_command_queue.hpp @@ -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; } }; diff --git a/src/dxmt/dxmt_context.cpp b/src/dxmt/dxmt_context.cpp index 67f08b39..2ab8c049 100644 --- a/src/dxmt/dxmt_context.cpp +++ b/src/dxmt/dxmt_context.cpp @@ -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) @@ -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; diff --git a/src/dxmt/dxmt_occlusion_query.hpp b/src/dxmt/dxmt_occlusion_query.hpp index 253090a7..e449a7d3 100644 --- a/src/dxmt/dxmt_occlusion_query.hpp +++ b/src/dxmt/dxmt_occlusion_query.hpp @@ -115,9 +115,8 @@ 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); @@ -125,6 +124,7 @@ class VisibilityResultQuery { accumulated_value_ += *start; start++; } + seq_id_issued = seqId; } bool @@ -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 refcount_ = {0u}; }; @@ -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);