From cb90daadc7c35c95f900c6742b2d13dd8faba7fe Mon Sep 17 00:00:00 2001 From: Aliaksandr Kalenik Date: Thu, 23 Nov 2023 15:09:40 +0100 Subject: [PATCH] LibAccelGfx: Add cache for programs Having programs cache shared between painters would allow us to create more than one painter without worrying about shaders recompilation. --- Userland/Libraries/LibAccelGfx/Painter.cpp | 8 ++++---- Userland/Libraries/LibAccelGfx/Program.cpp | 14 ++++++++------ Userland/Libraries/LibAccelGfx/Program.h | 12 +++++++++--- 3 files changed, 21 insertions(+), 13 deletions(-) diff --git a/Userland/Libraries/LibAccelGfx/Painter.cpp b/Userland/Libraries/LibAccelGfx/Painter.cpp index 18a30d771c..54b76b29ba 100644 --- a/Userland/Libraries/LibAccelGfx/Painter.cpp +++ b/Userland/Libraries/LibAccelGfx/Painter.cpp @@ -144,10 +144,10 @@ OwnPtr Painter::create() Painter::Painter(Context& context) : m_context(context) - , m_rectangle_program(Program::create(vertex_shader_source, solid_color_fragment_shader_source)) - , m_rounded_rectangle_program(Program::create(vertex_shader_source, rect_with_rounded_corners_fragment_shader_source)) - , m_blit_program(Program::create(blit_vertex_shader_source, blit_fragment_shader_source)) - , m_linear_gradient_program(Program::create(linear_gradient_vertex_shader_source, linear_gradient_fragment_shader_source)) + , m_rectangle_program(Program::create(Program::Name::RectangleProgram, vertex_shader_source, solid_color_fragment_shader_source)) + , m_rounded_rectangle_program(Program::create(Program::Name::RoundedRectangleProgram, vertex_shader_source, rect_with_rounded_corners_fragment_shader_source)) + , m_blit_program(Program::create(Program::Name::BlitProgram, blit_vertex_shader_source, blit_fragment_shader_source)) + , m_linear_gradient_program(Program::create(Program::Name::LinearGradientProgram, linear_gradient_vertex_shader_source, linear_gradient_fragment_shader_source)) , m_glyphs_texture(GL::create_texture()) { m_state_stack.empend(State()); diff --git a/Userland/Libraries/LibAccelGfx/Program.cpp b/Userland/Libraries/LibAccelGfx/Program.cpp index 111fcf6f17..2025a1a469 100644 --- a/Userland/Libraries/LibAccelGfx/Program.cpp +++ b/Userland/Libraries/LibAccelGfx/Program.cpp @@ -11,12 +11,19 @@ namespace AccelGfx { -Program Program::create(char const* vertex_shader_source, char const* fragment_shader_source) +Optional programs_cache[to_underlying(Program::Name::ProgramCount)]; + +Program Program::create(Name name, char const* vertex_shader_source, char const* fragment_shader_source) { + if (programs_cache[to_underlying(name)].has_value()) { + return Program { *programs_cache[to_underlying(name)] }; + } + auto vertex_shader = GL::create_shader(GL::ShaderType::Vertex, vertex_shader_source); auto fragment_shader = GL::create_shader(GL::ShaderType::Fragment, fragment_shader_source); auto program = GL::create_program(vertex_shader, fragment_shader); + programs_cache[to_underlying(name)] = program; return Program { program }; } @@ -36,9 +43,4 @@ GL::Uniform Program::get_uniform_location(char const* name) return GL::get_uniform_location(m_program, name); } -Program::~Program() -{ - GL::delete_program(m_program); -} - } diff --git a/Userland/Libraries/LibAccelGfx/Program.h b/Userland/Libraries/LibAccelGfx/Program.h index 2a5a62dd84..a68f291b13 100644 --- a/Userland/Libraries/LibAccelGfx/Program.h +++ b/Userland/Libraries/LibAccelGfx/Program.h @@ -15,14 +15,20 @@ class Program { AK_MAKE_NONCOPYABLE(Program); public: - static Program create(char const* vertex_shader_source, char const* fragment_shader_source); + enum class Name { + RectangleProgram, + RoundedRectangleProgram, + BlitProgram, + LinearGradientProgram, + ProgramCount, + }; + + static Program create(Name name, char const* vertex_shader_source, char const* fragment_shader_source); void use(); GL::VertexAttribute get_attribute_location(char const* name); GL::Uniform get_uniform_location(char const* name); - ~Program(); - private: Program(GL::Program program) : m_program(program)