diff --git a/src/renderer_d3d12.cpp b/src/renderer_d3d12.cpp index 3a11b2a8..b253315f 100644 --- a/src/renderer_d3d12.cpp +++ b/src/renderer_d3d12.cpp @@ -2389,7 +2389,6 @@ data.NumQualityLevels = 0; bool isVisible(Frame* _render, OcclusionQueryHandle _handle, bool _visible) { - m_occlusionQuery.resolve(_render); return _visible == (0 != _render->m_occlusion[_handle.idx]); } @@ -4333,7 +4332,7 @@ data.NumQualityLevels = 0; void OcclusionQueryD3D12::init() { D3D12_QUERY_HEAP_DESC queryHeapDesc; - queryHeapDesc.Count = BX_COUNTOF(m_query); + queryHeapDesc.Count = BX_COUNTOF(m_handle); queryHeapDesc.NodeMask = 1; queryHeapDesc.Type = D3D12_QUERY_HEAP_TYPE_OCCLUSION; DX_CHECK(s_renderD3D12->m_device->CreateQueryHeap(&queryHeapDesc @@ -4343,10 +4342,10 @@ data.NumQualityLevels = 0; m_readback = createCommittedResource(s_renderD3D12->m_device , HeapProperty::ReadBack - , BX_COUNTOF(m_query)*sizeof(uint64_t) + , BX_COUNTOF(m_handle)*sizeof(uint64_t) ); - D3D12_RANGE range = { 0, BX_COUNTOF(m_query) }; + D3D12_RANGE range = { 0, BX_COUNTOF(m_handle) }; m_readback->Map(0, &range, (void**)&m_result); } @@ -4363,11 +4362,12 @@ data.NumQualityLevels = 0; { while (0 == m_control.reserve(1) ) { - resolve(_render); + OcclusionQueryHandle handle = m_handle[m_control.m_read]; + _render->m_occlusion[handle.idx] = 0 < m_result[handle.idx]; + m_control.consume(1); } - Query& query = m_query[m_control.m_current]; - query.m_handle = _handle; + m_handle[m_control.m_current] = _handle; _commandList->BeginQuery(m_queryHeap , D3D12_QUERY_TYPE_BINARY_OCCLUSION , _handle.idx @@ -4376,32 +4376,21 @@ data.NumQualityLevels = 0; void OcclusionQueryD3D12::end(ID3D12GraphicsCommandList* _commandList) { - Query& query = m_query[m_control.m_current]; + OcclusionQueryHandle handle = m_handle[m_control.m_current]; _commandList->EndQuery(m_queryHeap , D3D12_QUERY_TYPE_BINARY_OCCLUSION - , query.m_handle.idx + , handle.idx ); _commandList->ResolveQueryData(m_queryHeap , D3D12_QUERY_TYPE_BINARY_OCCLUSION - , query.m_handle.idx + , handle.idx , 1 , m_readback - , query.m_handle.idx * sizeof(uint64_t) + , handle.idx * sizeof(uint64_t) ); m_control.commit(1); } - void OcclusionQueryD3D12::resolve(Frame* _render) - { - while (0 != m_control.available() ) - { - Query& query = m_query[m_control.m_read]; - - _render->m_occlusion[query.m_handle.idx] = 0 < m_result[query.m_handle.idx]; - m_control.consume(1); - } - } - struct Bind { D3D12_GPU_DESCRIPTOR_HANDLE m_srvHandle; @@ -4497,8 +4486,6 @@ data.NumQualityLevels = 0; , D3D12_RESOURCE_STATE_RENDER_TARGET ); - m_occlusionQuery.resolve(_render); - if (0 == (_render->m_debug&BGFX_DEBUG_IFH) ) { m_batch.begin(); diff --git a/src/renderer_d3d12.h b/src/renderer_d3d12.h index 8704c518..50d492a4 100644 --- a/src/renderer_d3d12.h +++ b/src/renderer_d3d12.h @@ -435,7 +435,7 @@ namespace bgfx { namespace d3d12 struct OcclusionQueryD3D12 { OcclusionQueryD3D12() - : m_control(BX_COUNTOF(m_query) ) + : m_control(BX_COUNTOF(m_handle) ) { } @@ -443,16 +443,10 @@ namespace bgfx { namespace d3d12 void shutdown(); void begin(ID3D12GraphicsCommandList* _commandList, Frame* _render, OcclusionQueryHandle _handle); void end(ID3D12GraphicsCommandList* _commandList); - void resolve(Frame* _render); - - struct Query - { - OcclusionQueryHandle m_handle; - }; ID3D12Resource* m_readback; ID3D12QueryHeap* m_queryHeap; - Query m_query[BGFX_CONFIG_MAX_OCCUSION_QUERIES]; + OcclusionQueryHandle m_handle[BGFX_CONFIG_MAX_OCCUSION_QUERIES]; uint64_t* m_result; bx::RingBufferControl m_control; };