mirror of
https://github.com/bkaradzic/bgfx.git
synced 2026-02-17 20:52:36 +01:00
Exposed occlusion query result.
This commit is contained in:
@@ -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();
|
||||
|
||||
@@ -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.
|
||||
///
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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)
|
||||
|
||||
15
src/bgfx_p.h
15
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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user