diff options
Diffstat (limited to '3rdparty/bgfx/src/bgfx.cpp')
-rw-r--r-- | 3rdparty/bgfx/src/bgfx.cpp | 153 |
1 files changed, 105 insertions, 48 deletions
diff --git a/3rdparty/bgfx/src/bgfx.cpp b/3rdparty/bgfx/src/bgfx.cpp index 833c4ec6fb0..55a41dfb74f 100644 --- a/3rdparty/bgfx/src/bgfx.cpp +++ b/3rdparty/bgfx/src/bgfx.cpp @@ -278,25 +278,6 @@ namespace bgfx g_callback->fatal(_code, temp); } - void mtxOrtho(float* _result, float _left, float _right, float _bottom, float _top, float _near, float _far) - { - const float aa = 2.0f/(_right - _left); - const float bb = 2.0f/(_top - _bottom); - const float cc = 1.0f/(_far - _near); - const float dd = (_left + _right)/(_left - _right); - const float ee = (_top + _bottom)/(_bottom - _top); - const float ff = _near / (_near - _far); - - memset(_result, 0, sizeof(float)*16); - _result[0] = aa; - _result[5] = bb; - _result[10] = cc; - _result[12] = dd; - _result[13] = ee; - _result[14] = ff; - _result[15] = 1.0f; - } - #include "charset.h" void charsetFillTexture(const uint8_t* _charset, uint8_t* _rgba, uint32_t _height, uint32_t _pitch, uint32_t _bpp) @@ -640,7 +621,7 @@ namespace bgfx } } - const char* s_uniformTypeName[UniformType::Count] = + const char* s_uniformTypeName[] = { "int", "float", @@ -653,9 +634,11 @@ namespace bgfx "mat3", "mat4", }; + BX_STATIC_ASSERT(UniformType::Count == BX_COUNTOF(s_uniformTypeName) ); const char* getUniformTypeName(UniformType::Enum _enum) { + BX_CHECK(_enum < UniformType::Count, "%d < UniformType::Count %d", _enum, UniformType::Count); return s_uniformTypeName[_enum]; } @@ -887,6 +870,7 @@ namespace bgfx CAPS_FLAGS(BGFX_CAPS_FRAGMENT_ORDERING), CAPS_FLAGS(BGFX_CAPS_SWAP_CHAIN), CAPS_FLAGS(BGFX_CAPS_HMD), + CAPS_FLAGS(BGFX_CAPS_INDEX32), #undef CAPS_FLAGS }; @@ -940,6 +924,8 @@ namespace bgfx TextureFormat::ETC2A1, TextureFormat::PTC14, TextureFormat::PTC14A, + TextureFormat::BGRA8, // GL doesn't support BGRA8 without extensions. + TextureFormat::RGBA8, // D3D9 doesn't support RGBA8 }; void Context::init(RendererType::Enum _type) @@ -948,14 +934,13 @@ namespace bgfx m_exit = false; m_frames = 0; - m_render = &m_frame[0]; - m_submit = &m_frame[1]; m_debug = BGFX_DEBUG_NONE; m_submit->create(); - m_render->create(); #if BGFX_CONFIG_MULTITHREADED + m_render->create(); + if (s_renderFrameCalled) { // When bgfx::renderFrame is called before init render thread @@ -1043,9 +1028,12 @@ namespace bgfx m_clearQuad.shutdown(); frame(); - destroyTransientVertexBuffer(m_submit->m_transientVb); - destroyTransientIndexBuffer(m_submit->m_transientIb); - frame(); + if (BX_ENABLED(BGFX_CONFIG_MULTITHREADED) ) + { + destroyTransientVertexBuffer(m_submit->m_transientVb); + destroyTransientIndexBuffer(m_submit->m_transientIb); + frame(); + } frame(); // If any VertexDecls needs to be destroyed. @@ -1068,10 +1056,11 @@ namespace bgfx { m_thread.shutdown(); } + + m_render->destroy(); #endif // BGFX_CONFIG_MULTITHREADED m_submit->destroy(); - m_render->destroy(); if (BX_ENABLED(BGFX_CONFIG_DEBUG) ) { @@ -1173,10 +1162,6 @@ namespace bgfx // release render thread gameSemPost(); - -#if !BGFX_CONFIG_MULTITHREADED - renderFrame(); -#endif // BGFX_CONFIG_MULTITHREADED } void Context::swap() @@ -1200,9 +1185,12 @@ namespace bgfx } m_submit->finish(); - Frame* temp = m_render; - m_render = m_submit; - m_submit = temp; + bx::xchg(m_render, m_submit); + + if (!BX_ENABLED(BGFX_CONFIG_MULTITHREADED) ) + { + renderFrame(); + } m_frames++; m_submit->start(); @@ -1219,9 +1207,10 @@ namespace bgfx bool Context::renderFrame() { - if (m_rendererInitialized) + if (m_rendererInitialized + && !m_flipAfterRender) { - m_renderCtx->flip(); + m_renderCtx->flip(m_render->m_hmd); } gameSemWait(); @@ -1235,6 +1224,12 @@ namespace bgfx renderSemPost(); + if (m_rendererInitialized + && m_flipAfterRender) + { + m_renderCtx->flip(m_render->m_hmd); + } + return m_exit; } @@ -1844,6 +1839,21 @@ again: } break; + case CommandBuffer::ResizeTexture: + { + TextureHandle handle; + _cmdbuf.read(handle); + + uint16_t width; + _cmdbuf.read(width); + + uint16_t height; + _cmdbuf.read(height); + + m_renderCtx->resizeTexture(handle, width, height); + } + break; + case CommandBuffer::DestroyTexture: { TextureHandle handle; @@ -2426,10 +2436,28 @@ again: { BGFX_CHECK_MAIN_THREAD(); BX_CHECK(NULL != _mem, "_mem can't be NULL"); - return s_ctx->createTexture(_mem, _flags, _skip, _info); + return s_ctx->createTexture(_mem, _flags, _skip, _info, BackbufferRatio::None); } - TextureHandle createTexture2D(uint16_t _width, uint16_t _height, uint8_t _numMips, TextureFormat::Enum _format, uint32_t _flags, const Memory* _mem) + void getTextureSizeFromRatio(BackbufferRatio::Enum _ratio, uint16_t& _width, uint16_t& _height) + { + switch (_ratio) + { + case BackbufferRatio::Half: _width /= 2; _height /= 2; break; + case BackbufferRatio::Quarter: _width /= 4; _height /= 4; break; + case BackbufferRatio::Eighth: _width /= 8; _height /= 8; break; + case BackbufferRatio::Sixteenth: _width /= 16; _height /= 16; break; + case BackbufferRatio::Double: _width *= 2; _height *= 2; break; + + default: + break; + } + + _width = bx::uint16_max(1, _width); + _height = bx::uint16_max(1, _height); + } + + TextureHandle createTexture2D(BackbufferRatio::Enum _ratio, uint16_t _width, uint16_t _height, uint8_t _numMips, TextureFormat::Enum _format, uint32_t _flags, const Memory* _mem) { BGFX_CHECK_MAIN_THREAD(); @@ -2454,19 +2482,36 @@ again: uint32_t magic = BGFX_CHUNK_MAGIC_TEX; bx::write(&writer, magic); + if (BackbufferRatio::None != _ratio) + { + _width = uint16_t(s_ctx->m_frame->m_resolution.m_width); + _height = uint16_t(s_ctx->m_frame->m_resolution.m_height); + getTextureSizeFromRatio(_ratio, _width, _height); + } + TextureCreate tc; - tc.m_flags = _flags; - tc.m_width = _width; - tc.m_height = _height; - tc.m_sides = 0; - tc.m_depth = 0; + tc.m_flags = _flags; + tc.m_width = _width; + tc.m_height = _height; + tc.m_sides = 0; + tc.m_depth = 0; tc.m_numMips = _numMips; - tc.m_format = uint8_t(_format); + tc.m_format = uint8_t(_format); tc.m_cubeMap = false; - tc.m_mem = _mem; + tc.m_mem = _mem; bx::write(&writer, tc); - return s_ctx->createTexture(mem, _flags, 0, NULL); + return s_ctx->createTexture(mem, _flags, 0, NULL, _ratio); + } + + TextureHandle createTexture2D(uint16_t _width, uint16_t _height, uint8_t _numMips, TextureFormat::Enum _format, uint32_t _flags, const Memory* _mem) + { + return createTexture2D(BackbufferRatio::None, _width, _height, _numMips, _format, _flags, _mem); + } + + TextureHandle createTexture2D(BackbufferRatio::Enum _ratio, uint8_t _numMips, TextureFormat::Enum _format, uint32_t _flags) + { + return createTexture2D(_ratio, 0, 0, _numMips, _format, _flags, NULL); } TextureHandle createTexture3D(uint16_t _width, uint16_t _height, uint16_t _depth, uint8_t _numMips, TextureFormat::Enum _format, uint32_t _flags, const Memory* _mem) @@ -2507,7 +2552,7 @@ again: tc.m_mem = _mem; bx::write(&writer, tc); - return s_ctx->createTexture(mem, _flags, 0, NULL); + return s_ctx->createTexture(mem, _flags, 0, NULL, BackbufferRatio::None); } TextureHandle createTextureCube(uint16_t _size, uint8_t _numMips, TextureFormat::Enum _format, uint32_t _flags, const Memory* _mem) @@ -2547,7 +2592,7 @@ again: tc.m_mem = _mem; bx::write(&writer, tc); - return s_ctx->createTexture(mem, _flags, 0, NULL); + return s_ctx->createTexture(mem, _flags, 0, NULL, BackbufferRatio::None); } void destroyTexture(TextureHandle _handle) @@ -2610,9 +2655,21 @@ again: return createFrameBuffer(1, &th, true); } + FrameBufferHandle createFrameBuffer(BackbufferRatio::Enum _ratio, TextureFormat::Enum _format, uint32_t _textureFlags) + { + _textureFlags |= _textureFlags&BGFX_TEXTURE_RT_MSAA_MASK ? 0 : BGFX_TEXTURE_RT; + TextureHandle th = createTexture2D(_ratio, 1, _format, _textureFlags); + return createFrameBuffer(1, &th, true); + } + FrameBufferHandle createFrameBuffer(uint8_t _num, TextureHandle* _handles, bool _destroyTextures) { BGFX_CHECK_MAIN_THREAD(); + BX_CHECK(_num != 0, "Number of frame buffer attachments can't be 0."); + BX_CHECK(_num <= BGFX_CONFIG_MAX_FRAME_BUFFER_ATTACHMENTS, "Number of frame buffer attachments is larger than allowed %d (max: %d)." + , _num + , BGFX_CONFIG_MAX_FRAME_BUFFER_ATTACHMENTS + ); BX_CHECK(NULL != _handles, "_handles can't be NULL"); FrameBufferHandle handle = s_ctx->createFrameBuffer(_num, _handles); if (_destroyTextures) |