From: Rob Clark <robcl...@freedesktop.org> Push offset down to driver when importing dmabuf. This is needed to more fully support EGL_EXT_image_dma_buf_import (ie. when a non-zero offset is specified).
Still requires driver support, but the per-driver support for this should be relatively straightforward. Signed-off-by: Rob Clark <robcl...@freedesktop.org> --- Not compile tested on r300, radeonsi because of lack of llvm, and vc4 due to not buildable on x86 if ilo enabled. src/gallium/drivers/freedreno/freedreno_resource.c | 5 +++++ src/gallium/drivers/i915/i915_resource.c | 4 ++++ src/gallium/drivers/ilo/ilo_resource.c | 4 ++++ src/gallium/drivers/llvmpipe/lp_texture.c | 3 +++ src/gallium/drivers/nouveau/nv30/nv30_resource.c | 4 ++++ src/gallium/drivers/nouveau/nv50/nv50_resource.c | 4 ++++ src/gallium/drivers/nouveau/nvc0/nvc0_resource.c | 3 +++ src/gallium/drivers/r300/r300_texture.c | 5 +++++ src/gallium/drivers/radeon/r600_texture.c | 4 ++++ src/gallium/drivers/softpipe/sp_texture.c | 5 +++++ src/gallium/drivers/svga/svga_resource.c | 4 ++++ src/gallium/drivers/vc4/vc4_resource.c | 5 +++++ src/gallium/include/state_tracker/drm_driver.h | 5 +++++ src/gallium/state_trackers/dri/dri2.c | 3 ++- src/gallium/state_trackers/egl/wayland/native_drm.c | 1 + 15 files changed, 58 insertions(+), 1 deletion(-) diff --git a/src/gallium/drivers/freedreno/freedreno_resource.c b/src/gallium/drivers/freedreno/freedreno_resource.c index 1b39c33..9fe9cc5 100644 --- a/src/gallium/drivers/freedreno/freedreno_resource.c +++ b/src/gallium/drivers/freedreno/freedreno_resource.c @@ -32,6 +32,8 @@ #include "util/u_string.h" #include "util/u_surface.h" +#include "state_tracker/drm_driver.h" + #include "freedreno_resource.h" #include "freedreno_screen.h" #include "freedreno_surface.h" @@ -321,6 +323,9 @@ fd_resource_from_handle(struct pipe_screen *pscreen, if (!rsc) return NULL; + if (handle->offset != 0) + return NULL; + *prsc = *tmpl; pipe_reference_init(&prsc->reference, 1); diff --git a/src/gallium/drivers/i915/i915_resource.c b/src/gallium/drivers/i915/i915_resource.c index 627ed2b..452347b 100644 --- a/src/gallium/drivers/i915/i915_resource.c +++ b/src/gallium/drivers/i915/i915_resource.c @@ -1,5 +1,7 @@ #include "util/u_debug.h" +#include "state_tracker/drm_driver.h" + #include "i915_resource.h" #include "i915_context.h" #include "i915_screen.h" @@ -25,6 +27,8 @@ i915_resource_from_handle(struct pipe_screen * screen, const struct pipe_resource *template, struct winsys_handle *whandle) { + if (whandle->offset != 0) + return NULL; if (template->target == PIPE_BUFFER) return NULL; else diff --git a/src/gallium/drivers/ilo/ilo_resource.c b/src/gallium/drivers/ilo/ilo_resource.c index c6eadc3..6801715 100644 --- a/src/gallium/drivers/ilo/ilo_resource.c +++ b/src/gallium/drivers/ilo/ilo_resource.c @@ -25,6 +25,8 @@ * Chia-I Wu <o...@lunarg.com> */ +#include "state_tracker/drm_driver.h" + #include "ilo_layout.h" #include "ilo_screen.h" #include "ilo_resource.h" @@ -456,6 +458,8 @@ ilo_resource_from_handle(struct pipe_screen *screen, const struct pipe_resource *templ, struct winsys_handle *handle) { + if (handle->offset != 0) + return NULL; if (templ->target == PIPE_BUFFER) return NULL; else diff --git a/src/gallium/drivers/llvmpipe/lp_texture.c b/src/gallium/drivers/llvmpipe/lp_texture.c index ba0e7f8..dd1837b 100644 --- a/src/gallium/drivers/llvmpipe/lp_texture.c +++ b/src/gallium/drivers/llvmpipe/lp_texture.c @@ -428,6 +428,9 @@ llvmpipe_resource_from_handle(struct pipe_screen *screen, struct sw_winsys *winsys = llvmpipe_screen(screen)->winsys; struct llvmpipe_resource *lpr; + if (whandle->offset != 0) + return NULL; + /* XXX Seems like from_handled depth textures doesn't work that well */ lpr = CALLOC_STRUCT(llvmpipe_resource); diff --git a/src/gallium/drivers/nouveau/nv30/nv30_resource.c b/src/gallium/drivers/nouveau/nv30/nv30_resource.c index 38fac8a..9228f1d 100644 --- a/src/gallium/drivers/nouveau/nv30/nv30_resource.c +++ b/src/gallium/drivers/nouveau/nv30/nv30_resource.c @@ -26,6 +26,8 @@ #include "util/u_format.h" #include "util/u_inlines.h" +#include "state_tracker/drm_driver.h" + #include "nv30/nv30_screen.h" #include "nv30/nv30_context.h" #include "nv30/nv30_resource.h" @@ -68,6 +70,8 @@ nv30_resource_from_handle(struct pipe_screen *pscreen, const struct pipe_resource *tmpl, struct winsys_handle *handle) { + if (handle->offset != 0) + return NULL; if (tmpl->target == PIPE_BUFFER) return NULL; else diff --git a/src/gallium/drivers/nouveau/nv50/nv50_resource.c b/src/gallium/drivers/nouveau/nv50/nv50_resource.c index d289b4a..487aa6f 100644 --- a/src/gallium/drivers/nouveau/nv50/nv50_resource.c +++ b/src/gallium/drivers/nouveau/nv50/nv50_resource.c @@ -3,6 +3,8 @@ #include "util/u_inlines.h" #include "util/u_format.h" +#include "state_tracker/drm_driver.h" + #include "nouveau_screen.h" #include "nv50/nv50_resource.h" @@ -24,6 +26,8 @@ nv50_resource_from_handle(struct pipe_screen * screen, const struct pipe_resource *templ, struct winsys_handle *whandle) { + if (whandle->offset != 0) + return NULL; if (templ->target == PIPE_BUFFER) return NULL; else diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_resource.c b/src/gallium/drivers/nouveau/nvc0/nvc0_resource.c index 12b5a02..94cd47e 100644 --- a/src/gallium/drivers/nouveau/nvc0/nvc0_resource.c +++ b/src/gallium/drivers/nouveau/nvc0/nvc0_resource.c @@ -1,5 +1,6 @@ #include "pipe/p_context.h" +#include "state_tracker/drm_driver.h" #include "nvc0/nvc0_resource.h" #include "nouveau_screen.h" @@ -21,6 +22,8 @@ nvc0_resource_from_handle(struct pipe_screen * screen, const struct pipe_resource *templ, struct winsys_handle *whandle) { + if (whandle->offset != 0) + return NULL; if (templ->target == PIPE_BUFFER) { return NULL; } else { diff --git a/src/gallium/drivers/r300/r300_texture.c b/src/gallium/drivers/r300/r300_texture.c index ffe8c00..deae7d6 100644 --- a/src/gallium/drivers/r300/r300_texture.c +++ b/src/gallium/drivers/r300/r300_texture.c @@ -38,6 +38,8 @@ #include "pipe/p_screen.h" +#include "state_tracker/drm_driver.h" + unsigned r300_get_swizzle_combined(const unsigned char *swizzle_format, const unsigned char *swizzle_view, boolean dxtc_swizzle) @@ -1103,6 +1105,9 @@ struct pipe_resource *r300_texture_from_handle(struct pipe_screen *screen, enum radeon_bo_layout microtile, macrotile; unsigned stride; + if (whandle->offset != 0) + return NULL; + /* Support only 2D textures without mipmaps */ if ((base->target != PIPE_TEXTURE_2D && base->target != PIPE_TEXTURE_RECT) || diff --git a/src/gallium/drivers/radeon/r600_texture.c b/src/gallium/drivers/radeon/r600_texture.c index 17aca01..0ad4f66 100644 --- a/src/gallium/drivers/radeon/r600_texture.c +++ b/src/gallium/drivers/radeon/r600_texture.c @@ -29,6 +29,7 @@ #include "util/u_format.h" #include "util/u_memory.h" #include "util/u_pack_color.h" +#include "state_tracker/drm_driver.h" #include <errno.h> #include <inttypes.h> @@ -792,6 +793,9 @@ static struct pipe_resource *r600_texture_from_handle(struct pipe_screen *screen bool scanout; int r; + if (whandle->offset != 0) + return NULL; + /* Support only 2D textures without mipmaps */ if ((templ->target != PIPE_TEXTURE_2D && templ->target != PIPE_TEXTURE_RECT) || templ->depth0 != 1 || templ->last_level != 0) diff --git a/src/gallium/drivers/softpipe/sp_texture.c b/src/gallium/drivers/softpipe/sp_texture.c index c2df71e..cb0d6b8 100644 --- a/src/gallium/drivers/softpipe/sp_texture.c +++ b/src/gallium/drivers/softpipe/sp_texture.c @@ -38,6 +38,8 @@ #include "util/u_memory.h" #include "util/u_transfer.h" +#include "state_tracker/drm_driver.h" + #include "sp_context.h" #include "sp_flush.h" #include "sp_texture.h" @@ -215,6 +217,9 @@ softpipe_resource_from_handle(struct pipe_screen *screen, if (!spr) return NULL; + if (whandle->offset != 0) + return NULL; + spr->base = *templat; pipe_reference_init(&spr->base.reference, 1); spr->base.screen = screen; diff --git a/src/gallium/drivers/svga/svga_resource.c b/src/gallium/drivers/svga/svga_resource.c index b295b44..12fdfe7 100644 --- a/src/gallium/drivers/svga/svga_resource.c +++ b/src/gallium/drivers/svga/svga_resource.c @@ -25,6 +25,8 @@ #include "util/u_debug.h" +#include "state_tracker/drm_driver.h" + #include "svga_resource.h" #include "svga_resource_buffer.h" #include "svga_resource_texture.h" @@ -49,6 +51,8 @@ svga_resource_from_handle(struct pipe_screen * screen, const struct pipe_resource *template, struct winsys_handle *whandle) { + if (whandle->offset != 0) + return NULL; if (template->target == PIPE_BUFFER) return NULL; else diff --git a/src/gallium/drivers/vc4/vc4_resource.c b/src/gallium/drivers/vc4/vc4_resource.c index a71ae5b..4958852 100644 --- a/src/gallium/drivers/vc4/vc4_resource.c +++ b/src/gallium/drivers/vc4/vc4_resource.c @@ -28,6 +28,8 @@ #include "util/u_surface.h" #include "util/u_blitter.h" +#include "state_tracker/drm_driver.h" + #include "vc4_screen.h" #include "vc4_context.h" #include "vc4_resource.h" @@ -329,6 +331,9 @@ vc4_resource_from_handle(struct pipe_screen *pscreen, struct pipe_resource *prsc = &rsc->base.b; struct vc4_resource_slice *slice = &rsc->slices[0]; + if (handle->offset != 0) + return NULL; + if (!rsc) return NULL; diff --git a/src/gallium/include/state_tracker/drm_driver.h b/src/gallium/include/state_tracker/drm_driver.h index 740c4bb..4b7045d 100644 --- a/src/gallium/include/state_tracker/drm_driver.h +++ b/src/gallium/include/state_tracker/drm_driver.h @@ -35,6 +35,11 @@ struct winsys_handle * Output for texture_get_handle. */ unsigned stride; + /** + * Input to texture_from_handle. + * TODO: does this ever make sense for output? + */ + unsigned offset; }; diff --git a/src/gallium/state_trackers/dri/dri2.c b/src/gallium/state_trackers/dri/dri2.c index 98746a6..decba94 100644 --- a/src/gallium/state_trackers/dri/dri2.c +++ b/src/gallium/state_trackers/dri/dri2.c @@ -777,7 +777,7 @@ dri2_create_image_from_fd(__DRIscreen *_screen, struct winsys_handle whandle; int format, pitch, cpp; - if (num_fds != 1 || offsets[0] != 0) { + if (num_fds != 1) { *error = __DRI_IMAGE_ERROR_BAD_MATCH; return NULL; } @@ -798,6 +798,7 @@ dri2_create_image_from_fd(__DRIscreen *_screen, memset(&whandle, 0, sizeof(whandle)); whandle.type = DRM_API_HANDLE_TYPE_FD; whandle.handle = (unsigned)fds[0]; + whandle.offset = offsets[0]; img = dri2_create_image_from_winsys(_screen, width, height, format, &whandle, pitch, loaderPrivate); diff --git a/src/gallium/state_trackers/egl/wayland/native_drm.c b/src/gallium/state_trackers/egl/wayland/native_drm.c index e1aeeeb..2fdb000 100644 --- a/src/gallium/state_trackers/egl/wayland/native_drm.c +++ b/src/gallium/state_trackers/egl/wayland/native_drm.c @@ -101,6 +101,7 @@ wayland_create_drm_buffer(struct wayland_display *display, resource = resource_surface_get_single_resource(surface->rsurf, attachment); resource_surface_get_size(surface->rsurf, &width, &height); + memset(&wsh, 0, sizeof(wsh)); wsh.type = DRM_API_HANDLE_TYPE_SHARED; screen->resource_get_handle(screen, resource, &wsh); -- 1.9.3 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev