mirror of
https://gitlab.freedesktop.org/wlroots/wlroots.git
synced 2026-04-21 06:46:46 -04:00
wlr_texture: Drop wlr_texure_from_buffer
Compositors should be using wlr_raster for texture management.
This commit is contained in:
parent
33ae408579
commit
1e2af8665b
10 changed files with 88 additions and 143 deletions
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue