mirror of
https://github.com/swaywm/sway.git
synced 2026-04-22 06:46:27 -04:00
got fx_renderer working
This commit is contained in:
parent
ea33d37362
commit
f8140228d4
7 changed files with 55 additions and 56 deletions
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
@ -376,6 +369,7 @@ bool fx_render_subtexture_with_matrix(struct fx_renderer *renderer,
|
||||||
break;
|
break;
|
||||||
*/
|
*/
|
||||||
default:
|
default:
|
||||||
|
sway_log(SWAY_ERROR, "Aborting render");
|
||||||
abort();
|
abort();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue