summaryrefslogtreecommitdiffstatshomepage
path: root/3rdparty/bgfx/src/bgfx.cpp
diff options
context:
space:
mode:
Diffstat (limited to '3rdparty/bgfx/src/bgfx.cpp')
-rw-r--r--3rdparty/bgfx/src/bgfx.cpp153
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)