From: Marek Olšák <marek.ol...@amd.com> This will help differentiate between window-system framebuffers and other buffers.
PIPE_HANDLE_USAGE_EXPLICIT_FLUSH should yield higher performance (e.g. allows delayed clears), but PIPE_HANDLE_USAGE_COHERENT is more flexible. Sadly, it looks like st/dri can't distinguish between a DRI3 framebuffer and EGL image export. --- src/gallium/auxiliary/util/u_transfer.c | 3 ++- src/gallium/auxiliary/util/u_transfer.h | 3 ++- src/gallium/drivers/ddebug/dd_screen.c | 5 +++-- src/gallium/drivers/ilo/ilo_resource.c | 3 ++- src/gallium/drivers/llvmpipe/lp_texture.c | 3 ++- src/gallium/drivers/noop/noop_pipe.c | 3 ++- src/gallium/drivers/r300/r300_texture.c | 3 ++- src/gallium/drivers/r300/r300_texture.h | 4 +++- src/gallium/drivers/radeon/r600_texture.c | 3 ++- src/gallium/drivers/rbug/rbug_screen.c | 5 +++-- src/gallium/drivers/softpipe/sp_texture.c | 3 ++- src/gallium/drivers/trace/tr_screen.c | 5 +++-- src/gallium/include/pipe/p_defines.h | 11 +++++++++++ src/gallium/include/pipe/p_screen.h | 3 ++- src/gallium/state_trackers/dri/dri2.c | 10 +++++----- src/gallium/state_trackers/nine/swapchain9.c | 3 ++- src/gallium/state_trackers/va/buffer.c | 3 ++- src/gallium/state_trackers/xa/xa_tracker.c | 3 ++- src/gallium/winsys/sw/wrapper/wrapper_sw_winsys.c | 3 ++- 19 files changed, 54 insertions(+), 25 deletions(-) diff --git a/src/gallium/auxiliary/util/u_transfer.c b/src/gallium/auxiliary/util/u_transfer.c index adae84b..8f41355 100644 --- a/src/gallium/auxiliary/util/u_transfer.c +++ b/src/gallium/auxiliary/util/u_transfer.c @@ -98,7 +98,8 @@ u_resource( struct pipe_resource *res ) boolean u_resource_get_handle_vtbl(struct pipe_screen *screen, struct pipe_resource *resource, - struct winsys_handle *handle) + struct winsys_handle *handle, + enum pipe_handle_usage usage) { struct u_resource *ur = u_resource(resource); return ur->vtbl->resource_get_handle(screen, resource, handle); diff --git a/src/gallium/auxiliary/util/u_transfer.h b/src/gallium/auxiliary/util/u_transfer.h index 6c25ee0..63e6a00 100644 --- a/src/gallium/auxiliary/util/u_transfer.h +++ b/src/gallium/auxiliary/util/u_transfer.h @@ -78,7 +78,8 @@ struct u_resource { boolean u_resource_get_handle_vtbl(struct pipe_screen *screen, struct pipe_resource *resource, - struct winsys_handle *handle); + struct winsys_handle *handle, + enum pipe_handle_usage usage); void u_resource_destroy_vtbl(struct pipe_screen *screen, struct pipe_resource *resource); diff --git a/src/gallium/drivers/ddebug/dd_screen.c b/src/gallium/drivers/ddebug/dd_screen.c index 3706b2d..a5bbdd0 100644 --- a/src/gallium/drivers/ddebug/dd_screen.c +++ b/src/gallium/drivers/ddebug/dd_screen.c @@ -218,11 +218,12 @@ dd_screen_resource_destroy(struct pipe_screen *_screen, static boolean dd_screen_resource_get_handle(struct pipe_screen *_screen, struct pipe_resource *resource, - struct winsys_handle *handle) + struct winsys_handle *handle, + enum pipe_handle_usage usage) { struct pipe_screen *screen = dd_screen(_screen)->screen; - return screen->resource_get_handle(screen, resource, handle); + return screen->resource_get_handle(screen, resource, handle, usage); } diff --git a/src/gallium/drivers/ilo/ilo_resource.c b/src/gallium/drivers/ilo/ilo_resource.c index 9026ba9..a6f63e1 100644 --- a/src/gallium/drivers/ilo/ilo_resource.c +++ b/src/gallium/drivers/ilo/ilo_resource.c @@ -725,7 +725,8 @@ ilo_resource_from_handle(struct pipe_screen *screen, static boolean ilo_resource_get_handle(struct pipe_screen *screen, struct pipe_resource *res, - struct winsys_handle *handle) + struct winsys_handle *handle, + enum pipe_handle_usage usage) { if (res->target == PIPE_BUFFER) return false; diff --git a/src/gallium/drivers/llvmpipe/lp_texture.c b/src/gallium/drivers/llvmpipe/lp_texture.c index ae266ce..b3e4650 100644 --- a/src/gallium/drivers/llvmpipe/lp_texture.c +++ b/src/gallium/drivers/llvmpipe/lp_texture.c @@ -485,7 +485,8 @@ no_lpr: static boolean llvmpipe_resource_get_handle(struct pipe_screen *screen, struct pipe_resource *pt, - struct winsys_handle *whandle) + struct winsys_handle *whandle, + enum pipe_handle_usage usage) { struct sw_winsys *winsys = llvmpipe_screen(screen)->winsys; struct llvmpipe_resource *lpr = llvmpipe_resource(pt); diff --git a/src/gallium/drivers/noop/noop_pipe.c b/src/gallium/drivers/noop/noop_pipe.c index 165284a..bdd4ccc 100644 --- a/src/gallium/drivers/noop/noop_pipe.c +++ b/src/gallium/drivers/noop/noop_pipe.c @@ -129,7 +129,8 @@ static struct pipe_resource *noop_resource_from_handle(struct pipe_screen *scree static boolean noop_resource_get_handle(struct pipe_screen *screen, struct pipe_resource *resource, - struct winsys_handle *handle) + struct winsys_handle *handle, + enum pipe_handle_usage usage) { return FALSE; } diff --git a/src/gallium/drivers/r300/r300_texture.c b/src/gallium/drivers/r300/r300_texture.c index 3adee8e..27f8277 100644 --- a/src/gallium/drivers/r300/r300_texture.c +++ b/src/gallium/drivers/r300/r300_texture.c @@ -971,7 +971,8 @@ static void r300_texture_destroy(struct pipe_screen *screen, boolean r300_resource_get_handle(struct pipe_screen* screen, struct pipe_resource *texture, - struct winsys_handle *whandle) + struct winsys_handle *whandle, + enum pipe_handle_usage usage) { struct radeon_winsys *rws = r300_screen(screen)->rws; struct r300_resource* tex = (struct r300_resource*)texture; diff --git a/src/gallium/drivers/r300/r300_texture.h b/src/gallium/drivers/r300/r300_texture.h index 213bdff..a8117a3 100644 --- a/src/gallium/drivers/r300/r300_texture.h +++ b/src/gallium/drivers/r300/r300_texture.h @@ -25,6 +25,7 @@ #include "pipe/p_compiler.h" #include "pipe/p_format.h" +#include "pipe/p_screen.h" struct pipe_screen; struct pipe_context; @@ -62,7 +63,8 @@ void r300_texture_setup_format_state(struct r300_screen *screen, boolean r300_resource_get_handle(struct pipe_screen* screen, struct pipe_resource *texture, - struct winsys_handle *whandle); + struct winsys_handle *whandle, + enum pipe_handle_usage usage); struct pipe_resource* r300_texture_from_handle(struct pipe_screen* screen, diff --git a/src/gallium/drivers/radeon/r600_texture.c b/src/gallium/drivers/radeon/r600_texture.c index c21d06f..b583d50 100644 --- a/src/gallium/drivers/radeon/r600_texture.c +++ b/src/gallium/drivers/radeon/r600_texture.c @@ -251,7 +251,8 @@ static void r600_texture_init_metadata(struct r600_texture *rtex, static boolean r600_texture_get_handle(struct pipe_screen* screen, struct pipe_resource *resource, - struct winsys_handle *whandle) + struct winsys_handle *whandle, + enum pipe_handle_usage usage) { struct r600_common_screen *rscreen = (struct r600_common_screen*)screen; struct r600_resource *res = (struct r600_resource*)resource; diff --git a/src/gallium/drivers/rbug/rbug_screen.c b/src/gallium/drivers/rbug/rbug_screen.c index ac76402..aee20df 100644 --- a/src/gallium/drivers/rbug/rbug_screen.c +++ b/src/gallium/drivers/rbug/rbug_screen.c @@ -176,14 +176,15 @@ rbug_screen_resource_from_handle(struct pipe_screen *_screen, static boolean rbug_screen_resource_get_handle(struct pipe_screen *_screen, struct pipe_resource *_resource, - struct winsys_handle *handle) + struct winsys_handle *handle, + enum pipe_handle_usage usage) { struct rbug_screen *rb_screen = rbug_screen(_screen); struct rbug_resource *rb_resource = rbug_resource(_resource); struct pipe_screen *screen = rb_screen->screen; struct pipe_resource *resource = rb_resource->resource; - return screen->resource_get_handle(screen, resource, handle); + return screen->resource_get_handle(screen, resource, handle, usage); } diff --git a/src/gallium/drivers/softpipe/sp_texture.c b/src/gallium/drivers/softpipe/sp_texture.c index 52df895..b381562 100644 --- a/src/gallium/drivers/softpipe/sp_texture.c +++ b/src/gallium/drivers/softpipe/sp_texture.c @@ -251,7 +251,8 @@ softpipe_resource_from_handle(struct pipe_screen *screen, static boolean softpipe_resource_get_handle(struct pipe_screen *screen, struct pipe_resource *pt, - struct winsys_handle *whandle) + struct winsys_handle *whandle, + enum pipe_handle_usage usage) { struct sw_winsys *winsys = softpipe_screen(screen)->winsys; struct softpipe_resource *spr = softpipe_resource(pt); diff --git a/src/gallium/drivers/trace/tr_screen.c b/src/gallium/drivers/trace/tr_screen.c index 0612109..d1a10f8 100644 --- a/src/gallium/drivers/trace/tr_screen.c +++ b/src/gallium/drivers/trace/tr_screen.c @@ -331,7 +331,8 @@ trace_screen_resource_from_handle(struct pipe_screen *_screen, static boolean trace_screen_resource_get_handle(struct pipe_screen *_screen, struct pipe_resource *_resource, - struct winsys_handle *handle) + struct winsys_handle *handle, + enum pipe_handle_usage usage) { struct trace_screen *tr_screen = trace_screen(_screen); struct trace_resource *tr_resource = trace_resource(_resource); @@ -340,7 +341,7 @@ trace_screen_resource_get_handle(struct pipe_screen *_screen, /* TODO trace call */ - return screen->resource_get_handle(screen, resource, handle); + return screen->resource_get_handle(screen, resource, handle, usage); } diff --git a/src/gallium/include/pipe/p_defines.h b/src/gallium/include/pipe/p_defines.h index 010be62..69a36d1 100644 --- a/src/gallium/include/pipe/p_defines.h +++ b/src/gallium/include/pipe/p_defines.h @@ -530,6 +530,17 @@ enum pipe_reset_status /** + * resource_get_handle flags. + */ +enum pipe_handle_usage { + /* Requires pipe_context::flush_resource before external use. */ + PIPE_HANDLE_USAGE_EXPLICIT_FLUSH, + + /* All other cases. */ + PIPE_HANDLE_USAGE_COHERENT, +}; + +/** * Implementation capabilities/limits which are queried through * pipe_screen::get_param() */ diff --git a/src/gallium/include/pipe/p_screen.h b/src/gallium/include/pipe/p_screen.h index 211bc24..b650672 100644 --- a/src/gallium/include/pipe/p_screen.h +++ b/src/gallium/include/pipe/p_screen.h @@ -206,7 +206,8 @@ struct pipe_screen { */ boolean (*resource_get_handle)(struct pipe_screen *, struct pipe_resource *tex, - struct winsys_handle *handle); + struct winsys_handle *handle, + enum pipe_handle_usage usage); void (*resource_destroy)(struct pipe_screen *, diff --git a/src/gallium/state_trackers/dri/dri2.c b/src/gallium/state_trackers/dri/dri2.c index a11a6cb..0c37da6 100644 --- a/src/gallium/state_trackers/dri/dri2.c +++ b/src/gallium/state_trackers/dri/dri2.c @@ -354,7 +354,7 @@ dri2_allocate_buffer(__DRIscreen *sPriv, whandle.type = DRM_API_HANDLE_TYPE_KMS; screen->base.screen->resource_get_handle(screen->base.screen, - buffer->resource, &whandle); + buffer->resource, &whandle, PIPE_HANDLE_USAGE_EXPLICIT_FLUSH); buffer->base.attachment = attachment; buffer->base.name = whandle.handle; @@ -899,25 +899,25 @@ dri2_query_image(__DRIimage *image, int attrib, int *value) case __DRI_IMAGE_ATTRIB_STRIDE: whandle.type = DRM_API_HANDLE_TYPE_KMS; image->texture->screen->resource_get_handle(image->texture->screen, - image->texture, &whandle); + image->texture, &whandle, PIPE_HANDLE_USAGE_COHERENT); *value = whandle.stride; return GL_TRUE; case __DRI_IMAGE_ATTRIB_HANDLE: whandle.type = DRM_API_HANDLE_TYPE_KMS; image->texture->screen->resource_get_handle(image->texture->screen, - image->texture, &whandle); + image->texture, &whandle, PIPE_HANDLE_USAGE_COHERENT); *value = whandle.handle; return GL_TRUE; case __DRI_IMAGE_ATTRIB_NAME: whandle.type = DRM_API_HANDLE_TYPE_SHARED; image->texture->screen->resource_get_handle(image->texture->screen, - image->texture, &whandle); + image->texture, &whandle, PIPE_HANDLE_USAGE_COHERENT); *value = whandle.handle; return GL_TRUE; case __DRI_IMAGE_ATTRIB_FD: whandle.type= DRM_API_HANDLE_TYPE_FD; image->texture->screen->resource_get_handle(image->texture->screen, - image->texture, &whandle); + image->texture, &whandle, PIPE_HANDLE_USAGE_COHERENT); *value = whandle.handle; return GL_TRUE; case __DRI_IMAGE_ATTRIB_FORMAT: diff --git a/src/gallium/state_trackers/nine/swapchain9.c b/src/gallium/state_trackers/nine/swapchain9.c index 1ab339c..c4a29cf 100644 --- a/src/gallium/state_trackers/nine/swapchain9.c +++ b/src/gallium/state_trackers/nine/swapchain9.c @@ -87,7 +87,8 @@ D3DWindowBuffer_create(struct NineSwapChain9 *This, memset(&whandle, 0, sizeof(whandle)); whandle.type = DRM_API_HANDLE_TYPE_FD; - This->screen->resource_get_handle(This->screen, resource, &whandle); + This->screen->resource_get_handle(This->screen, resource, &whandle, + PIPE_HANDLE_USAGE_EXPLICIT_FLUSH); stride = whandle.stride; dmaBufFd = whandle.handle; ID3DPresent_NewD3DWindowBufferFromDmaBuf(This->present, diff --git a/src/gallium/state_trackers/va/buffer.c b/src/gallium/state_trackers/va/buffer.c index c2c24d6..75a5a5c 100644 --- a/src/gallium/state_trackers/va/buffer.c +++ b/src/gallium/state_trackers/va/buffer.c @@ -302,7 +302,8 @@ vlVaAcquireBufferHandle(VADriverContextP ctx, VABufferID buf_id, memset(&whandle, 0, sizeof(whandle)); whandle.type = DRM_API_HANDLE_TYPE_FD; - if (!screen->resource_get_handle(screen, buf->derived_surface.resource, &whandle)) + if (!screen->resource_get_handle(screen, buf->derived_surface.resource, + &whandle, PIPE_HANDLE_USAGE_COHERENT)) return VA_STATUS_ERROR_INVALID_BUFFER; buf_info->handle = (intptr_t)whandle.handle; diff --git a/src/gallium/state_trackers/xa/xa_tracker.c b/src/gallium/state_trackers/xa/xa_tracker.c index d57464b..708fb2f 100644 --- a/src/gallium/state_trackers/xa/xa_tracker.c +++ b/src/gallium/state_trackers/xa/xa_tracker.c @@ -548,7 +548,8 @@ xa_surface_handle(struct xa_surface *srf, memset(&whandle, 0, sizeof(whandle)); whandle.type = handle_type(type); - res = screen->resource_get_handle(screen, srf->tex, &whandle); + res = screen->resource_get_handle(screen, srf->tex, &whandle, + PIPE_HANDLE_USAGE_COHERENT); if (!res) return -XA_ERR_INVAL; diff --git a/src/gallium/winsys/sw/wrapper/wrapper_sw_winsys.c b/src/gallium/winsys/sw/wrapper/wrapper_sw_winsys.c index 4d87a58..5fae986 100644 --- a/src/gallium/winsys/sw/wrapper/wrapper_sw_winsys.c +++ b/src/gallium/winsys/sw/wrapper/wrapper_sw_winsys.c @@ -201,7 +201,8 @@ wsw_dt_get_handle(struct sw_winsys *ws, struct wrapper_sw_displaytarget *wdt = wrapper_sw_displaytarget(dt); struct pipe_resource *tex = wdt->tex; - return wsw->screen->resource_get_handle(wsw->screen, tex, whandle); + return wsw->screen->resource_get_handle(wsw->screen, tex, whandle, + PIPE_HANDLE_USAGE_COHERENT); } static void * -- 2.5.0 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev