Exposed occlusion query result.

This commit is contained in:
Branimir Karadžić
2017-03-06 17:23:22 -08:00
parent bf4d092064
commit b0e13445db
12 changed files with 30 additions and 19 deletions

View File

@@ -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();

View File

@@ -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.
///

View File

@@ -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);

View File

@@ -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);

View File

@@ -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.

View File

@@ -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)

View File

@@ -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;

View File

@@ -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);

View File

@@ -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);
}

View File

@@ -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);

View File

@@ -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);

View File

@@ -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);