diff options
Diffstat (limited to '3rdparty/bgfx/examples/common/bgfx_utils.cpp')
-rw-r--r-- | 3rdparty/bgfx/examples/common/bgfx_utils.cpp | 217 |
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) |