summaryrefslogtreecommitdiffstatshomepage
path: root/3rdparty/bgfx/examples/common/bgfx_utils.cpp
diff options
context:
space:
mode:
Diffstat (limited to '3rdparty/bgfx/examples/common/bgfx_utils.cpp')
-rw-r--r--3rdparty/bgfx/examples/common/bgfx_utils.cpp217
1 files changed, 136 insertions, 81 deletions
diff --git a/3rdparty/bgfx/examples/common/bgfx_utils.cpp b/3rdparty/bgfx/examples/common/bgfx_utils.cpp
index ed8b4431424..2ee9c0a6a1f 100644
--- a/3rdparty/bgfx/examples/common/bgfx_utils.cpp
+++ b/3rdparty/bgfx/examples/common/bgfx_utils.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright 2011-2019 Branimir Karadzic. All rights reserved.
+ * Copyright 2011-2021 Branimir Karadzic. All rights reserved.
* License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
@@ -114,9 +114,10 @@ static bgfx::ShaderHandle loadShader(bx::FileReaderI* _reader, const char* _name
case bgfx::RendererType::OpenGL: shaderPath = "shaders/glsl/"; break;
case bgfx::RendererType::OpenGLES: shaderPath = "shaders/essl/"; break;
case bgfx::RendererType::Vulkan: shaderPath = "shaders/spirv/"; break;
+ case bgfx::RendererType::WebGPU: shaderPath = "shaders/spirv/"; break;
case bgfx::RendererType::Count:
- BX_CHECK(false, "You should not be here!");
+ BX_ASSERT(false, "You should not be here!");
break;
}
@@ -355,8 +356,6 @@ void calcTangents(void* _vertices, uint16_t _numVertices, bgfx::VertexLayout _la
delete [] tangents;
}
-
-
Group::Group()
{
reset();
@@ -380,88 +379,91 @@ namespace bgfx
void Mesh::load(bx::ReaderSeekerI* _reader, bool _ramcopy)
{
-#define BGFX_CHUNK_MAGIC_VB BX_MAKEFOURCC('V', 'B', ' ', 0x1)
-#define BGFX_CHUNK_MAGIC_VBC BX_MAKEFOURCC('V', 'B', 'C', 0x0)
-#define BGFX_CHUNK_MAGIC_IB BX_MAKEFOURCC('I', 'B', ' ', 0x0)
-#define BGFX_CHUNK_MAGIC_IBC BX_MAKEFOURCC('I', 'B', 'C', 0x1)
-#define BGFX_CHUNK_MAGIC_PRI BX_MAKEFOURCC('P', 'R', 'I', 0x0)
+ constexpr uint32_t kChunkVertexBuffer = BX_MAKEFOURCC('V', 'B', ' ', 0x1);
+ constexpr uint32_t kChunkVertexBufferCompressed = BX_MAKEFOURCC('V', 'B', 'C', 0x0);
+ constexpr uint32_t kChunkIndexBuffer = BX_MAKEFOURCC('I', 'B', ' ', 0x0);
+ constexpr uint32_t kChunkIndexBufferCompressed = BX_MAKEFOURCC('I', 'B', 'C', 0x1);
+ constexpr uint32_t kChunkPrimitive = BX_MAKEFOURCC('P', 'R', 'I', 0x0);
using namespace bx;
using namespace bgfx;
-
+
Group group;
-
+
bx::AllocatorI* allocator = entry::getAllocator();
-
+
uint32_t chunk;
bx::Error err;
while (4 == bx::read(_reader, chunk, &err)
- && err.isOk() )
+ && err.isOk() )
{
switch (chunk)
{
- case BGFX_CHUNK_MAGIC_VB:
+ case kChunkVertexBuffer:
{
read(_reader, group.m_sphere);
read(_reader, group.m_aabb);
read(_reader, group.m_obb);
-
+
read(_reader, m_layout);
-
+
uint16_t stride = m_layout.getStride();
-
+
read(_reader, group.m_numVertices);
const bgfx::Memory* mem = bgfx::alloc(group.m_numVertices*stride);
read(_reader, mem->data, mem->size);
- if ( _ramcopy )
+
+ if (_ramcopy)
{
group.m_vertices = (uint8_t*)BX_ALLOC(allocator, group.m_numVertices*stride);
bx::memCopy(group.m_vertices, mem->data, mem->size);
}
+
group.m_vbh = bgfx::createVertexBuffer(mem, m_layout);
}
break;
-
- case BGFX_CHUNK_MAGIC_VBC:
+
+ case kChunkVertexBufferCompressed:
{
read(_reader, group.m_sphere);
read(_reader, group.m_aabb);
read(_reader, group.m_obb);
-
+
read(_reader, m_layout);
-
+
uint16_t stride = m_layout.getStride();
-
+
read(_reader, group.m_numVertices);
-
+
const bgfx::Memory* mem = bgfx::alloc(group.m_numVertices*stride);
-
+
uint32_t compressedSize;
bx::read(_reader, compressedSize);
-
+
void* compressedVertices = BX_ALLOC(allocator, compressedSize);
bx::read(_reader, compressedVertices, compressedSize);
-
+
meshopt_decodeVertexBuffer(mem->data, group.m_numVertices, stride, (uint8_t*)compressedVertices, compressedSize);
-
+
BX_FREE(allocator, compressedVertices);
- if ( _ramcopy )
+ if (_ramcopy)
{
group.m_vertices = (uint8_t*)BX_ALLOC(allocator, group.m_numVertices*stride);
bx::memCopy(group.m_vertices, mem->data, mem->size);
}
-
+
group.m_vbh = bgfx::createVertexBuffer(mem, m_layout);
}
break;
-
- case BGFX_CHUNK_MAGIC_IB:
+
+ case kChunkIndexBuffer:
{
read(_reader, group.m_numIndices);
const bgfx::Memory* mem = bgfx::alloc(group.m_numIndices*2);
read(_reader, mem->data, mem->size);
- if ( _ramcopy )
+
+ if (_ramcopy)
{
group.m_indices = (uint16_t*)BX_ALLOC(allocator, group.m_numIndices*2);
bx::memCopy(group.m_indices, mem->data, mem->size);
@@ -470,54 +472,54 @@ void Mesh::load(bx::ReaderSeekerI* _reader, bool _ramcopy)
group.m_ibh = bgfx::createIndexBuffer(mem);
}
break;
-
- case BGFX_CHUNK_MAGIC_IBC:
+
+ case kChunkIndexBufferCompressed:
{
bx::read(_reader, group.m_numIndices);
-
+
const bgfx::Memory* mem = bgfx::alloc(group.m_numIndices*2);
-
+
uint32_t compressedSize;
bx::read(_reader, compressedSize);
-
+
void* compressedIndices = BX_ALLOC(allocator, compressedSize);
-
+
bx::read(_reader, compressedIndices, compressedSize);
-
+
meshopt_decodeIndexBuffer(mem->data, group.m_numIndices, 2, (uint8_t*)compressedIndices, compressedSize);
-
+
BX_FREE(allocator, compressedIndices);
-
- if ( _ramcopy )
+
+ if (_ramcopy)
{
group.m_indices = (uint16_t*)BX_ALLOC(allocator, group.m_numIndices*2);
bx::memCopy(group.m_indices, mem->data, mem->size);
}
-
+
group.m_ibh = bgfx::createIndexBuffer(mem);
}
break;
-
- case BGFX_CHUNK_MAGIC_PRI:
+
+ case kChunkPrimitive:
{
uint16_t len;
read(_reader, len);
-
+
stl::string material;
material.resize(len);
read(_reader, const_cast<char*>(material.c_str() ), len);
-
+
uint16_t num;
read(_reader, num);
-
+
for (uint32_t ii = 0; ii < num; ++ii)
{
read(_reader, len);
-
+
stl::string name;
name.resize(len);
read(_reader, const_cast<char*>(name.c_str() ), len);
-
+
Primitive prim;
read(_reader, prim.m_startIndex);
read(_reader, prim.m_numIndices);
@@ -526,15 +528,15 @@ void Mesh::load(bx::ReaderSeekerI* _reader, bool _ramcopy)
read(_reader, prim.m_sphere);
read(_reader, prim.m_aabb);
read(_reader, prim.m_obb);
-
+
group.m_prims.push_back(prim);
}
-
+
m_groups.push_back(group);
group.reset();
}
break;
-
+
default:
DBG("%08x at %d", chunk, bx::skip(_reader, 0) );
break;
@@ -545,23 +547,23 @@ void Mesh::load(bx::ReaderSeekerI* _reader, bool _ramcopy)
void Mesh::unload()
{
bx::AllocatorI* allocator = entry::getAllocator();
-
+
for (GroupArray::const_iterator it = m_groups.begin(), itEnd = m_groups.end(); it != itEnd; ++it)
{
const Group& group = *it;
bgfx::destroy(group.m_vbh);
-
+
if (bgfx::isValid(group.m_ibh) )
{
bgfx::destroy(group.m_ibh);
}
-
- if ( NULL != group.m_vertices )
+
+ if (NULL != group.m_vertices)
{
BX_FREE(allocator, group.m_vertices);
}
- if ( NULL != group.m_indices )
+ if (NULL != group.m_indices)
{
BX_FREE(allocator, group.m_indices);
}
@@ -574,56 +576,62 @@ void Mesh::submit(bgfx::ViewId _id, bgfx::ProgramHandle _program, const float* _
if (BGFX_STATE_MASK == _state)
{
_state = 0
- | BGFX_STATE_WRITE_RGB
- | BGFX_STATE_WRITE_A
- | BGFX_STATE_WRITE_Z
- | BGFX_STATE_DEPTH_TEST_LESS
- | BGFX_STATE_CULL_CCW
- | BGFX_STATE_MSAA
- ;
+ | BGFX_STATE_WRITE_RGB
+ | BGFX_STATE_WRITE_A
+ | BGFX_STATE_WRITE_Z
+ | BGFX_STATE_DEPTH_TEST_LESS
+ | BGFX_STATE_CULL_CCW
+ | BGFX_STATE_MSAA
+ ;
}
-
+
bgfx::setTransform(_mtx);
bgfx::setState(_state);
-
+
for (GroupArray::const_iterator it = m_groups.begin(), itEnd = m_groups.end(); it != itEnd; ++it)
{
const Group& group = *it;
-
+
bgfx::setIndexBuffer(group.m_ibh);
bgfx::setVertexBuffer(0, group.m_vbh);
- bgfx::submit(_id, _program, 0, it != itEnd-1);
+ bgfx::submit(_id, _program, 0, (it == itEnd-1) ? (BGFX_DISCARD_INDEX_BUFFER | BGFX_DISCARD_VERTEX_STREAMS | BGFX_DISCARD_STATE) : BGFX_DISCARD_NONE);
}
}
void Mesh::submit(const MeshState*const* _state, uint8_t _numPasses, const float* _mtx, uint16_t _numMatrices) const
{
uint32_t cached = bgfx::setTransform(_mtx, _numMatrices);
-
+
for (uint32_t pass = 0; pass < _numPasses; ++pass)
{
bgfx::setTransform(cached, _numMatrices);
-
+
const MeshState& state = *_state[pass];
bgfx::setState(state.m_state);
-
+
for (uint8_t tex = 0; tex < state.m_numTextures; ++tex)
{
const MeshState::Texture& texture = state.m_textures[tex];
- bgfx::setTexture(texture.m_stage
- , texture.m_sampler
- , texture.m_texture
- , texture.m_flags
- );
+ bgfx::setTexture(
+ texture.m_stage
+ , texture.m_sampler
+ , texture.m_texture
+ , texture.m_flags
+ );
}
-
+
for (GroupArray::const_iterator it = m_groups.begin(), itEnd = m_groups.end(); it != itEnd; ++it)
{
const Group& group = *it;
-
+
bgfx::setIndexBuffer(group.m_ibh);
bgfx::setVertexBuffer(0, group.m_vbh);
- bgfx::submit(state.m_viewId, state.m_program, 0, it != itEnd-1);
+ bgfx::submit(
+ state.m_viewId
+ , state.m_program
+ , 0
+ , (it == itEnd - 1) ? (BGFX_DISCARD_INDEX_BUFFER | BGFX_DISCARD_VERTEX_STREAMS | BGFX_DISCARD_STATE) : BGFX_DISCARD_NONE
+ );
}
}
}
@@ -675,6 +683,53 @@ void meshSubmit(const Mesh* _mesh, const MeshState*const* _state, uint8_t _numPa
_mesh->submit(_state, _numPasses, _mtx, _numMatrices);
}
+struct RendererTypeRemap
+{
+ bx::StringView name;
+ bgfx::RendererType::Enum type;
+};
+
+static RendererTypeRemap s_rendererTypeRemap[] =
+{
+ { "d3d11", bgfx::RendererType::Direct3D11 },
+ { "d3d12", bgfx::RendererType::Direct3D12 },
+ { "d3d9", bgfx::RendererType::Direct3D9 },
+ { "gl", bgfx::RendererType::OpenGL },
+ { "mtl", bgfx::RendererType::Metal },
+ { "noop", bgfx::RendererType::Noop },
+ { "vk", bgfx::RendererType::Vulkan },
+};
+
+bx::StringView getName(bgfx::RendererType::Enum _type)
+{
+ for (uint32_t ii = 0; ii < BX_COUNTOF(s_rendererTypeRemap); ++ii)
+ {
+ const RendererTypeRemap& remap = s_rendererTypeRemap[ii];
+
+ if (_type == remap.type)
+ {
+ return remap.name;
+ }
+ }
+
+ return "";
+}
+
+bgfx::RendererType::Enum getType(const bx::StringView& _name)
+{
+ for (uint32_t ii = 0; ii < BX_COUNTOF(s_rendererTypeRemap); ++ii)
+ {
+ const RendererTypeRemap& remap = s_rendererTypeRemap[ii];
+
+ if (0 == bx::strCmpI(_name, remap.name) )
+ {
+ return remap.type;
+ }
+ }
+
+ return bgfx::RendererType::Count;
+}
+
Args::Args(int _argc, const char* const* _argv)
: m_type(bgfx::RendererType::Count)
, m_pciId(BGFX_PCI_ID_NONE)