Last active
August 16, 2017 09:15
-
-
Save jazzbre/2fc247fae68377876a418be3dffc361b to your computer and use it in GitHub Desktop.
bgfx metal bad performance patch
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
* Copyright 2011-2017 Branimir Karadzic. All rights reserved. | |
* License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause | |
*/ | |
#include "common.h" | |
#include "bgfx_utils.h" | |
#include "imgui/imgui.h" | |
namespace | |
{ | |
struct PosColorVertex | |
{ | |
float m_x; | |
float m_y; | |
float m_z; | |
uint32_t m_abgr; | |
static void init() | |
{ | |
ms_decl | |
.begin() | |
.add(bgfx::Attrib::Position, 3, bgfx::AttribType::Float) | |
.add(bgfx::Attrib::Color0, 4, bgfx::AttribType::Uint8, true) | |
.end(); | |
}; | |
static bgfx::VertexDecl ms_decl; | |
}; | |
bgfx::VertexDecl PosColorVertex::ms_decl; | |
static PosColorVertex s_cubeVertices[] = | |
{ | |
{-2.0f, 1.0f, 1.0f, 0x1f000000 }, | |
{ 2.0f, 1.0f, 1.0f, 0x1f0000ff }, | |
{-2.0f, -1.0f, 1.0f, 0x1f00ff00 }, | |
{ 2.0f, -1.0f, 1.0f, 0x1f00ffff }, | |
{-2.0f, 1.0f, -1.0f, 0x1fff0000 }, | |
{ 2.0f, 1.0f, -1.0f, 0x1fff00ff }, | |
{-2.0f, -1.0f, -1.0f, 0x1fffff00 }, | |
{ 2.0f, -1.0f, -1.0f, 0x1fffffff }, | |
}; | |
static const uint16_t s_cubeTriStrip[] = | |
{ | |
0, 1, 2, | |
3, | |
7, | |
1, | |
5, | |
0, | |
4, | |
2, | |
6, | |
7, | |
4, | |
5, | |
}; | |
class ExampleCubes : public entry::AppI | |
{ | |
public: | |
ExampleCubes(const char* _name, const char* _description) | |
: entry::AppI(_name, _description) | |
{ | |
} | |
void init(int32_t _argc, const char* const* _argv, uint32_t _width, uint32_t _height) override | |
{ | |
Args args(_argc, _argv); | |
m_debug = BGFX_DEBUG_NONE; | |
m_reset = BGFX_RESET_VSYNC; | |
// bgfx::init(bgfx::RendererType::OpenGLES); // Uncomment for OpenGLES -> be sure to comment line 17 in entry_ios.mm | |
bgfx::init(bgfx::RendererType::Metal); // Uncomment for Metal -> be sure to uncomment line 17 in entry_ios.mm | |
bgfx::reset(m_width, m_height, m_reset); | |
// Enable debug text. | |
bgfx::setDebug(m_debug); | |
// Set view 0 clear state. | |
bgfx::setViewClear(0 | |
, BGFX_CLEAR_COLOR|BGFX_CLEAR_DEPTH | |
, 0x303030ff | |
, 1.0f | |
, 0 | |
); | |
// Create vertex stream declaration. | |
PosColorVertex::init(); | |
// Create static vertex buffer. | |
m_vbh = bgfx::createVertexBuffer( | |
// Static data can be passed with bgfx::makeRef | |
bgfx::makeRef(s_cubeVertices, sizeof(s_cubeVertices) ) | |
, PosColorVertex::ms_decl | |
); | |
// Create static index buffer. | |
m_ibh = bgfx::createIndexBuffer( | |
// Static data can be passed with bgfx::makeRef | |
bgfx::makeRef(s_cubeTriStrip, sizeof(s_cubeTriStrip) ) | |
); | |
// Create program from shaders. | |
m_program = loadProgram("vs_cubes", "fs_cubes"); | |
m_timeOffset = bx::getHPCounter(); | |
imguiCreate(); | |
} | |
virtual int shutdown() override | |
{ | |
imguiDestroy(); | |
// Cleanup. | |
bgfx::destroy(m_ibh); | |
bgfx::destroy(m_vbh); | |
bgfx::destroy(m_program); | |
// Shutdown bgfx. | |
bgfx::shutdown(); | |
return 0; | |
} | |
bool update() override | |
{ | |
if (!entry::processEvents(m_width, m_height, m_debug, m_reset, &m_mouseState) ) | |
{ | |
float at[3] = { 0.0f, 0.0f, 0.0f }; | |
float eye[3] = { 0.0f, 0.0f, -2.0f }; | |
float view[16]; | |
bx::mtxLookAt(view, eye, at); | |
float proj[16]; | |
bx::mtxProj(proj, 60.0f, float(m_width)/float(m_height), 0.1f, 100.0f, bgfx::getCaps()->homogeneousDepth); | |
bgfx::setViewTransform(0, view, proj); | |
// Set view 0 default viewport. | |
bgfx::setViewRect(0, 0, 0, uint16_t(m_width), uint16_t(m_height) ); | |
// This dummy draw call is here to make sure that view 0 is cleared | |
// if no other draw calls are submitted to view 0. | |
bgfx::touch(0); | |
for(int pass = 0;pass<16;++pass) { | |
float mtx[16]; | |
bx::mtxIdentity(mtx); | |
// Set model matrix for rendering. | |
bgfx::setTransform(mtx); | |
// Set vertex and index buffer. | |
bgfx::setVertexBuffer(0, m_vbh); | |
bgfx::setIndexBuffer(m_ibh); | |
// Set render states. | |
bgfx::setState(0 | |
| BGFX_STATE_RGB_WRITE | |
| BGFX_STATE_ALPHA_WRITE | |
| BGFX_STATE_DEPTH_TEST_LESS | |
| BGFX_STATE_CULL_CW | |
| BGFX_STATE_PT_TRISTRIP | |
| BGFX_STATE_BLEND_FUNC(BGFX_STATE_BLEND_SRC_ALPHA, BGFX_STATE_BLEND_INV_SRC_ALPHA) | |
); | |
// Submit primitive for rendering to view 0. | |
bgfx::submit(0, m_program); | |
} | |
// Advance to next frame. Rendering thread will be kicked to | |
// process submitted rendering primitives. | |
bgfx::frame(); | |
return true; | |
} | |
return false; | |
} | |
entry::MouseState m_mouseState; | |
uint32_t m_width; | |
uint32_t m_height; | |
uint32_t m_debug; | |
uint32_t m_reset; | |
bgfx::VertexBufferHandle m_vbh; | |
bgfx::IndexBufferHandle m_ibh; | |
bgfx::ProgramHandle m_program; | |
int64_t m_timeOffset; | |
}; | |
} // namespace | |
ENTRY_IMPLEMENT_MAIN(ExampleCubes, "01-cube", "Rendering simple static mesh."); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment