got fx_renderer working

This commit is contained in:
Will McKinnon 2022-08-13 01:45:59 -04:00
parent ea33d37362
commit f8140228d4
7 changed files with 55 additions and 56 deletions

View file

@ -2,7 +2,6 @@
#define _SWAY_OPENGL_H #define _SWAY_OPENGL_H
#include <GLES2/gl2.h> #include <GLES2/gl2.h>
#include "sway/server.h"
struct gles2_tex_shader { struct gles2_tex_shader {
GLuint program; GLuint program;
@ -14,15 +13,10 @@ struct gles2_tex_shader {
}; };
struct fx_renderer { struct fx_renderer {
// for simple rendering
struct wlr_renderer* wlr_renderer;
struct wlr_egl *egl; struct wlr_egl *egl;
float projection[9]; float projection[9];
struct sway_output *current;
// Shaders // Shaders
struct { struct {
struct { struct {
@ -37,11 +31,13 @@ struct fx_renderer {
} shaders; } shaders;
}; };
struct fx_renderer *fx_renderer_create(struct sway_server *server); struct fx_renderer *fx_renderer_create(struct wlr_egl *egl);
void fx_renderer_begin(struct fx_renderer *renderer, struct sway_output *output); void fx_renderer_begin(struct fx_renderer *renderer, uint32_t width, uint32_t height);
void fx_renderer_end(struct fx_renderer *renderer, pixman_region32_t* damage, struct sway_output* output); void fx_renderer_end();
void fx_renderer_clear(const float color[static 4]);
void fx_renderer_scissor(struct wlr_box *box); void fx_renderer_scissor(struct wlr_box *box);

View file

@ -34,6 +34,7 @@ struct sway_server {
struct wlr_backend *backend; struct wlr_backend *backend;
// secondary headless backend used for creating virtual outputs on-the-fly // secondary headless backend used for creating virtual outputs on-the-fly
struct wlr_backend *headless_backend; struct wlr_backend *headless_backend;
struct wlr_renderer *wlr_renderer;
struct fx_renderer *renderer; struct fx_renderer *renderer;
struct wlr_allocator *allocator; struct wlr_allocator *allocator;

View file

@ -8,9 +8,9 @@
#include <assert.h> #include <assert.h>
#include <GLES2/gl2.h> #include <GLES2/gl2.h>
#include <stdlib.h> #include <stdlib.h>
#include <wlr/render/gles2.h> #include <wlr/backend.h>
#include <wlr/render/egl.h> #include <wlr/render/egl.h>
#include <wlr/render/wlr_renderer.h> #include <wlr/render/gles2.h>
#include <wlr/types/wlr_matrix.h> #include <wlr/types/wlr_matrix.h>
#include <wlr/util/box.h> #include <wlr/util/box.h>
#include "log.h" #include "log.h"
@ -164,21 +164,13 @@ error:
} }
// TODO: Hyprland way? // TODO: Hyprland way?
struct fx_renderer *fx_renderer_create(struct sway_server *server) { // TODO: instead of server, have param be server->backend like wlr_renderer_autocreate
struct fx_renderer *fx_renderer_create(struct wlr_egl *egl) {
struct fx_renderer *renderer = calloc(1, sizeof(struct fx_renderer)); struct fx_renderer *renderer = calloc(1, sizeof(struct fx_renderer));
if (renderer == NULL) { if (renderer == NULL) {
return NULL; return NULL;
} }
renderer->current = NULL;
renderer->wlr_renderer = wlr_renderer_autocreate(server->backend);
renderer->wlr_renderer = wlr_renderer_autocreate(server->backend);
assert(renderer->wlr_renderer);
// TODO: needed?
wlr_renderer_init_wl_display(renderer->wlr_renderer, server->wl_display);
struct wlr_egl *egl = wlr_gles2_renderer_get_egl(renderer->wlr_renderer);
// TODO: wlr_egl_make_current or eglMakeCurrent? // TODO: wlr_egl_make_current or eglMakeCurrent?
// TODO: assert instead of conditional statement? // TODO: assert instead of conditional statement?
if (!wlr_egl_make_current(egl)) { if (!wlr_egl_make_current(egl)) {
@ -269,27 +261,29 @@ error:
return NULL; return NULL;
} }
// TODO: handle without wlr_renderer? void fx_renderer_begin(struct fx_renderer *renderer, uint32_t width, uint32_t height) {
void fx_renderer_begin(struct fx_renderer *renderer, struct sway_output *output) { //push_gles2_debug(renderer);
wlr_renderer_begin(renderer->wlr_renderer, output->wlr_output->width, output->wlr_output->height);
renderer->current = output; glViewport(0, 0, width, height);
// refresh projection matrix
wlr_matrix_projection(renderer->projection, width, height,
WL_OUTPUT_TRANSFORM_FLIPPED_180);
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
//pop_gles2_debug(renderer);
} }
// TODO: handle without wlr_renderer? void fx_renderer_end() {
void fx_renderer_end(struct fx_renderer *renderer, pixman_region32_t* damage, struct sway_output* output) {
wlr_renderer_scissor(renderer->wlr_renderer, NULL);
wlr_output_render_software_cursors(output->wlr_output, damage);
wlr_renderer_end(renderer->wlr_renderer);
renderer->current = NULL;
} }
/* void fx_renderer_clear(const float color[static 4]) {
static void gles2_clear(const float color[static 4]) {
glClearColor(color[0], color[1], color[2], color[3]); glClearColor(color[0], color[1], color[2], color[3]);
glClear(GL_COLOR_BUFFER_BIT); glClear(GL_COLOR_BUFFER_BIT);
} }
*/
void fx_renderer_scissor(struct wlr_box *box) { void fx_renderer_scissor(struct wlr_box *box) {
if (box) { if (box) {
@ -362,7 +356,6 @@ bool fx_render_subtexture_with_matrix(struct fx_renderer *renderer,
shader = &renderer->shaders.tex_rgbx; shader = &renderer->shaders.tex_rgbx;
} }
break; break;
// TODO?
/* /*
case GL_TEXTURE_EXTERNAL_OES: case GL_TEXTURE_EXTERNAL_OES:
shader = &renderer->shaders.tex_ext; shader = &renderer->shaders.tex_ext;
@ -374,8 +367,9 @@ bool fx_render_subtexture_with_matrix(struct fx_renderer *renderer,
return false; return false;
} }
break; break;
*/ */
default: default:
sway_log(SWAY_ERROR, "Aborting render");
abort(); abort();
} }

View file

@ -871,7 +871,7 @@ void handle_new_output(struct wl_listener *listener, void *data) {
} }
if (!wlr_output_init_render(wlr_output, server->allocator, if (!wlr_output_init_render(wlr_output, server->allocator,
server->renderer->wlr_renderer)) { server->wlr_renderer)) {
sway_log(SWAY_ERROR, "Failed to init output render"); sway_log(SWAY_ERROR, "Failed to init output render");
return; return;
} }

View file

@ -165,8 +165,6 @@ static void render_surface_iterator(struct sway_output *output,
scale_box(&dst_box, wlr_output->scale); scale_box(&dst_box, wlr_output->scale);
render_texture(wlr_output, output_damage, texture, &src_box, &dst_box, matrix, alpha); render_texture(wlr_output, output_damage, texture, &src_box, &dst_box, matrix, alpha);
//render_texture(wlr_output, output_damage, texture,
// &src_box, &dst_box, matrix, alpha);
wlr_presentation_surface_sampled_on_output(server.presentation, surface, wlr_presentation_surface_sampled_on_output(server.presentation, surface,
wlr_output); wlr_output);
@ -1030,7 +1028,8 @@ static void render_seatops(struct sway_output *output,
void output_render(struct sway_output *output, struct timespec *when, void output_render(struct sway_output *output, struct timespec *when,
pixman_region32_t *damage) { pixman_region32_t *damage) {
struct wlr_output *wlr_output = output->wlr_output; struct wlr_output *wlr_output = output->wlr_output;
struct wlr_renderer *renderer = output->server->renderer->wlr_renderer; struct wlr_renderer *wlr_renderer = output->server->wlr_renderer;
struct fx_renderer *renderer = output->server->renderer;
struct sway_workspace *workspace = output->current.active_workspace; struct sway_workspace *workspace = output->current.active_workspace;
if (workspace == NULL) { if (workspace == NULL) {
@ -1042,7 +1041,7 @@ void output_render(struct sway_output *output, struct timespec *when,
fullscreen_con = workspace->current.fullscreen; fullscreen_con = workspace->current.fullscreen;
} }
wlr_renderer_begin(renderer, wlr_output->width, wlr_output->height); fx_renderer_begin(renderer, wlr_output->width, wlr_output->height);
if (debug.damage == DAMAGE_RERENDER) { if (debug.damage == DAMAGE_RERENDER) {
int width, height; int width, height;
@ -1056,7 +1055,7 @@ void output_render(struct sway_output *output, struct timespec *when,
} }
if (debug.damage == DAMAGE_HIGHLIGHT) { if (debug.damage == DAMAGE_HIGHLIGHT) {
wlr_renderer_clear(renderer, (float[]){1, 1, 0, 1}); fx_renderer_clear((float[]){1, 1, 0, 1});
} }
if (output_has_opaque_overlay_layer_surface(output)) { if (output_has_opaque_overlay_layer_surface(output)) {
@ -1070,7 +1069,7 @@ void output_render(struct sway_output *output, struct timespec *when,
pixman_box32_t *rects = pixman_region32_rectangles(damage, &nrects); pixman_box32_t *rects = pixman_region32_rectangles(damage, &nrects);
for (int i = 0; i < nrects; ++i) { for (int i = 0; i < nrects; ++i) {
scissor_output(wlr_output, &rects[i]); scissor_output(wlr_output, &rects[i]);
wlr_renderer_clear(renderer, clear_color); fx_renderer_clear(clear_color);
} }
if (fullscreen_con->view) { if (fullscreen_con->view) {
@ -1102,7 +1101,7 @@ void output_render(struct sway_output *output, struct timespec *when,
pixman_box32_t *rects = pixman_region32_rectangles(damage, &nrects); pixman_box32_t *rects = pixman_region32_rectangles(damage, &nrects);
for (int i = 0; i < nrects; ++i) { for (int i = 0; i < nrects; ++i) {
scissor_output(wlr_output, &rects[i]); scissor_output(wlr_output, &rects[i]);
wlr_renderer_clear(renderer, clear_color); fx_renderer_clear(clear_color);
} }
render_layer_toplevel(output, damage, render_layer_toplevel(output, damage,
@ -1142,9 +1141,11 @@ render_overlay:
render_drag_icons(output, damage, &root->drag_icons); render_drag_icons(output, damage, &root->drag_icons);
renderer_end: renderer_end:
wlr_renderer_scissor(renderer, NULL); fx_renderer_scissor(NULL);
wlr_renderer_begin(wlr_renderer, wlr_output->width, wlr_output->height);
wlr_output_render_software_cursors(wlr_output, damage); wlr_output_render_software_cursors(wlr_output, damage);
wlr_renderer_end(renderer); wlr_renderer_end(wlr_renderer);
fx_renderer_end();
int width, height; int width, height;
wlr_output_transformed_resolution(wlr_output, &width, &height); wlr_output_transformed_resolution(wlr_output, &width, &height);

View file

@ -9,6 +9,7 @@
#include <wlr/backend/multi.h> #include <wlr/backend/multi.h>
#include <wlr/backend/session.h> #include <wlr/backend/session.h>
#include <wlr/config.h> #include <wlr/config.h>
#include <wlr/render/gles2.h>
#include <wlr/render/wlr_renderer.h> #include <wlr/render/wlr_renderer.h>
#include <wlr/types/wlr_compositor.h> #include <wlr/types/wlr_compositor.h>
#include <wlr/types/wlr_data_control_v1.h> #include <wlr/types/wlr_data_control_v1.h>
@ -76,29 +77,35 @@ static void handle_drm_lease_request(struct wl_listener *listener, void *data) {
bool server_init(struct sway_server *server) { bool server_init(struct sway_server *server) {
sway_log(SWAY_DEBUG, "Initializing Wayland server"); sway_log(SWAY_DEBUG, "Initializing Wayland server");
server->renderer = fx_renderer_create(server); server->wlr_renderer = wlr_renderer_autocreate(server->backend);
if (!server->wlr_renderer) {
sway_log(SWAY_ERROR, "Failed to create wlr_renderer");
return false;
}
struct wlr_egl *egl = wlr_gles2_renderer_get_egl(server->wlr_renderer);
server->renderer = fx_renderer_create(egl);
if (!server->renderer) { if (!server->renderer) {
sway_log(SWAY_ERROR, "Failed to create renderer"); sway_log(SWAY_ERROR, "Failed to create fx_renderer");
return false; return false;
} }
wlr_renderer_init_wl_shm(server->renderer->wlr_renderer, server->wl_display); wlr_renderer_init_wl_shm(server->wlr_renderer, server->wl_display);
if (wlr_renderer_get_dmabuf_texture_formats(server->renderer->wlr_renderer) != NULL) { if (wlr_renderer_get_dmabuf_texture_formats(server->wlr_renderer) != NULL) {
wlr_drm_create(server->wl_display, server->renderer->wlr_renderer); wlr_drm_create(server->wl_display, server->wlr_renderer);
server->linux_dmabuf_v1 = server->linux_dmabuf_v1 =
wlr_linux_dmabuf_v1_create(server->wl_display, server->renderer->wlr_renderer); wlr_linux_dmabuf_v1_create(server->wl_display, server->wlr_renderer);
} }
server->allocator = wlr_allocator_autocreate(server->backend, server->allocator = wlr_allocator_autocreate(server->backend,
server->renderer->wlr_renderer); server->wlr_renderer);
if (!server->allocator) { if (!server->allocator) {
sway_log(SWAY_ERROR, "Failed to create allocator"); sway_log(SWAY_ERROR, "Failed to create allocator");
return false; return false;
} }
server->compositor = wlr_compositor_create(server->wl_display, server->compositor = wlr_compositor_create(server->wl_display,
server->renderer->wlr_renderer); server->wlr_renderer);
server->compositor_new_surface.notify = handle_compositor_new_surface; server->compositor_new_surface.notify = handle_compositor_new_surface;
wl_signal_add(&server->compositor->events.new_surface, wl_signal_add(&server->compositor->events.new_surface,
&server->compositor_new_surface); &server->compositor_new_surface);

View file

@ -1105,10 +1105,10 @@ static void set_fullscreen(struct sway_container *con, bool enable) {
// TODO: add wlroots helpers for all of this stuff // TODO: add wlroots helpers for all of this stuff
const struct wlr_drm_format_set *renderer_formats = const struct wlr_drm_format_set *renderer_formats =
wlr_renderer_get_dmabuf_texture_formats(server.renderer->wlr_renderer); wlr_renderer_get_dmabuf_texture_formats(server.wlr_renderer);
assert(renderer_formats); assert(renderer_formats);
int renderer_drm_fd = wlr_renderer_get_drm_fd(server.renderer->wlr_renderer); int renderer_drm_fd = wlr_renderer_get_drm_fd(server.wlr_renderer);
int backend_drm_fd = wlr_backend_get_drm_fd(wlr_output->backend); int backend_drm_fd = wlr_backend_get_drm_fd(wlr_output->backend);
if (renderer_drm_fd < 0 || backend_drm_fd < 0) { if (renderer_drm_fd < 0 || backend_drm_fd < 0) {
return; return;