[Mesa-dev] ipers performance regression (Was: u_upload_mgr changes)
Marek Olšák
maraeo at gmail.com
Mon Jan 4 06:03:06 PST 2016
On Mon, Jan 4, 2016 at 2:09 PM, Jose Fonseca <jfonseca at vmware.com> wrote:
> On 04/01/16 12:25, Jose Fonseca wrote:
>>
>> On 21/12/15 22:35, Marek Olšák wrote:
>>>
>>> Hi,
>>>
>>> This patch series adds more flexibility to u_upload_mgr. First, it
>>> adds the ability to specify the alignment per suballocation. The idea
>>> is that several users can use the same upload buffer, but each may
>>> need a different alignment. Finally, it allows specifying PIPE_USAGE,
>>> which usually affects memory placement.
>>>
>>> Please review.
>>>
>>> Marek
>>> _______________________________________________
>>> mesa-dev mailing list
>>> mesa-dev at lists.freedesktop.org
>>> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
>>>
>>
>> Hi Marek,
>>
>> This patch series, or the commit
>>
>>
>>
>> http://cgit.freedesktop.org/mesa/mesa/commit/?id=36c93a6fae275614b6004ec5ab085774d527e1bc
>
>
> I bisected and it turns out that 36c93a6fae275614b6004ec5ab085774d527e1bc is
> the bad commit, and not the u_upload_mgr series.
>
> In particular the issue steams from the hunk:
> +
> + /* We uploaded modified constants, need to invalidate them. */
> + st->dirty.mesa |= _NEW_PROGRAM_CONSTANTS;
>
> I suspect that drawing the text via glBitmap suddently became a huge hotspot
> becuase of this. If one disables the help text (pressing h) there's no
> performance regression (frame rate is the same).
>
>
>
> The need for the constants is explained above:
>
> /* As an optimization, Mesa's fragment programs will sometimes get the
> * primary color from a statevar/constant rather than a varying
> variable.
> * when that's the case, we need to ensure that we use the 'color'
> * parameter and not the current attribute color (which may have
> changed
> * through glRasterPos and state validation.
> * So, we force the proper color here. Not elegant, but it works.
> */
> {
> GLfloat colorSave[4];
> COPY_4V(colorSave, ctx->Current.Attrib[VERT_ATTRIB_COLOR0]);
> COPY_4V(ctx->Current.Attrib[VERT_ATTRIB_COLOR0], color);
> st_upload_constants(st, st->fp->Base.Base.Parameters,
> PIPE_SHADER_FRAGMENT);
> COPY_4V(ctx->Current.Attrib[VERT_ATTRIB_COLOR0], colorSave);
> }
>
> I wonder if putting colors in constants as opposed to vertex buffer with
> zero stride or an INT_MAX instancing divisor is really a good idea.
It's a good idea from the GPU perspective.
Using a vertex buffer is:
- one load instruction per thread in vertex shaders (64 per thread
group, though the cache should hide 63 of them in theory)
- the vertex shader output must be written (64 per thread group), so
on-chip memory must be allocated, which reduces parallelism just like
register usage reduces parallelism
- the pixel shader must load and interpolate the input (interpolation
= 3 on-chip vec4 loads per thread, 2 MAD instructions per thread, all
multiplied by 64)
Using a constant buffer is:
- 1 load instruction per entire pixel shader thread group on GCN,
because the constant load executes on a separate scalar unit and not
on SIMD units. This is best for performance and low power.
> Anyway, if this only affects llvmpipe, no biggie, but if this change makes
> text rendering via glBitmap much slower for all HW drivers, then we should
> probably revisit this.
IIRC, ipers is CPU-bound, so any GPU improvement won't be seen here,
but any additional overhead in st/mesa will hurt. Also, do we have
know any real apps using glBitmap?
Marek
More information about the mesa-dev
mailing list