diff --git a/include/render/gles2.h b/include/render/gles2.h index d311f434d..565a73d72 100644 --- a/include/render/gles2.h +++ b/include/render/gles2.h @@ -128,8 +128,6 @@ struct wlr_gles2_texture *gles2_raster_upload(struct wlr_gles2_renderer *rendere struct wlr_texture *gles2_texture_from_wl_drm(struct wlr_renderer *wlr_renderer, struct wl_resource *data); -struct wlr_texture *gles2_texture_from_buffer(struct wlr_renderer *wlr_renderer, - struct wlr_buffer *buffer); void gles2_texture_destroy(struct wlr_gles2_texture *texture); void push_gles2_debug_(struct wlr_gles2_renderer *renderer, diff --git a/include/render/vulkan.h b/include/render/vulkan.h index 2af72e50d..a7730225b 100644 --- a/include/render/vulkan.h +++ b/include/render/vulkan.h @@ -261,8 +261,6 @@ VkImage vulkan_import_dmabuf(struct wlr_vk_renderer *renderer, const struct wlr_dmabuf_attributes *attribs, VkDeviceMemory mems[static WLR_DMABUF_MAX_PLANES], uint32_t *n_mems, bool for_render); -struct wlr_texture *vulkan_texture_from_buffer( - struct wlr_renderer *wlr_renderer, struct wlr_buffer *buffer); void vulkan_texture_destroy(struct wlr_vk_texture *texture); struct wlr_vk_descriptor_pool { diff --git a/include/wlr/render/interface.h b/include/wlr/render/interface.h index 532a5ad3c..c072fa2f4 100644 --- a/include/wlr/render/interface.h +++ b/include/wlr/render/interface.h @@ -49,8 +49,6 @@ struct wlr_renderer_impl { void (*destroy)(struct wlr_renderer *renderer); int (*get_drm_fd)(struct wlr_renderer *renderer); uint32_t (*get_render_buffer_caps)(struct wlr_renderer *renderer); - struct wlr_texture *(*texture_from_buffer)(struct wlr_renderer *renderer, - struct wlr_buffer *buffer); }; void wlr_renderer_init(struct wlr_renderer *renderer, diff --git a/include/wlr/render/wlr_texture.h b/include/wlr/render/wlr_texture.h index f438d2aaa..68131b46c 100644 --- a/include/wlr/render/wlr_texture.h +++ b/include/wlr/render/wlr_texture.h @@ -44,10 +44,4 @@ bool wlr_texture_update_from_buffer(struct wlr_texture *texture, */ void wlr_texture_destroy(struct wlr_texture *texture); -/** - * Create a new texture from a buffer. - */ -struct wlr_texture *wlr_texture_from_buffer(struct wlr_renderer *renderer, - struct wlr_buffer *buffer); - #endif diff --git a/render/gles2/renderer.c b/render/gles2/renderer.c index e24114a7d..85cc03673 100644 --- a/render/gles2/renderer.c +++ b/render/gles2/renderer.c @@ -560,7 +560,6 @@ static const struct wlr_renderer_impl renderer_impl = { .read_pixels = gles2_read_pixels, .get_drm_fd = gles2_get_drm_fd, .get_render_buffer_caps = gles2_get_render_buffer_caps, - .texture_from_buffer = gles2_texture_from_buffer, }; void push_gles2_debug_(struct wlr_gles2_renderer *renderer, diff --git a/render/gles2/texture.c b/render/gles2/texture.c index 43d015bee..aac8e6465 100644 --- a/render/gles2/texture.c +++ b/render/gles2/texture.c @@ -196,12 +196,10 @@ static struct wlr_gles2_texture *gles2_texture_create( return texture; } -static struct wlr_texture *gles2_texture_from_pixels( - struct wlr_renderer *wlr_renderer, +static struct wlr_gles2_texture *gles2_texture_from_pixels( + struct wlr_gles2_renderer *renderer, uint32_t drm_format, uint32_t stride, uint32_t width, uint32_t height, const void *data) { - struct wlr_gles2_renderer *renderer = gles2_get_renderer(wlr_renderer); - const struct wlr_gles2_pixel_format *fmt = get_gles2_format_from_drm(drm_format); if (fmt == NULL) { @@ -253,7 +251,7 @@ static struct wlr_texture *gles2_texture_from_pixels( wlr_egl_restore_context(&prev_ctx); - return &texture->wlr_texture; + return texture; } static struct wlr_texture *gles2_texture_from_dmabuf( @@ -325,7 +323,7 @@ static const struct wlr_addon_interface texture_addon_impl = { .destroy = texture_handle_buffer_destroy, }; -static struct wlr_texture *gles2_texture_from_dmabuf_buffer( +static struct wlr_gles2_texture *gles2_texture_from_dmabuf_buffer( struct wlr_gles2_renderer *renderer, struct wlr_buffer *buffer, struct wlr_dmabuf_attributes *dmabuf) { struct wlr_addon *addon = @@ -335,16 +333,16 @@ static struct wlr_texture *gles2_texture_from_dmabuf_buffer( wl_container_of(addon, texture, buffer_addon); if (!gles2_texture_invalidate(texture)) { wlr_log(WLR_ERROR, "Failed to invalidate texture"); - return false; + return NULL; } wlr_buffer_lock(texture->buffer); - return &texture->wlr_texture; + return texture; } struct wlr_texture *wlr_texture = gles2_texture_from_dmabuf(&renderer->wlr_renderer, dmabuf); if (wlr_texture == NULL) { - return false; + return NULL; } struct wlr_gles2_texture *texture = gles2_get_texture(wlr_texture); @@ -352,37 +350,16 @@ static struct wlr_texture *gles2_texture_from_dmabuf_buffer( wlr_addon_init(&texture->buffer_addon, &buffer->addons, renderer, &texture_addon_impl); - return &texture->wlr_texture; -} - -struct wlr_texture *gles2_texture_from_buffer(struct wlr_renderer *wlr_renderer, - struct wlr_buffer *buffer) { - struct wlr_gles2_renderer *renderer = gles2_get_renderer(wlr_renderer); - - void *data; - uint32_t format; - size_t stride; - struct wlr_dmabuf_attributes dmabuf; - if (wlr_buffer_get_dmabuf(buffer, &dmabuf)) { - return gles2_texture_from_dmabuf_buffer(renderer, buffer, &dmabuf); - } else if (wlr_buffer_begin_data_ptr_access(buffer, - WLR_BUFFER_DATA_PTR_ACCESS_READ, &data, &format, &stride)) { - struct wlr_texture *tex = gles2_texture_from_pixels(wlr_renderer, - format, stride, buffer->width, buffer->height, data); - wlr_buffer_end_data_ptr_access(buffer); - return tex; - } else { - return NULL; - } + return texture; } struct wlr_gles2_texture *gles2_raster_upload(struct wlr_gles2_renderer *renderer, struct wlr_raster *wlr_raster) { - struct wlr_texture *texture; - wl_list_for_each(texture, &wlr_raster->sources, link) { - if (wlr_texture_is_gles2(texture)) { + struct wlr_texture *raster_texture; + wl_list_for_each(raster_texture, &wlr_raster->sources, link) { + if (wlr_texture_is_gles2(raster_texture)) { struct wlr_gles2_texture *gles2_tex = - (struct wlr_gles2_texture *)texture; + (struct wlr_gles2_texture *)raster_texture; if (gles2_tex->renderer != renderer) { continue; } @@ -390,19 +367,33 @@ struct wlr_gles2_texture *gles2_raster_upload(struct wlr_gles2_renderer *rendere } } + struct wlr_buffer *buffer = wlr_raster->buffer; if (!wlr_raster->buffer) { // we could possibly do a blit with another texture from another renderer, // but this is unsupported currently. return NULL; } - texture = gles2_texture_from_buffer(&renderer->wlr_renderer, wlr_raster->buffer); - if (!texture) { - return NULL; + struct wlr_gles2_texture *texture = NULL; + + void *data; + uint32_t format; + size_t stride; + struct wlr_dmabuf_attributes dmabuf; + if (wlr_buffer_get_dmabuf(buffer, &dmabuf)) { + texture = gles2_texture_from_dmabuf_buffer(renderer, buffer, &dmabuf); + } else if (wlr_buffer_begin_data_ptr_access(buffer, + WLR_BUFFER_DATA_PTR_ACCESS_READ, &data, &format, &stride)) { + texture = gles2_texture_from_pixels(renderer, + format, stride, buffer->width, buffer->height, data); + wlr_buffer_end_data_ptr_access(buffer); } - wlr_raster_attach(wlr_raster, texture); - return (struct wlr_gles2_texture *)texture; + if (texture) { + wlr_raster_attach(wlr_raster, &texture->wlr_texture); + } + + return texture; } void wlr_gles2_texture_get_attribs(struct wlr_texture *wlr_texture, diff --git a/render/pixman/renderer.c b/render/pixman/renderer.c index 5589ee66e..8b1382c79 100644 --- a/render/pixman/renderer.c +++ b/render/pixman/renderer.c @@ -73,15 +73,32 @@ static struct wlr_pixman_texture *pixman_texture_create( return texture; } -static struct wlr_texture *pixman_texture_from_buffer( - struct wlr_renderer *wlr_renderer, struct wlr_buffer *buffer) { - struct wlr_pixman_renderer *renderer = get_renderer(wlr_renderer); +static struct wlr_pixman_texture *raster_upload( + struct wlr_pixman_renderer *renderer, struct wlr_raster *wlr_raster) { + struct wlr_texture *raster_texture; + wl_list_for_each(raster_texture, &wlr_raster->sources, link) { + if (wlr_texture_is_pixman(raster_texture)) { + struct wlr_pixman_texture *pixman_tex = + (struct wlr_pixman_texture *)raster_texture; + if (pixman_tex->renderer != renderer) { + continue; + } + return pixman_tex; + } + } + + struct wlr_buffer *buffer = wlr_raster->buffer; + if (!buffer) { + // we could possibly do a blit with another texture from another renderer, + // but this is unsupported currently. + return NULL; + } void *data = NULL; uint32_t drm_format; size_t stride; - if (!wlr_buffer_begin_data_ptr_access(buffer, WLR_BUFFER_DATA_PTR_ACCESS_READ, - &data, &drm_format, &stride)) { + if (!wlr_buffer_begin_data_ptr_access(buffer, + WLR_BUFFER_DATA_PTR_ACCESS_READ, &data, &drm_format, &stride)) { return NULL; } wlr_buffer_end_data_ptr_access(buffer); @@ -103,36 +120,8 @@ static struct wlr_texture *pixman_texture_from_buffer( texture->buffer = wlr_buffer_lock(buffer); - return &texture->wlr_texture; -} - -static struct wlr_pixman_texture *raster_upload( - struct wlr_pixman_renderer *renderer, struct wlr_raster *wlr_raster) { - struct wlr_texture *texture; - wl_list_for_each(texture, &wlr_raster->sources, link) { - if (wlr_texture_is_pixman(texture)) { - struct wlr_pixman_texture *pixman_tex = - (struct wlr_pixman_texture *)texture; - if (pixman_tex->renderer != renderer) { - continue; - } - return pixman_tex; - } - } - - if (!wlr_raster->buffer) { - // we could possibly do a blit with another texture from another renderer, - // but this is unsupported currently. - return NULL; - } - - texture = pixman_texture_from_buffer(&renderer->wlr_renderer, wlr_raster->buffer); - if (!texture) { - return NULL; - } - - wlr_raster_attach(wlr_raster, texture); - return (struct wlr_pixman_texture *)texture; + wlr_raster_attach(wlr_raster, &texture->wlr_texture); + return texture; } static void texture_destroy(struct wlr_texture *wlr_texture) { @@ -531,7 +520,6 @@ static const struct wlr_renderer_impl renderer_impl = { .render_quad_with_matrix = pixman_render_quad_with_matrix, .get_shm_texture_formats = pixman_get_shm_texture_formats, .get_render_formats = pixman_get_render_formats, - .texture_from_buffer = pixman_texture_from_buffer, .bind_buffer = pixman_bind_buffer, .destroy = pixman_destroy, .preferred_read_format = pixman_preferred_read_format, diff --git a/render/vulkan/renderer.c b/render/vulkan/renderer.c index 5d9f01c53..95bc79d3a 100644 --- a/render/vulkan/renderer.c +++ b/render/vulkan/renderer.c @@ -1003,7 +1003,6 @@ static const struct wlr_renderer_impl renderer_impl = { .destroy = vulkan_destroy, .get_drm_fd = vulkan_get_drm_fd, .get_render_buffer_caps = vulkan_get_render_buffer_caps, - .texture_from_buffer = vulkan_texture_from_buffer, }; // Initializes the VkDescriptorSetLayout and VkPipelineLayout needed diff --git a/render/vulkan/texture.c b/render/vulkan/texture.c index ffd409f1e..f28bc3849 100644 --- a/render/vulkan/texture.c +++ b/render/vulkan/texture.c @@ -243,11 +243,9 @@ static struct wlr_vk_texture *vulkan_texture_create( return texture; } -static struct wlr_texture *vulkan_texture_from_pixels(struct wlr_renderer *wlr_renderer, +static struct wlr_vk_texture *vulkan_texture_from_pixels(struct wlr_vk_renderer *renderer, uint32_t drm_fmt, uint32_t stride, uint32_t width, uint32_t height, const void *data) { - struct wlr_vk_renderer *renderer = vulkan_get_renderer(wlr_renderer); - VkResult res; VkDevice dev = renderer->dev->dev; @@ -371,7 +369,7 @@ static struct wlr_texture *vulkan_texture_from_pixels(struct wlr_renderer *wlr_r goto error; } - return &texture->wlr_texture; + return texture; error: vulkan_texture_destroy(texture); @@ -606,7 +604,7 @@ error_image: return VK_NULL_HANDLE; } -static struct wlr_texture *vulkan_texture_from_dmabuf(struct wlr_renderer *wlr_renderer, +static struct wlr_vk_texture *vulkan_texture_from_dmabuf(struct wlr_renderer *wlr_renderer, struct wlr_dmabuf_attributes *attribs) { struct wlr_vk_renderer *renderer = vulkan_get_renderer(wlr_renderer); @@ -681,7 +679,7 @@ static struct wlr_texture *vulkan_texture_from_dmabuf(struct wlr_renderer *wlr_r vkUpdateDescriptorSets(dev, 1, &ds_write, 0, NULL); texture->dmabuf_imported = true; - return &texture->wlr_texture; + return texture; error: vulkan_texture_destroy(texture); @@ -695,61 +693,37 @@ static void texture_handle_buffer_destroy(struct wl_listener *listener, vulkan_texture_destroy(texture); } -static struct wlr_texture *vulkan_texture_from_dmabuf_buffer( +static struct wlr_vk_texture *vulkan_texture_from_dmabuf_buffer( struct wlr_vk_renderer *renderer, struct wlr_buffer *buffer, struct wlr_dmabuf_attributes *dmabuf) { struct wlr_vk_texture *texture; wl_list_for_each(texture, &renderer->textures, link) { if (texture->buffer == buffer) { wlr_buffer_lock(texture->buffer); - return &texture->wlr_texture; + return texture; } } - struct wlr_texture *wlr_texture = - vulkan_texture_from_dmabuf(&renderer->wlr_renderer, dmabuf); - if (wlr_texture == NULL) { - return false; + texture = vulkan_texture_from_dmabuf(&renderer->wlr_renderer, dmabuf); + if (!texture) { + return NULL; } - texture = vulkan_get_texture(wlr_texture); texture->buffer = wlr_buffer_lock(buffer); texture->buffer_destroy.notify = texture_handle_buffer_destroy; wl_signal_add(&buffer->events.destroy, &texture->buffer_destroy); - return &texture->wlr_texture; -} - -struct wlr_texture *vulkan_texture_from_buffer( - struct wlr_renderer *wlr_renderer, - struct wlr_buffer *buffer) { - struct wlr_vk_renderer *renderer = vulkan_get_renderer(wlr_renderer); - - void *data; - uint32_t format; - size_t stride; - struct wlr_dmabuf_attributes dmabuf; - if (wlr_buffer_get_dmabuf(buffer, &dmabuf)) { - return vulkan_texture_from_dmabuf_buffer(renderer, buffer, &dmabuf); - } else if (wlr_buffer_begin_data_ptr_access(buffer, - WLR_BUFFER_DATA_PTR_ACCESS_READ, &data, &format, &stride)) { - struct wlr_texture *tex = vulkan_texture_from_pixels(wlr_renderer, - format, stride, buffer->width, buffer->height, data); - wlr_buffer_end_data_ptr_access(buffer); - return tex; - } else { - return NULL; - } + return texture; } struct wlr_vk_texture *vulkan_raster_upload(struct wlr_vk_renderer *renderer, struct wlr_raster *wlr_raster) { - struct wlr_texture *texture; - wl_list_for_each(texture, &wlr_raster->sources, link) { - if (wlr_texture_is_vk(texture)) { + struct wlr_texture *raster_texture; + wl_list_for_each(raster_texture, &wlr_raster->sources, link) { + if (wlr_texture_is_vk(raster_texture)) { struct wlr_vk_texture *vk_tex = - (struct wlr_vk_texture *)texture; + (struct wlr_vk_texture *)raster_texture; if (vk_tex->renderer != renderer) { continue; } @@ -757,17 +731,31 @@ struct wlr_vk_texture *vulkan_raster_upload(struct wlr_vk_renderer *renderer, } } + struct wlr_buffer *buffer = wlr_raster->buffer; if (!wlr_raster->buffer) { // we could possibly do a blit with another texture from another renderer, // but this is unsupported currently. return NULL; } - texture = vulkan_texture_from_buffer(&renderer->wlr_renderer, wlr_raster->buffer); - if (!texture) { - return NULL; + struct wlr_vk_texture *texture = NULL; + + void *data; + uint32_t format; + size_t stride; + struct wlr_dmabuf_attributes dmabuf; + if (wlr_buffer_get_dmabuf(buffer, &dmabuf)) { + texture = vulkan_texture_from_dmabuf_buffer(renderer, buffer, &dmabuf); + } else if (wlr_buffer_begin_data_ptr_access(buffer, + WLR_BUFFER_DATA_PTR_ACCESS_READ, &data, &format, &stride)) { + texture = vulkan_texture_from_pixels(renderer, + format, stride, buffer->width, buffer->height, data); + wlr_buffer_end_data_ptr_access(buffer); } - wlr_raster_attach(wlr_raster, texture); - return (struct wlr_vk_texture *)texture; + if (texture) { + wlr_raster_attach(wlr_raster, &texture->wlr_texture); + } + + return texture; } diff --git a/render/wlr_texture.c b/render/wlr_texture.c index e1e621d55..ea2fef89b 100644 --- a/render/wlr_texture.c +++ b/render/wlr_texture.c @@ -32,14 +32,6 @@ void wlr_texture_destroy(struct wlr_texture *texture) { } } -struct wlr_texture *wlr_texture_from_buffer(struct wlr_renderer *renderer, - struct wlr_buffer *buffer) { - if (!renderer->impl->texture_from_buffer) { - return NULL; - } - return renderer->impl->texture_from_buffer(renderer, buffer); -} - bool wlr_texture_update_from_buffer(struct wlr_texture *texture, struct wlr_buffer *buffer, pixman_region32_t *damage) { if (!texture->impl->update_from_buffer) {