mirror of
https://github.com/noctalia-dev/noctalia-shell.git
synced 2026-05-11 17:08:27 +08:00
53 lines
1.3 KiB
C++
53 lines
1.3 KiB
C++
#include "render/render_target.h"
|
|
|
|
#include "render/render_context.h"
|
|
|
|
#include <wayland-egl.h>
|
|
|
|
RenderTarget::~RenderTarget() { destroy(); }
|
|
|
|
void RenderTarget::create(wl_surface* surface, RenderContext& context) {
|
|
m_wlSurface = surface;
|
|
m_eglDisplay = context.eglDisplay();
|
|
m_eglConfig = context.eglConfig();
|
|
}
|
|
|
|
void RenderTarget::resize(std::uint32_t bufferWidth, std::uint32_t bufferHeight) {
|
|
if (bufferWidth == 0 || bufferHeight == 0) {
|
|
return;
|
|
}
|
|
|
|
m_bufferWidth = bufferWidth;
|
|
m_bufferHeight = bufferHeight;
|
|
|
|
if (m_window == nullptr) {
|
|
m_window = wl_egl_window_create(m_wlSurface, static_cast<int>(bufferWidth), static_cast<int>(bufferHeight));
|
|
if (m_window == nullptr) {
|
|
return;
|
|
}
|
|
|
|
m_eglSurface =
|
|
eglCreateWindowSurface(m_eglDisplay, m_eglConfig, reinterpret_cast<EGLNativeWindowType>(m_window), nullptr);
|
|
} else {
|
|
wl_egl_window_resize(m_window, static_cast<int>(bufferWidth), static_cast<int>(bufferHeight), 0, 0);
|
|
}
|
|
}
|
|
|
|
void RenderTarget::destroy() {
|
|
if (m_eglSurface != EGL_NO_SURFACE) {
|
|
eglDestroySurface(m_eglDisplay, m_eglSurface);
|
|
m_eglSurface = EGL_NO_SURFACE;
|
|
}
|
|
|
|
if (m_window != nullptr) {
|
|
wl_egl_window_destroy(m_window);
|
|
m_window = nullptr;
|
|
}
|
|
|
|
m_wlSurface = nullptr;
|
|
m_bufferWidth = 0;
|
|
m_bufferHeight = 0;
|
|
m_logicalWidth = 0;
|
|
m_logicalHeight = 0;
|
|
}
|