mirror of
https://gitlab.freedesktop.org/wlroots/wlroots.git
synced 2025-10-31 22:25:21 -04:00
Merge pull request #744 from emersion/texture-redesign
Redesign wlr_texture
This commit is contained in:
commit
330ee08126
24 changed files with 579 additions and 650 deletions
|
|
@ -181,9 +181,6 @@ void wlr_drm_resources_free(struct wlr_drm_backend *drm) {
|
|||
if (plane->cursor_bo) {
|
||||
gbm_bo_destroy(plane->cursor_bo);
|
||||
}
|
||||
if (plane->wlr_tex) {
|
||||
wlr_texture_destroy(plane->wlr_tex);
|
||||
}
|
||||
}
|
||||
|
||||
free(drm->crtcs);
|
||||
|
|
@ -586,12 +583,6 @@ static bool wlr_drm_connector_set_cursor(struct wlr_output *output,
|
|||
wlr_output_transform_invert(output->transform);
|
||||
wlr_matrix_projection(plane->matrix, plane->surf.width,
|
||||
plane->surf.height, transform);
|
||||
|
||||
plane->wlr_tex =
|
||||
wlr_render_texture_create(plane->surf.renderer->wlr_rend);
|
||||
if (!plane->wlr_tex) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
struct wlr_box hotspot = { .x = hotspot_x, .y = hotspot_y };
|
||||
|
|
@ -637,13 +628,18 @@ static bool wlr_drm_connector_set_cursor(struct wlr_output *output,
|
|||
|
||||
wlr_drm_surface_make_current(&plane->surf, NULL);
|
||||
|
||||
wlr_texture_upload_pixels(plane->wlr_tex, WL_SHM_FORMAT_ARGB8888,
|
||||
stride, width, height, buf);
|
||||
|
||||
struct wlr_renderer *rend = plane->surf.renderer->wlr_rend;
|
||||
|
||||
struct wlr_texture *texture = wlr_texture_from_pixels(rend,
|
||||
WL_SHM_FORMAT_ARGB8888, stride, width, height, buf);
|
||||
if (texture == NULL) {
|
||||
wlr_log(L_ERROR, "Unable to create texture");
|
||||
return false;
|
||||
}
|
||||
|
||||
wlr_renderer_begin(rend, plane->surf.width, plane->surf.height);
|
||||
wlr_renderer_clear(rend, (float[]){ 0.0, 0.0, 0.0, 0.0 });
|
||||
wlr_render_texture(rend, plane->wlr_tex, plane->matrix, 0, 0, 1.0f);
|
||||
wlr_render_texture(rend, texture, plane->matrix, 0, 0, 1.0f);
|
||||
wlr_renderer_end(rend);
|
||||
|
||||
wlr_renderer_read_pixels(rend, WL_SHM_FORMAT_ARGB8888, bo_stride,
|
||||
|
|
@ -651,6 +647,7 @@ static bool wlr_drm_connector_set_cursor(struct wlr_output *output,
|
|||
|
||||
wlr_drm_surface_swap_buffers(&plane->surf, NULL);
|
||||
|
||||
wlr_texture_destroy(texture);
|
||||
gbm_bo_unmap(plane->cursor_bo, bo_data);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -14,6 +14,10 @@
|
|||
#include "backend/drm/drm.h"
|
||||
#include "glapi.h"
|
||||
|
||||
#ifndef DRM_FORMAT_MOD_LINEAR
|
||||
#define DRM_FORMAT_MOD_LINEAR 0
|
||||
#endif
|
||||
|
||||
bool wlr_drm_renderer_init(struct wlr_drm_backend *drm,
|
||||
struct wlr_drm_renderer *renderer) {
|
||||
renderer->gbm = gbm_create_device(drm->fd);
|
||||
|
|
@ -178,47 +182,33 @@ static void free_eglimage(struct gbm_bo *bo, void *data) {
|
|||
static struct wlr_texture *get_tex_for_bo(struct wlr_drm_renderer *renderer,
|
||||
struct gbm_bo *bo) {
|
||||
struct tex *tex = gbm_bo_get_user_data(bo);
|
||||
if (tex) {
|
||||
if (tex != NULL) {
|
||||
return tex->tex;
|
||||
}
|
||||
|
||||
// TODO: use wlr_texture_upload_dmabuf instead
|
||||
|
||||
tex = malloc(sizeof(*tex));
|
||||
if (!tex) {
|
||||
wlr_log_errno(L_ERROR, "Allocation failed");
|
||||
tex = calloc(1, sizeof(struct tex));
|
||||
if (tex == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
tex->egl = &renderer->egl;
|
||||
|
||||
int dmabuf_fd = gbm_bo_get_fd(bo);
|
||||
uint32_t width = gbm_bo_get_width(bo);
|
||||
uint32_t height = gbm_bo_get_height(bo);
|
||||
|
||||
EGLint attribs[] = {
|
||||
EGL_WIDTH, width,
|
||||
EGL_HEIGHT, height,
|
||||
EGL_LINUX_DRM_FOURCC_EXT, gbm_bo_get_format(bo),
|
||||
EGL_DMA_BUF_PLANE0_FD_EXT, dmabuf_fd,
|
||||
EGL_DMA_BUF_PLANE0_OFFSET_EXT, gbm_bo_get_offset(bo, 0),
|
||||
EGL_DMA_BUF_PLANE0_PITCH_EXT, gbm_bo_get_stride_for_plane(bo, 0),
|
||||
EGL_IMAGE_PRESERVED_KHR, EGL_FALSE,
|
||||
EGL_NONE,
|
||||
struct wlr_dmabuf_buffer_attribs attribs = {
|
||||
.n_planes = 1,
|
||||
.width = gbm_bo_get_width(bo),
|
||||
.height = gbm_bo_get_height(bo),
|
||||
.format = gbm_bo_get_format(bo),
|
||||
};
|
||||
attribs.offset[0] = 0;
|
||||
attribs.stride[0] = gbm_bo_get_stride_for_plane(bo, 0);
|
||||
attribs.modifier[0] = DRM_FORMAT_MOD_LINEAR;
|
||||
attribs.fd[0] = gbm_bo_get_fd(bo);
|
||||
|
||||
tex->img = eglCreateImageKHR(renderer->egl.display, EGL_NO_CONTEXT,
|
||||
EGL_LINUX_DMA_BUF_EXT, NULL, attribs);
|
||||
if (!tex->img) {
|
||||
wlr_log(L_ERROR, "Failed to create EGL image");
|
||||
abort();
|
||||
tex->tex = wlr_texture_from_dmabuf(renderer->wlr_rend, &attribs);
|
||||
if (tex->tex == NULL) {
|
||||
free(tex);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
tex->tex = wlr_render_texture_create(renderer->wlr_rend);
|
||||
wlr_texture_upload_eglimage(tex->tex, tex->img, width, height);
|
||||
|
||||
gbm_bo_set_user_data(bo, tex, free_eglimage);
|
||||
|
||||
return tex->tex;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -99,8 +99,6 @@ static bool wlr_wl_output_set_cursor(struct wlr_output *_output,
|
|||
return true;
|
||||
}
|
||||
|
||||
stride *= 4; // stride is given in pixels, we need it in bytes
|
||||
|
||||
if (!backend->shm || !backend->pointer) {
|
||||
wlr_log(L_INFO, "cannot set cursor, no shm or pointer");
|
||||
return false;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue