Untitled
unknown
plain_text
a year ago
2.7 kB
7
Indexable
Here's the EGL/DMA-BUF integration code needed:
Add EGL texture creation in render/gles2/texture.c:
cCopyEGLImage create_egl_image_from_buffer(struct wlr_egl *egl,
struct wlr_udmabuf_buffer *buffer) {
EGLint attribs[] = {
EGL_WIDTH, buffer->dmabuf.width,
EGL_HEIGHT, buffer->dmabuf.height,
EGL_LINUX_DRM_FOURCC_EXT, buffer->dmabuf.format,
EGL_DMA_BUF_PLANE0_FD_EXT, buffer->dmabuf.fd[0],
EGL_DMA_BUF_PLANE0_OFFSET_EXT, buffer->dmabuf.offset[0],
EGL_DMA_BUF_PLANE0_PITCH_EXT, buffer->dmabuf.stride[0],
EGL_NONE
};
return eglCreateImageKHR(egl->display, EGL_NO_CONTEXT,
EGL_LINUX_DMA_BUF_EXT, NULL, attribs);
}
Add texture interface implementation:
cCopystatic const struct wlr_texture_impl texture_impl = {
.get_size = texture_get_size,
.write_pixels = texture_write_pixels,
.destroy = texture_destroy,
};
struct wlr_texture *import_dmabuf(struct wlr_renderer *renderer,
struct wlr_udmabuf_buffer *buffer) {
struct wlr_gles2_texture *texture = calloc(1, sizeof(*texture));
if (!texture) return NULL;
wlr_texture_init(&texture->base, &texture_impl, buffer->width, buffer->height);
texture->target = GL_TEXTURE_2D;
EGLImage image = create_egl_image_from_buffer(renderer->egl, buffer);
if (image == EGL_NO_IMAGE) {
free(texture);
return NULL;
}
glGenTextures(1, &texture->tex);
glBindTexture(GL_TEXTURE_2D, texture->tex);
glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, image);
eglDestroyImageKHR(renderer->egl->display, image);
return &texture->base;
}
Add synchronization in buffer.c:
cCopystruct wlr_udmabuf_buffer_sync {
EGLSyncKHR sync;
struct wl_event_source *event_source;
};
static void buffer_begin_data_ptr_access(struct wlr_buffer *buffer) {
struct wlr_udmabuf_buffer *udmabuf = get_udmabuf_buffer(buffer);
glFinish(); // Ensure GPU is done
}
static void buffer_end_data_ptr_access(struct wlr_buffer *buffer) {
struct wlr_udmabuf_buffer *udmabuf = get_udmabuf_buffer(buffer);
// Create fence for GPU sync
udmabuf->sync = eglCreateSyncKHR(egl->display, EGL_SYNC_FENCE_KHR, NULL);
}
Add these function pointers to your buffer_impl:
cCopystatic const struct wlr_buffer_impl buffer_impl = {
.destroy = buffer_destroy,
.get_shm = buffer_get_shm,
.get_dmabuf = buffer_get_dmabuf,
.begin_data_ptr_access = buffer_begin_data_ptr_access,
.end_data_ptr_access = buffer_end_data_ptr_access,
};
This completes the integration between udmabuf and wlroots' rendering system.Editor is loading...
Leave a Comment