aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Orzechowski <alex@ozal.ski>2023-06-19 18:17:23 -0400
committerSimon Ser <contact@emersion.fr>2023-06-20 09:04:35 +0000
commit2ac31fc6305364fc2ab9f9706db825b3df366c6f (patch)
tree4406735051d3430cb0faa93425bb8d3a86bb9d8a
parent06c0b0a204e36f90e7e1c78d8e67035620fd5516 (diff)
wlr_scene: Introduce wlr_scene_buffer_set_filter_mode
-rw-r--r--include/wlr/types/wlr_scene.h10
-rw-r--r--types/scene/wlr_scene.c11
2 files changed, 20 insertions, 1 deletions
diff --git a/include/wlr/types/wlr_scene.h b/include/wlr/types/wlr_scene.h
index c1b6f130..8013b660 100644
--- a/include/wlr/types/wlr_scene.h
+++ b/include/wlr/types/wlr_scene.h
@@ -22,6 +22,7 @@
#include <pixman.h>
#include <time.h>
#include <wayland-server-core.h>
+#include <wlr/render/wlr_renderer.h>
#include <wlr/types/wlr_damage_ring.h>
#include <wlr/types/wlr_linux_dmabuf_v1.h>
#include <wlr/util/addon.h>
@@ -168,6 +169,7 @@ struct wlr_scene_buffer {
// private state
float opacity;
+ enum wlr_scale_filter_mode filter_mode;
uint64_t active_outputs;
struct wlr_texture *texture;
struct wlr_fbox src_box;
@@ -424,6 +426,12 @@ void wlr_scene_buffer_set_opacity(struct wlr_scene_buffer *scene_buffer,
float opacity);
/**
+* Sets the filter mode to use when scaling the buffer
+*/
+void wlr_scene_buffer_set_filter_mode(struct wlr_scene_buffer *scene_buffer,
+ enum wlr_scale_filter_mode filter_mode);
+
+/**
* Calls the buffer's frame_done signal.
*/
void wlr_scene_buffer_send_frame_done(struct wlr_scene_buffer *scene_buffer,
@@ -455,7 +463,7 @@ bool wlr_scene_output_commit(struct wlr_scene_output *scene_output);
* Render and populate given output state.
*/
bool wlr_scene_output_build_state(struct wlr_scene_output *scene_output,
- struct wlr_output_state *state);
+ struct wlr_output_state *state);
/**
* Call wlr_surface_send_frame_done() on all surfaces in the scene rendered by
diff --git a/types/scene/wlr_scene.c b/types/scene/wlr_scene.c
index 7ee49207..d20916a7 100644
--- a/types/scene/wlr_scene.c
+++ b/types/scene/wlr_scene.c
@@ -816,6 +816,16 @@ void wlr_scene_buffer_set_opacity(struct wlr_scene_buffer *scene_buffer,
scene_node_update(&scene_buffer->node, NULL);
}
+void wlr_scene_buffer_set_filter_mode(struct wlr_scene_buffer *scene_buffer,
+ enum wlr_scale_filter_mode filter_mode) {
+ if (scene_buffer->filter_mode == filter_mode) {
+ return;
+ }
+
+ scene_buffer->filter_mode = filter_mode;
+ scene_node_update(&scene_buffer->node, NULL);
+}
+
static struct wlr_texture *scene_buffer_get_texture(
struct wlr_scene_buffer *scene_buffer, struct wlr_renderer *renderer) {
struct wlr_client_buffer *client_buffer =
@@ -1146,6 +1156,7 @@ static void scene_node_render(struct wlr_scene_node *node, const struct render_d
.transform = transform,
.clip = &render_region,
.alpha = &scene_buffer->opacity,
+ .filter_mode = scene_buffer->filter_mode,
});
wl_signal_emit_mutable(&scene_buffer->events.output_present, data->output);