[Mesa-dev] [PATCH 5/5] st/mesa: use texture_barrier before CopyPixels blits where src == dst
Nicolai Hähnle
nhaehnle at gmail.com
Wed Jun 7 11:29:55 UTC 2017
On 06.06.2017 11:34, Marek Olšák wrote:
> On Tue, Jun 6, 2017 at 4:28 AM, Michel Dänzer <michel at daenzer.net> wrote:
>> On 06/06/17 01:50 AM, Marek Olšák wrote:
>>> From: Marek Olšák <marek.olsak at amd.com>
>>>
>>> radeonsi won't flush caches if set_framebuffer_state doesn't change
>>> anything.
>>> ---
>>> src/mesa/state_tracker/st_cb_drawpixels.c | 7 +++++++
>>> 1 file changed, 7 insertions(+)
>>>
>>> diff --git a/src/mesa/state_tracker/st_cb_drawpixels.c b/src/mesa/state_tracker/st_cb_drawpixels.c
>>> index 33d10f6..0ef05ef 100644
>>> --- a/src/mesa/state_tracker/st_cb_drawpixels.c
>>> +++ b/src/mesa/state_tracker/st_cb_drawpixels.c
>>> @@ -1400,20 +1400,27 @@ blit_copy_pixels(struct gl_context *ctx, GLint srcx, GLint srcy,
>>> st_window_rectangles_to_blit(ctx, &blit);
>>>
>>> if (screen->is_format_supported(screen, blit.src.format,
>>> blit.src.resource->target,
>>> blit.src.resource->nr_samples,
>>> PIPE_BIND_SAMPLER_VIEW) &&
>>> screen->is_format_supported(screen, blit.dst.format,
>>> blit.dst.resource->target,
>>> blit.dst.resource->nr_samples,
>>> PIPE_BIND_RENDER_TARGET)) {
>>> + /* If src == dst, make sure src is coherent with recent dst
>>> + * updates.
>>> + */
>>> + if (blit.src.resource == blit.dst.resource &&
>>> + screen->get_param(screen, PIPE_CAP_TEXTURE_BARRIER))
>>> + pipe->texture_barrier(pipe, PIPE_TEXTURE_BARRIER_SAMPLER);
>>> +
>>> pipe->blit(pipe, &blit);
>>
>> Maybe this should be handled within the pipe->blit hook? E.g., is this
>> necessary when using the SDMA engine in radeonsi?
>
> It's not necessary in that case, yet it's a CopyPixels optimization
> not worth spending time on.
There are other callers that might be affected by this, though. What
about BlitFramebuffer, for example? That would suggest that this flush
should be handled in si_blit or lower.
IIUC, the issue is sequences of glCopyPixels, glCopyTexImage, and
glBlitFramebuffer that copy within the same texture. All of those need a
flush inserted in between.
And actually, the same operations can be performed by plain old draw
calls, and they will be correct per OpenGL if the app explicitly
re-binds the framebuffer between draw calls.
If there is an issue, it's because the CSO context filters out the
framebuffer changes, right? So perhaps this should actually be fixed in
cso_set_framebuffer, *especially* if the flush is also needed for plain
old draw calls.
Do we have test cases for these issues? That would really help clarify
things...
Meanwhile, patches 1-4 are:
Reviewed-by: Nicolai Hähnle <nicolai.haehnle at amd.com>
>
> Marek
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
>
--
Lerne, wie die Welt wirklich ist,
Aber vergiss niemals, wie sie sein sollte.
More information about the mesa-dev
mailing list