Add a new bind flag to differentiate shared resources that must be readable after any flush, or that can afford being readable only after flush_resource.
Previously the two cases were mixed, and implictly things were done such that there would be no issues. flush_resource is called for: . st/nine back buffers . dri2 and dri3 back buffers (both wayland and x11) flush_resource is not called for: . gbm buffers . dri2 and dri3 x11 (fake/real) front buffers . EGLImages (they can be shared) I didn't look at what the other state trackers do, but a grep said there is no flush_resource call outside dri2 and nine state trackers. Signed-off-by: Axel Davy <axel.d...@ens.fr> --- src/gallium/include/pipe/p_defines.h | 8 ++++++++ src/gallium/state_trackers/dri/dri2.c | 17 +++++++++-------- src/gallium/state_trackers/dri/dri_drawable.c | 9 +++++++-- src/gallium/state_trackers/nine/swapchain9.c | 10 +++++++--- 4 files changed, 31 insertions(+), 13 deletions(-) diff --git a/src/gallium/include/pipe/p_defines.h b/src/gallium/include/pipe/p_defines.h index 1ad545a..f877893 100644 --- a/src/gallium/include/pipe/p_defines.h +++ b/src/gallium/include/pipe/p_defines.h @@ -399,6 +399,14 @@ enum pipe_flush_flags #define PIPE_BIND_SHARED (1 << 19) /* get_texture_handle ??? */ #define PIPE_BIND_LINEAR (1 << 20) +/* This flag indicates that in addition to being shared, the resource won't be + * read by any external process before we call flush_resource. This allows + * things like compressing the buffer when drawing, while uncompressing on + * flush_resource. The PIPE_BIND_SHARED must still be set with this flag. + * If PIPE_BIND_SHARED is specified but not + * PIPE_BIND_SHARED_FLUSH_RESOURCE, then the resource must be + * readable by external processes after any normal flush. */ +#define PIPE_BIND_SHARED_FLUSH_RESOURCE (1 << 21) /** * Flags for the driver about resource behaviour: diff --git a/src/gallium/state_trackers/dri/dri2.c b/src/gallium/state_trackers/dri/dri2.c index 5f5bc86..74b398f 100644 --- a/src/gallium/state_trackers/dri/dri2.c +++ b/src/gallium/state_trackers/dri/dri2.c @@ -291,27 +291,25 @@ dri2_allocate_buffer(__DRIscreen *sPriv, struct dri2_buffer *buffer; struct pipe_resource templ; enum pipe_format pf; - unsigned bind = 0; + unsigned bind = PIPE_BIND_SHARED; /* because we get the handle and stride */ struct winsys_handle whandle; switch (attachment) { case __DRI_BUFFER_FRONT_LEFT: case __DRI_BUFFER_FAKE_FRONT_LEFT: - bind = PIPE_BIND_RENDER_TARGET | PIPE_BIND_SAMPLER_VIEW; + bind |= PIPE_BIND_RENDER_TARGET | PIPE_BIND_SAMPLER_VIEW; break; case __DRI_BUFFER_BACK_LEFT: - bind = PIPE_BIND_RENDER_TARGET | PIPE_BIND_SAMPLER_VIEW; + bind |= PIPE_BIND_RENDER_TARGET | PIPE_BIND_SAMPLER_VIEW | + PIPE_BIND_SHARED_FLUSH_RESOURCE; break; case __DRI_BUFFER_DEPTH: case __DRI_BUFFER_DEPTH_STENCIL: case __DRI_BUFFER_STENCIL: - bind = PIPE_BIND_DEPTH_STENCIL; /* XXX sampler? */ + bind |= PIPE_BIND_DEPTH_STENCIL; /* XXX sampler? */ break; } - /* because we get the handle and stride */ - bind |= PIPE_BIND_SHARED; - switch (format) { case 32: pf = PIPE_FORMAT_BGRA8888_UNORM; @@ -555,7 +553,8 @@ dri2_allocate_textures(struct dri_context *ctx, if (drawable->textures[statt]) { templ.format = drawable->textures[statt]->format; templ.bind = drawable->textures[statt]->bind & - ~(PIPE_BIND_SCANOUT | PIPE_BIND_SHARED); + ~(PIPE_BIND_SCANOUT | PIPE_BIND_SHARED | + PIPE_BIND_SHARED_FLUSH_RESOURCE); templ.nr_samples = drawable->stvis.samples; /* Try to reuse the resource. @@ -834,6 +833,8 @@ dri2_create_image(__DRIscreen *_screen, tex_usage |= PIPE_BIND_SCANOUT; if (use & __DRI_IMAGE_USE_SHARE) tex_usage |= PIPE_BIND_SHARED; + if (use & __DRI_IMAGE_USE_BACKBUFFER) + tex_usage |= PIPE_BIND_SHARED | PIPE_BIND_SHARED_FLUSH_RESOURCE; if (use & __DRI_IMAGE_USE_LINEAR) tex_usage |= PIPE_BIND_LINEAR; if (use & __DRI_IMAGE_USE_CURSOR) { diff --git a/src/gallium/state_trackers/dri/dri_drawable.c b/src/gallium/state_trackers/dri/dri_drawable.c index 04041d6..badd111 100644 --- a/src/gallium/state_trackers/dri/dri_drawable.c +++ b/src/gallium/state_trackers/dri/dri_drawable.c @@ -276,9 +276,7 @@ dri_drawable_get_format(struct dri_drawable *drawable, { switch (statt) { case ST_ATTACHMENT_FRONT_LEFT: - case ST_ATTACHMENT_BACK_LEFT: case ST_ATTACHMENT_FRONT_RIGHT: - case ST_ATTACHMENT_BACK_RIGHT: /* Other pieces of the driver stack get confused and behave incorrectly * when they get an sRGB drawable. st/mesa receives "drawable->stvis" * though other means and handles it correctly, so we don't really need @@ -288,6 +286,13 @@ dri_drawable_get_format(struct dri_drawable *drawable, *bind = PIPE_BIND_RENDER_TARGET | PIPE_BIND_SAMPLER_VIEW | PIPE_BIND_SHARED; break; + case ST_ATTACHMENT_BACK_LEFT: + case ST_ATTACHMENT_BACK_RIGHT: + /* Idem */ + *format = util_format_linear(drawable->stvis.color_format); + *bind = PIPE_BIND_RENDER_TARGET | PIPE_BIND_SAMPLER_VIEW | + PIPE_BIND_SHARED | PIPE_BIND_SHARED_FLUSH_RESOURCE; + break; case ST_ATTACHMENT_DEPTH_STENCIL: *format = drawable->stvis.depth_stencil_format; *bind = PIPE_BIND_DEPTH_STENCIL; /* XXX sampler? */ diff --git a/src/gallium/state_trackers/nine/swapchain9.c b/src/gallium/state_trackers/nine/swapchain9.c index 3f5be26..39da084 100644 --- a/src/gallium/state_trackers/nine/swapchain9.c +++ b/src/gallium/state_trackers/nine/swapchain9.c @@ -296,7 +296,8 @@ NineSwapChain9_Resize( struct NineSwapChain9 *This, PIPE_BIND_TRANSFER_WRITE | PIPE_BIND_RENDER_TARGET; tmplt.nr_samples = pParams->MultiSampleType; if (!has_present_buffers) - tmplt.bind |= PIPE_BIND_SHARED | PIPE_BIND_SCANOUT | PIPE_BIND_DISPLAY_TARGET; + tmplt.bind |= PIPE_BIND_SHARED | PIPE_BIND_SHARED_FLUSH_RESOURCE | + PIPE_BIND_SCANOUT | PIPE_BIND_DISPLAY_TARGET; tmplt.format = d3d9_to_pipe_format_checked(This->screen, pParams->BackBufferFormat, PIPE_TEXTURE_2D, @@ -330,7 +331,9 @@ NineSwapChain9_Resize( struct NineSwapChain9 *This, } if (has_present_buffers) { tmplt.format = PIPE_FORMAT_B8G8R8X8_UNORM; - tmplt.bind = PIPE_BIND_SAMPLER_VIEW | PIPE_BIND_SHARED | PIPE_BIND_SCANOUT | PIPE_BIND_DISPLAY_TARGET; + tmplt.bind = PIPE_BIND_SAMPLER_VIEW | PIPE_BIND_SHARED | + PIPE_BIND_SHARED_FLUSH_RESOURCE | PIPE_BIND_SCANOUT | + PIPE_BIND_DISPLAY_TARGET; tmplt.nr_samples = 0; if (This->actx->linear_framebuffer) tmplt.bind |= PIPE_BIND_LINEAR; @@ -540,7 +543,8 @@ create_present_buffer( struct NineSwapChain9 *This, tmplt.format = PIPE_FORMAT_B8G8R8X8_UNORM; tmplt.bind = PIPE_BIND_SAMPLER_VIEW | PIPE_BIND_TRANSFER_READ | PIPE_BIND_TRANSFER_WRITE | PIPE_BIND_RENDER_TARGET | - PIPE_BIND_SHARED | PIPE_BIND_SCANOUT | PIPE_BIND_DISPLAY_TARGET; + PIPE_BIND_SHARED | PIPE_BIND_SHARED_FLUSH_RESOURCE | + PIPE_BIND_SCANOUT | PIPE_BIND_DISPLAY_TARGET; tmplt.nr_samples = 0; if (This->actx->linear_framebuffer) tmplt.bind |= PIPE_BIND_LINEAR; -- 2.6.1 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev