mirror of
https://github.com/RGBCube/serenity
synced 2025-07-27 01:17:35 +00:00
LibAccelGfx+Meta: Introduce OpenGL painting library
This change introduces a new 2D graphics library that uses OpenGL to perform painting operations. For now, it has extremely limited functionality and supports only rectangle painting, but we have to start somewhere. Since this library is intended to be used by LibWeb, where the WebContent process does not have an associated window, painting occurs in an offscreen buffer created using EGL. For now it is only possible to compile this library on linux. Offscreen context creation on SerenityOS and MacOS will have to be implemented separately in the future. Co-Authored-By: Andreas Kling <awesomekling@gmail.com>
This commit is contained in:
parent
56e8f52cb3
commit
95c154d9bd
11 changed files with 463 additions and 2 deletions
75
Userland/Libraries/LibAccelGfx/Context.cpp
Normal file
75
Userland/Libraries/LibAccelGfx/Context.cpp
Normal file
|
@ -0,0 +1,75 @@
|
|||
/*
|
||||
* Copyright (c) 2023, Aliaksandr Kalenik <kalenik.aliaksandr@gmail.com>
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-2-Clause
|
||||
*/
|
||||
|
||||
#include <LibAccelGfx/Context.h>
|
||||
|
||||
namespace AccelGfx {
|
||||
|
||||
Context& Context::the()
|
||||
{
|
||||
static OwnPtr<Context> s_the;
|
||||
if (!s_the)
|
||||
s_the = Context::create();
|
||||
return *s_the;
|
||||
}
|
||||
|
||||
Context::Surface Context::create_surface(int width, int height)
|
||||
{
|
||||
EGLint const pbuffer_attributes[] = {
|
||||
EGL_WIDTH,
|
||||
width,
|
||||
EGL_HEIGHT,
|
||||
height,
|
||||
EGL_NONE,
|
||||
};
|
||||
|
||||
auto egl_surface = eglCreatePbufferSurface(m_egl_display, m_egl_config, pbuffer_attributes);
|
||||
return { egl_surface };
|
||||
}
|
||||
|
||||
void Context::destroy_surface(Surface surface)
|
||||
{
|
||||
if (surface.egl_surface)
|
||||
eglDestroySurface(m_egl_display, surface.egl_surface);
|
||||
}
|
||||
|
||||
void Context::set_active_surface(Surface surface)
|
||||
{
|
||||
VERIFY(eglMakeCurrent(m_egl_display, surface.egl_surface, surface.egl_surface, m_egl_context));
|
||||
}
|
||||
|
||||
OwnPtr<Context> Context::create()
|
||||
{
|
||||
EGLDisplay egl_display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
|
||||
|
||||
EGLint major;
|
||||
EGLint minor;
|
||||
eglInitialize(egl_display, &major, &minor);
|
||||
|
||||
static EGLint const config_attributes[] = {
|
||||
EGL_SURFACE_TYPE, EGL_PBUFFER_BIT,
|
||||
EGL_BLUE_SIZE, 8,
|
||||
EGL_GREEN_SIZE, 8,
|
||||
EGL_RED_SIZE, 8,
|
||||
EGL_DEPTH_SIZE, 8,
|
||||
EGL_RENDERABLE_TYPE, EGL_OPENGL_BIT,
|
||||
EGL_NONE
|
||||
};
|
||||
|
||||
EGLConfig egl_config;
|
||||
EGLint num_configs;
|
||||
eglChooseConfig(egl_display, config_attributes, &egl_config, 1, &num_configs);
|
||||
|
||||
static EGLint const context_attributes[] = {
|
||||
EGL_CONTEXT_CLIENT_VERSION, 2,
|
||||
EGL_NONE
|
||||
};
|
||||
EGLContext egl_context = eglCreateContext(egl_display, egl_config, EGL_NO_CONTEXT, context_attributes);
|
||||
|
||||
return make<Context>(egl_display, egl_context, egl_config);
|
||||
}
|
||||
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue