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
#include <GLES2/gl2.h>
#include "sway/server.h"
struct gles2_tex_shader {
GLuint program;
@ -14,15 +13,10 @@ struct gles2_tex_shader {
};
struct fx_renderer {
// for simple rendering
struct wlr_renderer* wlr_renderer;
struct wlr_egl *egl;
float projection[9];
struct sway_output *current;
// Shaders
struct {
struct {
@ -37,11 +31,13 @@ struct fx_renderer {
} 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);

View file

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

View file

@ -8,9 +8,9 @@
#include <assert.h>
#include <GLES2/gl2.h>
#include <stdlib.h>
#include <wlr/render/gles2.h>
#include <wlr/backend.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/util/box.h>
#include "log.h"
@ -164,21 +164,13 @@ error:
}
// 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));
if (renderer == 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: assert instead of conditional statement?
if (!wlr_egl_make_current(egl)) {
@ -269,27 +261,29 @@ error:
return NULL;
}
// TODO: handle without wlr_renderer?
void fx_renderer_begin(struct fx_renderer *renderer, struct sway_output *output) {
wlr_renderer_begin(renderer->wlr_renderer, output->wlr_output->width, output->wlr_output->height);
renderer->current = output;
void fx_renderer_begin(struct fx_renderer *renderer, uint32_t width, uint32_t height) {
//push_gles2_debug(renderer);
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(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);
void fx_renderer_end() {
renderer->current = NULL;
}
/*
static void gles2_clear(const float color[static 4]) {
void fx_renderer_clear(const float color[static 4]) {
glClearColor(color[0], color[1], color[2], color[3]);
glClear(GL_COLOR_BUFFER_BIT);
}
*/
void fx_renderer_scissor(struct wlr_box *box) {
if (box) {
@ -362,7 +356,6 @@ bool fx_render_subtexture_with_matrix(struct fx_renderer *renderer,
shader = &renderer->shaders.tex_rgbx;
}
break;
// TODO?
/*
case GL_TEXTURE_EXTERNAL_OES:
shader = &renderer->shaders.tex_ext;
@ -374,8 +367,9 @@ bool fx_render_subtexture_with_matrix(struct fx_renderer *renderer,
return false;
}
break;
*/
*/
default:
sway_log(SWAY_ERROR, "Aborting render");
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,
server->renderer->wlr_renderer)) {
server->wlr_renderer)) {
sway_log(SWAY_ERROR, "Failed to init output render");
return;
}

View file

@ -165,8 +165,6 @@ static void render_surface_iterator(struct sway_output *output,
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);
wlr_presentation_surface_sampled_on_output(server.presentation, surface,
wlr_output);
@ -1030,7 +1028,8 @@ static void render_seatops(struct sway_output *output,
void output_render(struct sway_output *output, struct timespec *when,
pixman_region32_t *damage) {
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;
if (workspace == NULL) {
@ -1042,7 +1041,7 @@ void output_render(struct sway_output *output, struct timespec *when,
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) {
int width, height;
@ -1056,7 +1055,7 @@ void output_render(struct sway_output *output, struct timespec *when,
}
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)) {
@ -1070,7 +1069,7 @@ void output_render(struct sway_output *output, struct timespec *when,
pixman_box32_t *rects = pixman_region32_rectangles(damage, &nrects);
for (int i = 0; i < nrects; ++i) {
scissor_output(wlr_output, &rects[i]);
wlr_renderer_clear(renderer, clear_color);
fx_renderer_clear(clear_color);
}
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);
for (int i = 0; i < nrects; ++i) {
scissor_output(wlr_output, &rects[i]);
wlr_renderer_clear(renderer, clear_color);
fx_renderer_clear(clear_color);
}
render_layer_toplevel(output, damage,
@ -1142,9 +1141,11 @@ render_overlay:
render_drag_icons(output, damage, &root->drag_icons);
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_renderer_end(renderer);
wlr_renderer_end(wlr_renderer);
fx_renderer_end();
int width, height;
wlr_output_transformed_resolution(wlr_output, &width, &height);

View file

@ -9,6 +9,7 @@
#include <wlr/backend/multi.h>
#include <wlr/backend/session.h>
#include <wlr/config.h>
#include <wlr/render/gles2.h>
#include <wlr/render/wlr_renderer.h>
#include <wlr/types/wlr_compositor.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) {
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) {
sway_log(SWAY_ERROR, "Failed to create renderer");
sway_log(SWAY_ERROR, "Failed to create fx_renderer");
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) {
wlr_drm_create(server->wl_display, server->renderer->wlr_renderer);
if (wlr_renderer_get_dmabuf_texture_formats(server->wlr_renderer) != NULL) {
wlr_drm_create(server->wl_display, server->wlr_renderer);
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->renderer->wlr_renderer);
server->wlr_renderer);
if (!server->allocator) {
sway_log(SWAY_ERROR, "Failed to create allocator");
return false;
}
server->compositor = wlr_compositor_create(server->wl_display,
server->renderer->wlr_renderer);
server->wlr_renderer);
server->compositor_new_surface.notify = handle_compositor_new_surface;
wl_signal_add(&server->compositor->events.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
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);
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);
if (renderer_drm_fd < 0 || backend_drm_fd < 0) {
return;