mirror of
https://github.com/bkaradzic/bgfx.git
synced 2026-02-19 21:42:59 +01:00
Added ability to retrieve uniform info.
This commit is contained in:
@@ -641,6 +641,17 @@ namespace bgfx
|
||||
bool cubeMap; //!< Texture is cubemap.
|
||||
};
|
||||
|
||||
/// Uniform info.
|
||||
///
|
||||
/// @attention C99 equivalent is `bgfx_uniform_info_t`.
|
||||
///
|
||||
struct UniformInfo
|
||||
{
|
||||
char name[256]; //!< Uniform name.
|
||||
UniformType::Enum type; //!< Uniform type.
|
||||
uint16_t num; //!< Number of elements in array.
|
||||
};
|
||||
|
||||
/// Frame buffer texture attachemnt info.
|
||||
///
|
||||
/// @attention C99 equivalent is `bgfx_attachment_t`.
|
||||
@@ -1986,6 +1997,15 @@ namespace bgfx
|
||||
///
|
||||
UniformHandle createUniform(const char* _name, UniformType::Enum _type, uint16_t _num = 1);
|
||||
|
||||
/// Retrieve uniform info.
|
||||
///
|
||||
/// @param[in] _handle Handle to uniform object.
|
||||
/// @param[out] _info Uniform info.
|
||||
///
|
||||
/// @attention C99 equivalent is `bgfx_get_uniform_info`.
|
||||
///
|
||||
void getUniformInfo(UniformHandle _handle, UniformInfo& _info);
|
||||
|
||||
/// Destroy shader uniform parameter.
|
||||
///
|
||||
/// @param[in] _handle Handle to uniform object.
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
#ifndef BGFX_DEFINES_H_HEADER_GUARD
|
||||
#define BGFX_DEFINES_H_HEADER_GUARD
|
||||
|
||||
#define BGFX_API_VERSION UINT32_C(28)
|
||||
#define BGFX_API_VERSION UINT32_C(29)
|
||||
|
||||
///
|
||||
#define BGFX_STATE_RGB_WRITE UINT64_C(0x0000000000000001) //!< Enable RGB write.
|
||||
|
||||
@@ -390,6 +390,15 @@ typedef struct bgfx_texture_info
|
||||
|
||||
} bgfx_texture_info_t;
|
||||
|
||||
/**/
|
||||
typedef struct bgfx_uniform_info
|
||||
{
|
||||
char name[256];
|
||||
bgfx_uniform_type_t type;
|
||||
uint16_t num;
|
||||
|
||||
} bgfx_uniform_info_t;
|
||||
|
||||
/**/
|
||||
typedef struct bgfx_attachment
|
||||
{
|
||||
|
||||
@@ -147,6 +147,7 @@ typedef struct bgfx_interface_vtbl
|
||||
bgfx_frame_buffer_handle_t (*create_frame_buffer_from_nwh)(void* _nwh, uint16_t _width, uint16_t _height, bgfx_texture_format_t _depthFormat);
|
||||
void (*destroy_frame_buffer)(bgfx_frame_buffer_handle_t _handle);
|
||||
bgfx_uniform_handle_t (*create_uniform)(const char* _name, bgfx_uniform_type_t _type, uint16_t _num);
|
||||
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);
|
||||
|
||||
15
src/bgfx.cpp
15
src/bgfx.cpp
@@ -3290,6 +3290,12 @@ error:
|
||||
return s_ctx->createUniform(_name, _type, _num);
|
||||
}
|
||||
|
||||
void getUniformInfo(UniformHandle _handle, UniformInfo& _info)
|
||||
{
|
||||
BGFX_CHECK_MAIN_THREAD();
|
||||
s_ctx->getUniformInfo(_handle, _info);
|
||||
}
|
||||
|
||||
void destroyUniform(UniformHandle _handle)
|
||||
{
|
||||
BGFX_CHECK_MAIN_THREAD();
|
||||
@@ -3788,6 +3794,7 @@ BGFX_C99_STRUCT_SIZE_CHECK(bgfx::TransientIndexBuffer, bgfx_transient_index_buf
|
||||
BGFX_C99_STRUCT_SIZE_CHECK(bgfx::TransientVertexBuffer, bgfx_transient_vertex_buffer_t);
|
||||
BGFX_C99_STRUCT_SIZE_CHECK(bgfx::InstanceDataBuffer, bgfx_instance_data_buffer_t);
|
||||
BGFX_C99_STRUCT_SIZE_CHECK(bgfx::TextureInfo, bgfx_texture_info_t);
|
||||
BGFX_C99_STRUCT_SIZE_CHECK(bgfx::UniformInfo, bgfx_uniform_info_t);
|
||||
BGFX_C99_STRUCT_SIZE_CHECK(bgfx::Attachment, bgfx_attachment_t);
|
||||
BGFX_C99_STRUCT_SIZE_CHECK(bgfx::Caps::GPU, bgfx_caps_gpu_t);
|
||||
BGFX_C99_STRUCT_SIZE_CHECK(bgfx::Caps::Limits, bgfx_caps_limits_t);
|
||||
@@ -4358,6 +4365,13 @@ BGFX_C_API bgfx_uniform_handle_t bgfx_create_uniform(const char* _name, bgfx_uni
|
||||
return handle.c;
|
||||
}
|
||||
|
||||
BGFX_C_API void bgfx_get_uniform_info(bgfx_uniform_handle_t _handle, bgfx_uniform_info_t* _info)
|
||||
{
|
||||
union { bgfx_uniform_handle_t c; bgfx::UniformHandle cpp; } handle = { _handle };
|
||||
bgfx::UniformInfo& info = *(bgfx::UniformInfo*)_info;
|
||||
bgfx::getUniformInfo(handle.cpp, info);
|
||||
}
|
||||
|
||||
BGFX_C_API void bgfx_destroy_uniform(bgfx_uniform_handle_t _handle)
|
||||
{
|
||||
union { bgfx_uniform_handle_t c; bgfx::UniformHandle cpp; } handle = { _handle };
|
||||
@@ -4786,6 +4800,7 @@ BGFX_C_API bgfx_interface_vtbl_t* bgfx_get_interface(uint32_t _version)
|
||||
BGFX_IMPORT_FUNC(create_frame_buffer_from_nwh) \
|
||||
BGFX_IMPORT_FUNC(destroy_frame_buffer) \
|
||||
BGFX_IMPORT_FUNC(create_uniform) \
|
||||
BGFX_IMPORT_FUNC(get_uniform_info) \
|
||||
BGFX_IMPORT_FUNC(destroy_uniform) \
|
||||
BGFX_IMPORT_FUNC(create_occlusion_query) \
|
||||
BGFX_IMPORT_FUNC(get_result) \
|
||||
|
||||
20
src/bgfx_p.h
20
src/bgfx_p.h
@@ -1127,7 +1127,7 @@ namespace bgfx
|
||||
char m_buffer[8];
|
||||
};
|
||||
|
||||
struct UniformInfo
|
||||
struct UniformRegInfo
|
||||
{
|
||||
const void* m_data;
|
||||
UniformHandle m_handle;
|
||||
@@ -1144,7 +1144,7 @@ namespace bgfx
|
||||
{
|
||||
}
|
||||
|
||||
const UniformInfo* find(const char* _name) const
|
||||
const UniformRegInfo* find(const char* _name) const
|
||||
{
|
||||
uint16_t handle = m_uniforms.find(bx::hashMurmur2A(_name) );
|
||||
if (UniformHashMap::invalid != handle)
|
||||
@@ -1155,14 +1155,14 @@ namespace bgfx
|
||||
return NULL;
|
||||
}
|
||||
|
||||
const UniformInfo& add(UniformHandle _handle, const char* _name, const void* _data)
|
||||
const UniformRegInfo& add(UniformHandle _handle, const char* _name, const void* _data)
|
||||
{
|
||||
BX_CHECK(isValid(_handle), "Uniform handle is invalid (name: %s)!", _name);
|
||||
const uint32_t key = bx::hashMurmur2A(_name);
|
||||
m_uniforms.removeByKey(key);
|
||||
m_uniforms.insert(key, _handle.idx);
|
||||
|
||||
UniformInfo& info = m_info[_handle.idx];
|
||||
UniformRegInfo& info = m_info[_handle.idx];
|
||||
info.m_data = _data;
|
||||
info.m_handle = _handle;
|
||||
|
||||
@@ -1177,7 +1177,7 @@ namespace bgfx
|
||||
private:
|
||||
typedef bx::HandleHashMapT<BGFX_CONFIG_MAX_UNIFORMS*2> UniformHashMap;
|
||||
UniformHashMap m_uniforms;
|
||||
UniformInfo m_info[BGFX_CONFIG_MAX_UNIFORMS];
|
||||
UniformRegInfo m_info[BGFX_CONFIG_MAX_UNIFORMS];
|
||||
};
|
||||
|
||||
struct Binding
|
||||
@@ -3490,6 +3490,16 @@ namespace bgfx
|
||||
return handle;
|
||||
}
|
||||
|
||||
BGFX_API_FUNC(void getUniformInfo(UniformHandle _handle, UniformInfo& _info) )
|
||||
{
|
||||
BGFX_CHECK_HANDLE("getUniformInfo", m_uniformHandle, _handle);
|
||||
|
||||
UniformRef& uniform = m_uniformRef[_handle.idx];
|
||||
bx::strlcpy(_info.name, uniform.m_name.getPtr(), sizeof(_info.name) );
|
||||
_info.type = uniform.m_type;
|
||||
_info.num = uniform.m_num;
|
||||
}
|
||||
|
||||
BGFX_API_FUNC(void destroyUniform(UniformHandle _handle) )
|
||||
{
|
||||
BGFX_CHECK_HANDLE("destroyUniform", m_uniformHandle, _handle);
|
||||
|
||||
@@ -4207,7 +4207,7 @@ BX_PRAGMA_DIAGNOSTIC_POP();
|
||||
}
|
||||
else if (0 == (BGFX_UNIFORM_SAMPLERBIT & type) )
|
||||
{
|
||||
const UniformInfo* info = s_renderD3D11->m_uniformReg.find(name);
|
||||
const UniformRegInfo* info = s_renderD3D11->m_uniformReg.find(name);
|
||||
BX_WARN(NULL != info, "User defined uniform '%s' is not found, it won't be set.", name);
|
||||
|
||||
if (NULL != info)
|
||||
|
||||
@@ -3880,7 +3880,7 @@ data.NumQualityLevels = 0;
|
||||
}
|
||||
else if (0 == (BGFX_UNIFORM_SAMPLERBIT & type) )
|
||||
{
|
||||
const UniformInfo* info = s_renderD3D12->m_uniformReg.find(name);
|
||||
const UniformRegInfo* info = s_renderD3D12->m_uniformReg.find(name);
|
||||
BX_WARN(NULL != info, "User defined uniform '%s' is not found, it won't be set.", name);
|
||||
|
||||
if (NULL != info)
|
||||
|
||||
@@ -2427,7 +2427,7 @@ namespace bgfx { namespace d3d9
|
||||
}
|
||||
else if (0 == (BGFX_UNIFORM_SAMPLERBIT & type) )
|
||||
{
|
||||
const UniformInfo* info = s_renderD3D9->m_uniformReg.find(name);
|
||||
const UniformRegInfo* info = s_renderD3D9->m_uniformReg.find(name);
|
||||
BX_WARN(NULL != info, "User defined uniform '%s' is not found, it won't be set.", name);
|
||||
|
||||
if (NULL != info)
|
||||
|
||||
@@ -4161,7 +4161,7 @@ namespace bgfx { namespace gl
|
||||
}
|
||||
else
|
||||
{
|
||||
const UniformInfo* info = s_renderGL->m_uniformReg.find(name);
|
||||
const UniformRegInfo* info = s_renderGL->m_uniformReg.find(name);
|
||||
BX_WARN(NULL != info, "User defined uniform '%s' is not found, it won't be set.", name);
|
||||
|
||||
if (NULL != info)
|
||||
|
||||
@@ -2285,7 +2285,7 @@ namespace bgfx { namespace mtl
|
||||
}
|
||||
else
|
||||
{
|
||||
const UniformInfo* info = s_renderMtl->m_uniformReg.find(name);
|
||||
const UniformRegInfo* info = s_renderMtl->m_uniformReg.find(name);
|
||||
BX_WARN(NULL != info, "User defined uniform '%s' is not found, it won't be set.", name);
|
||||
|
||||
if (NULL != info)
|
||||
|
||||
Reference in New Issue
Block a user