[Mesa-dev] [PATCH 5/5] st/mesa: use texture_barrier before CopyPixels blits where src == dst

Marek Olšák maraeo at gmail.com
Wed Jun 7 17:32:12 UTC 2017


On Wed, Jun 7, 2017 at 1:29 PM, Nicolai Hähnle <nhaehnle at gmail.com> wrote:
> 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.

cso_set_framebuffer does filter things, but my new radeonsi patch for
si_set_framebuffer_state uses a smarter filtering. IMO,
set_framebuffer_state is a wrong place to do the flush if the state
change is a no-op or only a format change, which is typical for
glEnable(GL_FRAMEBUFFER_SRGB).

The only issue I see with pipe->blit and resource_copy_region is when:
- src == dst
- the current framebuffer is dst

We could put the texture barrier into si_blit and
si_resource_copy_region based those constraints.

AFAIK, we only have a piglit for CopyPixels, which is fixed by this patch.

Marek


More information about the mesa-dev mailing list