added gles3 impl

This commit is contained in:
William McKinnon 2025-10-27 00:58:07 -04:00
parent 00c96e3ac0
commit 78bffc2df5
21 changed files with 190 additions and 25 deletions

View file

@ -1,4 +1,5 @@
glesv2 = dependency('glesv2', required: 'gles2' in renderers)
glesv3 = dependency('glesv2', required: 'gles3' in renderers)
if not ((glesv2.found() or glesv3.found()) and internal_features['egl'])
subdir_done()
@ -6,8 +7,14 @@ endif
glslang = find_program('glslang', 'glslangValidator', native: true, required: false, disabler: true)
features += { 'gles2-renderer': true }
wlr_deps += glesv2
if glesv2.found()
features += { 'gles2-renderer': true }
wlr_deps += glesv2
endif
if glesv3.found()
features += { 'gles3-renderer': true }
wlr_deps += glesv3
endif
wlr_files += files(
'pass.c',

View file

@ -1,6 +1,14 @@
#include <drm_fourcc.h>
#include <wlr/config.h>
#if WLR_HAS_GLES2_RENDERER
#include <GLES2/gl2.h>
#include <GLES2/gl2ext.h>
#else
#include <GLES3/gl3.h>
#include <GLES3/gl3ext.h>
#endif
#include "render/gles.h"
#include "render/pixel_format.h"

View file

@ -9,6 +9,7 @@
#include <unistd.h>
#include <wayland-server-protocol.h>
#include <wayland-util.h>
#include <wlr/config.h>
#include <wlr/render/egl.h>
#include <wlr/render/interface.h>
#include <wlr/render/wlr_renderer.h>
@ -20,11 +21,21 @@
#include "render/pixel_format.h"
#include "util/time.h"
#if WLR_HAS_GLES2_RENDERER
#include "gles2_common_vert_src.h"
#include "gles2_quad_frag_src.h"
#include "gles2_tex_rgba_frag_src.h"
#include "gles2_tex_rgbx_frag_src.h"
#include "gles2_tex_external_frag_src.h"
#endif
#if WLR_HAS_GLES3_RENDERER
#include "gles3_common_vert_src.h"
#include "gles3_quad_frag_src.h"
#include "gles3_tex_rgba_frag_src.h"
#include "gles3_tex_rgbx_frag_src.h"
#include "gles3_tex_external_frag_src.h"
#endif
static const struct wlr_renderer_impl renderer_impl;
static const struct wlr_render_timer_impl render_timer_impl;
@ -633,9 +644,33 @@ struct wlr_renderer *wlr_gles_renderer_create(struct wlr_egl *egl) {
push_gles_debug(renderer);
const char* common_vert_src;
const char* quad_frag_src;
const char* tex_rgba_frag_src;
const char* tex_rgbx_frag_src;
const char* tex_external_frag_src;
if (egl->version == GLES2) {
#if WLR_HAS_GLES2_RENDERER
common_vert_src = gles2_common_vert_src;
quad_frag_src = gles2_quad_frag_src;
tex_rgba_frag_src = gles2_tex_rgba_frag_src;
tex_rgbx_frag_src = gles2_tex_rgbx_frag_src;
tex_external_frag_src = gles2_tex_external_frag_src;
#endif
} else {
#if WLR_HAS_GLES3_RENDERER
common_vert_src = gles3_common_vert_src;
quad_frag_src = gles3_quad_frag_src;
tex_rgba_frag_src = gles3_tex_rgba_frag_src;
tex_rgbx_frag_src = gles3_tex_rgbx_frag_src;
tex_external_frag_src = gles3_tex_external_frag_src;
#endif
}
GLuint prog;
renderer->shaders.quad.program = prog =
link_program(renderer, gles2_common_vert_src, gles2_quad_frag_src);
link_program(renderer, common_vert_src, quad_frag_src);
if (!renderer->shaders.quad.program) {
goto error;
}
@ -644,7 +679,7 @@ struct wlr_renderer *wlr_gles_renderer_create(struct wlr_egl *egl) {
renderer->shaders.quad.pos_attrib = glGetAttribLocation(prog, "pos");
renderer->shaders.tex_rgba.program = prog =
link_program(renderer, gles2_common_vert_src, gles2_tex_rgba_frag_src);
link_program(renderer, common_vert_src, tex_rgba_frag_src);
if (!renderer->shaders.tex_rgba.program) {
goto error;
}
@ -655,7 +690,7 @@ struct wlr_renderer *wlr_gles_renderer_create(struct wlr_egl *egl) {
renderer->shaders.tex_rgba.pos_attrib = glGetAttribLocation(prog, "pos");
renderer->shaders.tex_rgbx.program = prog =
link_program(renderer, gles2_common_vert_src, gles2_tex_rgbx_frag_src);
link_program(renderer, common_vert_src, tex_rgbx_frag_src);
if (!renderer->shaders.tex_rgbx.program) {
goto error;
}
@ -667,7 +702,7 @@ struct wlr_renderer *wlr_gles_renderer_create(struct wlr_egl *egl) {
if (renderer->exts.OES_egl_image_external) {
renderer->shaders.tex_ext.program = prog =
link_program(renderer, gles2_common_vert_src, gles2_tex_external_frag_src);
link_program(renderer, common_vert_src, tex_external_frag_src);
if (!renderer->shaders.tex_ext.program) {
goto error;
}

View file

@ -0,0 +1,12 @@
#version 300 es
uniform mat3 proj;
uniform mat3 tex_proj;
in vec2 pos;
out vec2 v_texcoord;
void main() {
vec3 pos3 = vec3(pos, 1.0);
gl_Position = vec4(pos3 * proj, 1.0);
v_texcoord = (pos3 * tex_proj).xy;
}

View file

@ -0,0 +1,13 @@
#version 300 es
precision highp float;
in vec4 v_color;
in vec2 v_texcoord;
uniform vec4 color;
out vec4 frag_color;
void main() {
frag_color = color;
}

View file

@ -0,0 +1,15 @@
#version 300 es
#extension GL_OES_EGL_image_external_essl3 : require
precision highp float;
in vec2 v_texcoord;
uniform samplerExternalOES texture0;
uniform float alpha;
out vec4 frag_color;
void main() {
frag_color = texture(texture0, v_texcoord) * alpha;
}

View file

@ -0,0 +1,13 @@
#version 300 es
precision highp float;
in vec2 v_texcoord;
uniform sampler2D tex;
uniform float alpha;
out vec4 frag_color;
void main() {
frag_color = texture(tex, v_texcoord) * alpha;
}

View file

@ -0,0 +1,13 @@
#version 300 es
precision highp float;
in vec2 v_texcoord;
uniform sampler2D tex;
uniform float alpha;
out vec4 frag_color;
void main() {
frag_color = vec4(texture(tex, v_texcoord).rgb, 1.0) * alpha;
}

View file

@ -6,6 +6,11 @@ shaders = [
'gles2_tex_rgba.frag',
'gles2_tex_rgbx.frag',
'gles2_tex_external.frag',
'gles3_common.vert',
'gles3_quad.frag',
'gles3_tex_rgba.frag',
'gles3_tex_rgbx.frag',
'gles3_tex_external.frag',
]
foreach name : shaders

View file

@ -1,7 +1,16 @@
#include <assert.h>
#include <drm_fourcc.h>
#include <wlr/config.h>
#if WLR_HAS_GLES2_RENDERER
#include <GLES2/gl2.h>
#include <GLES2/gl2ext.h>
#else
#include <GLES3/gl3.h>
#include <GLES3/gl3ext.h>
#endif
#include <stdint.h>
#include <stdlib.h>
#include <wayland-server-protocol.h>