diff --git a/examples/26-occlusion/occlusion.cpp b/examples/26-occlusion/occlusion.cpp index d3b355dd1..bf97d6653 100644 --- a/examples/26-occlusion/occlusion.cpp +++ b/examples/26-occlusion/occlusion.cpp @@ -256,6 +256,10 @@ class ExampleOcclusion : public entry::AppI bgfx::dbgTextImage(5 + xx*2, 5, 1, CUBES_DIM, img + xx*2, CUBES_DIM*2); } + int32_t numPixels = 0; + bgfx::getResult(m_occlusionQueries[0], &numPixels); + bgfx::dbgTextPrintf(5, 5 + CUBES_DIM + 1, 0xf, "%d", numPixels); + // Advance to next frame. Rendering thread will be kicked to // process submitted rendering primitives. bgfx::frame(); diff --git a/include/bgfx/bgfx.h b/include/bgfx/bgfx.h index bf7e35faf..32db92827 100644 --- a/include/bgfx/bgfx.h +++ b/include/bgfx/bgfx.h @@ -879,7 +879,7 @@ namespace bgfx /// Convert index buffer for use with different primitive topologies. /// /// @param[in] _conversion Conversion type, see `TopologyConvert::Enum`. - /// @param[in] _dst Destination index buffer. If this argument it NULL + /// @param[in] _dst Destination index buffer. If this argument is NULL /// function will return number of indices after conversion. /// @param[in] _dstSize Destination index buffer in bytes. It must be /// large enough to contain output indices. If destination size is @@ -2057,11 +2057,13 @@ namespace bgfx /// Retrieve occlusion query result from previous frame. /// /// @param[in] _handle Handle to occlusion query object. + /// @param[out] _result Number of pixels that passed test. This argument + /// can be `NULL` if result of occlusion query is not needed. /// @returns Occlusion query result. /// /// @attention C99 equivalent is `bgfx_get_result`. /// - OcclusionQueryResult::Enum getResult(OcclusionQueryHandle _handle); + OcclusionQueryResult::Enum getResult(OcclusionQueryHandle _handle, int32_t* _result = NULL); /// Destroy occlusion query. /// diff --git a/include/bgfx/c99/bgfx.h b/include/bgfx/c99/bgfx.h index 6e4315d8a..d329437d3 100644 --- a/include/bgfx/c99/bgfx.h +++ b/include/bgfx/c99/bgfx.h @@ -762,7 +762,7 @@ BGFX_C_API void bgfx_destroy_uniform(bgfx_uniform_handle_t _handle); BGFX_C_API bgfx_occlusion_query_handle_t bgfx_create_occlusion_query(); /**/ -BGFX_C_API bgfx_occlusion_query_result_t bgfx_get_result(bgfx_occlusion_query_handle_t _handle); +BGFX_C_API bgfx_occlusion_query_result_t bgfx_get_result(bgfx_occlusion_query_handle_t _handle, int32_t* _result); /**/ BGFX_C_API void bgfx_destroy_occlusion_query(bgfx_occlusion_query_handle_t _handle); diff --git a/include/bgfx/c99/platform.h b/include/bgfx/c99/platform.h index 39e5ac015..78b7791a0 100644 --- a/include/bgfx/c99/platform.h +++ b/include/bgfx/c99/platform.h @@ -151,7 +151,7 @@ typedef struct bgfx_interface_vtbl void (*get_uniform_info)(bgfx_uniform_handle_t _handle, bgfx_uniform_info_t* _info); void (*destroy_uniform)(bgfx_uniform_handle_t _handle); bgfx_occlusion_query_handle_t (*create_occlusion_query)(); - bgfx_occlusion_query_result_t (*get_result)(bgfx_occlusion_query_handle_t _handle); + bgfx_occlusion_query_result_t (*get_result)(bgfx_occlusion_query_handle_t _handle, int32_t* _result); void (*destroy_occlusion_query)(bgfx_occlusion_query_handle_t _handle); void (*set_palette_color)(uint8_t _index, const float _rgba[4]); void (*set_view_name)(uint8_t _id, const char* _name); diff --git a/include/bgfx/defines.h b/include/bgfx/defines.h index 2b1614b5f..243682d1b 100644 --- a/include/bgfx/defines.h +++ b/include/bgfx/defines.h @@ -6,7 +6,7 @@ #ifndef BGFX_DEFINES_H_HEADER_GUARD #define BGFX_DEFINES_H_HEADER_GUARD -#define BGFX_API_VERSION UINT32_C(38) +#define BGFX_API_VERSION UINT32_C(39) /// #define BGFX_STATE_RGB_WRITE UINT64_C(0x0000000000000001) //!< Enable RGB write. diff --git a/src/bgfx.cpp b/src/bgfx.cpp index f699076f2..5290a9a0b 100644 --- a/src/bgfx.cpp +++ b/src/bgfx.cpp @@ -3460,11 +3460,11 @@ error: return s_ctx->createOcclusionQuery(); } - OcclusionQueryResult::Enum getResult(OcclusionQueryHandle _handle) + OcclusionQueryResult::Enum getResult(OcclusionQueryHandle _handle, int32_t* _result) { BGFX_CHECK_MAIN_THREAD(); BGFX_CHECK_CAPS(BGFX_CAPS_OCCLUSION_QUERY, "Occlusion query is not supported!"); - return s_ctx->getResult(_handle); + return s_ctx->getResult(_handle, _result); } void destroyOcclusionQuery(OcclusionQueryHandle _handle) @@ -4512,10 +4512,10 @@ BGFX_C_API bgfx_occlusion_query_handle_t bgfx_create_occlusion_query() return handle.c; } -BGFX_C_API bgfx_occlusion_query_result_t bgfx_get_result(bgfx_occlusion_query_handle_t _handle) +BGFX_C_API bgfx_occlusion_query_result_t bgfx_get_result(bgfx_occlusion_query_handle_t _handle, int32_t* _result) { union { bgfx_occlusion_query_handle_t c; bgfx::OcclusionQueryHandle cpp; } handle = { _handle }; - return bgfx_occlusion_query_result_t(bgfx::getResult(handle.cpp) ); + return bgfx_occlusion_query_result_t(bgfx::getResult(handle.cpp, _result) ); } BGFX_C_API void bgfx_destroy_occlusion_query(bgfx_occlusion_query_handle_t _handle) diff --git a/src/bgfx_p.h b/src/bgfx_p.h index 4bfbde421..dce323bd9 100644 --- a/src/bgfx_p.h +++ b/src/bgfx_p.h @@ -1833,7 +1833,7 @@ namespace bgfx Matrix4 m_view[BGFX_CONFIG_MAX_VIEWS]; Matrix4 m_proj[2][BGFX_CONFIG_MAX_VIEWS]; uint8_t m_viewFlags[BGFX_CONFIG_MAX_VIEWS]; - uint8_t m_occlusion[BGFX_CONFIG_MAX_OCCLUSION_QUERIES]; + int32_t m_occlusion[BGFX_CONFIG_MAX_OCCLUSION_QUERIES]; uint64_t m_sortKeys[BGFX_CONFIG_MAX_DRAW_CALLS+1]; RenderItemCount m_sortValues[BGFX_CONFIG_MAX_DRAW_CALLS+1]; @@ -3601,7 +3601,7 @@ namespace bgfx OcclusionQueryHandle handle = { m_occlusionQueryHandle.alloc() }; if (isValid(handle) ) { - m_submit->m_occlusion[handle.idx] = UINT8_MAX; + m_submit->m_occlusion[handle.idx] = INT32_MIN; CommandBuffer& cmdbuf = getCommandBuffer(CommandBuffer::InvalidateOcclusionQuery); cmdbuf.write(handle); @@ -3610,15 +3610,20 @@ namespace bgfx return handle; } - BGFX_API_FUNC(OcclusionQueryResult::Enum getResult(OcclusionQueryHandle _handle) ) + BGFX_API_FUNC(OcclusionQueryResult::Enum getResult(OcclusionQueryHandle _handle, int32_t* _result) ) { BGFX_CHECK_HANDLE("getResult", m_occlusionQueryHandle, _handle); switch (m_submit->m_occlusion[_handle.idx]) { case 0: return OcclusionQueryResult::Invisible; - case UINT8_MAX: return OcclusionQueryResult::NoResult; - default:; + case INT32_MIN: return OcclusionQueryResult::NoResult; + default: break; + } + + if (NULL != _result) + { + *_result = m_submit->m_occlusion[_handle.idx]; } return OcclusionQueryResult::Visible; diff --git a/src/renderer_d3d11.cpp b/src/renderer_d3d11.cpp index 5f19d7376..71fdfc487 100644 --- a/src/renderer_d3d11.cpp +++ b/src/renderer_d3d11.cpp @@ -5234,7 +5234,7 @@ BX_PRAGMA_DIAGNOSTIC_POP(); break; } - _render->m_occlusion[query.m_handle.idx] = 0 < result; + _render->m_occlusion[query.m_handle.idx] = int32_t(result); } m_control.consume(1); diff --git a/src/renderer_d3d12.cpp b/src/renderer_d3d12.cpp index a8cff30b9..9fe661ab0 100644 --- a/src/renderer_d3d12.cpp +++ b/src/renderer_d3d12.cpp @@ -4725,7 +4725,7 @@ data.NumQualityLevels = 0; OcclusionQueryHandle handle = m_handle[m_control.m_read]; if (isValid(handle) ) { - _render->m_occlusion[handle.idx] = 0 < m_result[handle.idx]; + _render->m_occlusion[handle.idx] = int32_t(m_result[handle.idx]); } m_control.consume(1); } diff --git a/src/renderer_d3d9.cpp b/src/renderer_d3d9.cpp index 2d77b19b7..4f4267be9 100644 --- a/src/renderer_d3d9.cpp +++ b/src/renderer_d3d9.cpp @@ -3583,7 +3583,7 @@ namespace bgfx { namespace d3d9 break; } - _render->m_occlusion[query.m_handle.idx] = 0 < result; + _render->m_occlusion[query.m_handle.idx] = int32_t(result); } m_control.consume(1); diff --git a/src/renderer_gl.cpp b/src/renderer_gl.cpp index 997280934..c2c801930 100644 --- a/src/renderer_gl.cpp +++ b/src/renderer_gl.cpp @@ -6145,7 +6145,7 @@ namespace bgfx { namespace gl } GL_CHECK(glGetQueryObjectiv(query.m_id, GL_QUERY_RESULT, &result) ); - _render->m_occlusion[query.m_handle.idx] = 0 < result; + _render->m_occlusion[query.m_handle.idx] = int32_t(result); } m_control.consume(1); diff --git a/src/renderer_mtl.mm b/src/renderer_mtl.mm index e45f544cc..fbfcdf287 100644 --- a/src/renderer_mtl.mm +++ b/src/renderer_mtl.mm @@ -2939,7 +2939,7 @@ namespace bgfx { namespace mtl if (isValid(query.m_handle) ) { uint64_t result = ( (uint64_t*)m_buffer.contents() )[query.m_handle.idx]; - _render->m_occlusion[query.m_handle.idx] = 0 < result; + _render->m_occlusion[query.m_handle.idx] = int32_t(result); } m_control.consume(1);