mirror of
https://gitlab.freedesktop.org/wlroots/wlroots.git
synced 2026-04-14 08:22:25 -04:00
added gles3 impl
This commit is contained in:
parent
00c96e3ac0
commit
78bffc2df5
21 changed files with 190 additions and 25 deletions
|
|
@ -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',
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
12
render/gles/shaders/gles3_common.vert
Normal file
12
render/gles/shaders/gles3_common.vert
Normal 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;
|
||||
}
|
||||
13
render/gles/shaders/gles3_quad.frag
Normal file
13
render/gles/shaders/gles3_quad.frag
Normal 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;
|
||||
}
|
||||
15
render/gles/shaders/gles3_tex_external.frag
Normal file
15
render/gles/shaders/gles3_tex_external.frag
Normal 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;
|
||||
}
|
||||
13
render/gles/shaders/gles3_tex_rgba.frag
Normal file
13
render/gles/shaders/gles3_tex_rgba.frag
Normal 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;
|
||||
}
|
||||
13
render/gles/shaders/gles3_tex_rgbx.frag
Normal file
13
render/gles/shaders/gles3_tex_rgbx.frag
Normal 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;
|
||||
}
|
||||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue