aboutsummaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorSimon Ser <contact@emersion.fr>2020-12-04 16:41:16 +0100
committerSimon Ser <contact@emersion.fr>2021-06-02 11:08:52 +0200
commit2b0a1aeed5246fe41e6268c333f1e00b874fab02 (patch)
tree423b9b89f425efe0ed7feb407de196d6e833189e /include
parent01e0f51fadaec17fde401da795b958b721922344 (diff)
output: take a wlr_buffer in set_cursor
Instead of passing a wlr_texture to the backend, directly pass a wlr_buffer. Use get_cursor_size and get_cursor_formats to create a wlr_buffer that can be used as a cursor. We don't want to pass a wlr_texture because we want to remove as many rendering bits from the backend as possible.
Diffstat (limited to 'include')
-rw-r--r--include/backend/drm/drm.h5
-rw-r--r--include/backend/drm/renderer.h7
-rw-r--r--include/backend/wayland.h2
-rw-r--r--include/wlr/interfaces/wlr_output.h13
-rw-r--r--include/wlr/types/wlr_output.h2
5 files changed, 15 insertions, 14 deletions
diff --git a/include/backend/drm/drm.h b/include/backend/drm/drm.h
index ec19918b..d742fdd1 100644
--- a/include/backend/drm/drm.h
+++ b/include/backend/drm/drm.h
@@ -34,9 +34,10 @@ struct wlr_drm_plane {
struct wlr_drm_format_set formats;
- // Only used by cursor
+ // Only used by cursor plane
bool cursor_enabled;
- int32_t cursor_hotspot_x, cursor_hotspot_y;
+ int cursor_width, cursor_height;
+ int cursor_hotspot_x, cursor_hotspot_y;
union wlr_drm_plane_props props;
};
diff --git a/include/backend/drm/renderer.h b/include/backend/drm/renderer.h
index c4dee425..468dd41e 100644
--- a/include/backend/drm/renderer.h
+++ b/include/backend/drm/renderer.h
@@ -43,6 +43,9 @@ bool init_drm_renderer(struct wlr_drm_backend *drm,
struct wlr_drm_renderer *renderer);
void finish_drm_renderer(struct wlr_drm_renderer *renderer);
+bool init_drm_surface(struct wlr_drm_surface *surf,
+ struct wlr_drm_renderer *renderer, uint32_t width, uint32_t height,
+ const struct wlr_drm_format *drm_format);
bool drm_surface_make_current(struct wlr_drm_surface *surf, int *buffer_age);
void drm_surface_unset_current(struct wlr_drm_surface *surf);
@@ -53,8 +56,12 @@ void drm_fb_destroy(struct wlr_drm_fb *fb);
void drm_fb_clear(struct wlr_drm_fb **fb);
void drm_fb_move(struct wlr_drm_fb **new, struct wlr_drm_fb **old);
+struct wlr_buffer *drm_surface_blit(struct wlr_drm_surface *surf,
+ struct wlr_buffer *buffer);
bool drm_surface_render_black_frame(struct wlr_drm_surface *surf);
+struct wlr_drm_format *drm_plane_pick_render_format(
+ struct wlr_drm_plane *plane, struct wlr_drm_renderer *renderer);
bool drm_plane_init_surface(struct wlr_drm_plane *plane,
struct wlr_drm_backend *drm, int32_t width, uint32_t height,
bool with_modifiers);
diff --git a/include/backend/wayland.h b/include/backend/wayland.h
index 59758ffd..923bfe72 100644
--- a/include/backend/wayland.h
+++ b/include/backend/wayland.h
@@ -83,9 +83,7 @@ struct wlr_wl_output {
struct {
struct wlr_wl_pointer *pointer;
struct wl_surface *surface;
- struct wlr_swapchain *swapchain;
int32_t hotspot_x, hotspot_y;
- int32_t width, height;
} cursor;
};
diff --git a/include/wlr/interfaces/wlr_output.h b/include/wlr/interfaces/wlr_output.h
index 7b07ea6e..aef41367 100644
--- a/include/wlr/interfaces/wlr_output.h
+++ b/include/wlr/interfaces/wlr_output.h
@@ -24,22 +24,15 @@ struct wlr_output_impl {
/**
* Set the output cursor plane image.
*
- * The parameters describe the image texture, its scale and its transform.
- * If the scale and transform doesn't match the output's, the backend is
- * responsible for scaling and transforming the texture appropriately.
- * If texture is NULL, the cursor should be hidden.
+ * If buffer is NULL, the cursor should be hidden.
*
* The hotspot indicates the offset that needs to be applied to the
* top-left corner of the image to match the cursor position. In other
* words, the image should be displayed at (x - hotspot_x, y - hotspot_y).
* The hotspot is given in the texture's coordinate space.
- *
- * If update_texture is true, all parameters need to be taken into account.
- * If update_texture is false, only the hotspot is to be updated.
*/
- bool (*set_cursor)(struct wlr_output *output, struct wlr_texture *texture,
- float scale, enum wl_output_transform transform,
- int32_t hotspot_x, int32_t hotspot_y, bool update_texture);
+ bool (*set_cursor)(struct wlr_output *output, struct wlr_buffer *buffer,
+ int hotspot_x, int hotspot_y);
/**
* Set the output cursor plane position.
*
diff --git a/include/wlr/types/wlr_output.h b/include/wlr/types/wlr_output.h
index 507bfa47..dd5051c9 100644
--- a/include/wlr/types/wlr_output.h
+++ b/include/wlr/types/wlr_output.h
@@ -181,6 +181,8 @@ struct wlr_output {
struct wl_list cursors; // wlr_output_cursor::link
struct wlr_output_cursor *hardware_cursor;
+ struct wlr_swapchain *cursor_swapchain;
+ struct wlr_buffer *cursor_front_buffer;
int software_cursor_locks; // number of locks forcing software cursors
struct wl_listener display_destroy;