diff options
Diffstat (limited to 'src/osd/modules/render/bgfx/target.cpp')
-rw-r--r-- | src/osd/modules/render/bgfx/target.cpp | 32 |
1 files changed, 23 insertions, 9 deletions
diff --git a/src/osd/modules/render/bgfx/target.cpp b/src/osd/modules/render/bgfx/target.cpp index a71074f44d0..4b651d3d12c 100644 --- a/src/osd/modules/render/bgfx/target.cpp +++ b/src/osd/modules/render/bgfx/target.cpp @@ -8,7 +8,7 @@ #include "target.h" -bgfx_target::bgfx_target(std::string name, bgfx::TextureFormat::Enum format, uint16_t width, uint16_t height, uint32_t prescale_x, uint32_t prescale_y, uint32_t style, bool double_buffer, bool filter) +bgfx_target::bgfx_target(std::string name, bgfx::TextureFormat::Enum format, uint16_t width, uint16_t height, uint32_t prescale_x, uint32_t prescale_y, uint32_t style, bool double_buffer, bool filter, bool init) : m_name(name) , m_format(format) , m_targets(nullptr) @@ -21,17 +21,23 @@ bgfx_target::bgfx_target(std::string name, bgfx::TextureFormat::Enum format, uin , m_style(style) , m_filter(filter) , m_current_page(0) + , m_initialized(false) , m_page_count(double_buffer ? 2 : 1) { - uint32_t wrap_mode = BGFX_TEXTURE_U_CLAMP | BGFX_TEXTURE_V_CLAMP; - uint32_t filter_mode = filter ? (BGFX_TEXTURE_MIN_ANISOTROPIC | BGFX_TEXTURE_MAG_ANISOTROPIC) : (BGFX_TEXTURE_MIN_POINT | BGFX_TEXTURE_MAG_POINT | BGFX_TEXTURE_MIP_POINT); - - m_textures = new bgfx::TextureHandle[m_page_count]; - m_targets = new bgfx::FrameBufferHandle[m_page_count]; - for (int page = 0; page < m_page_count; page++) + if (init) { - m_textures[page] = bgfx::createTexture2D(width * prescale_x, height * prescale_y, 1, format, wrap_mode | filter_mode | BGFX_TEXTURE_RT); - m_targets[page] = bgfx::createFrameBuffer(1, &m_textures[page], false); + uint32_t wrap_mode = BGFX_TEXTURE_U_CLAMP | BGFX_TEXTURE_V_CLAMP; + uint32_t filter_mode = filter ? (BGFX_TEXTURE_MIN_ANISOTROPIC | BGFX_TEXTURE_MAG_ANISOTROPIC) : (BGFX_TEXTURE_MIN_POINT | BGFX_TEXTURE_MAG_POINT | BGFX_TEXTURE_MIP_POINT); + + m_textures = new bgfx::TextureHandle[m_page_count]; + m_targets = new bgfx::FrameBufferHandle[m_page_count]; + for (int page = 0; page < m_page_count; page++) + { + m_textures[page] = bgfx::createTexture2D(width * prescale_x, height * prescale_y, 1, format, wrap_mode | filter_mode | BGFX_TEXTURE_RT); + m_targets[page] = bgfx::createFrameBuffer(1, &m_textures[page], false); + } + + m_initialized = true; } } @@ -48,6 +54,7 @@ bgfx_target::bgfx_target(void *handle, uint16_t width, uint16_t height) , m_style(TARGET_STYLE_CUSTOM) , m_filter(false) , m_current_page(0) + , m_initialized(true) , m_page_count(0) { m_targets = new bgfx::FrameBufferHandle[1]; @@ -58,6 +65,8 @@ bgfx_target::bgfx_target(void *handle, uint16_t width, uint16_t height) bgfx_target::~bgfx_target() { + if (!m_initialized) return; + if (m_page_count > 0) { for (int page = 0; page < m_page_count; page++) @@ -77,6 +86,8 @@ bgfx_target::~bgfx_target() void bgfx_target::page_flip() { + if (!m_initialized) return; + if (m_double_buffer) { m_current_page = 1 - m_current_page; @@ -85,11 +96,14 @@ void bgfx_target::page_flip() bgfx::FrameBufferHandle bgfx_target::target() { + if (!m_initialized) return BGFX_INVALID_HANDLE; return m_targets[m_current_page]; } bgfx::TextureHandle bgfx_target::texture() const { + if (!m_initialized) return BGFX_INVALID_HANDLE; + if (m_double_buffer) { return m_textures[1 - m_current_page]; |