<div dir="auto">Nv_image_formats adds all the core formats to gles.<div dir="auto"><br></div><div dir="auto">It's pretty easy to add them all in, so I don't see why not.</div></div><br><div class="gmail_quote"><div dir="ltr">On Tue, Dec 18, 2018, 03:17 Eduardo Lima Mitev <<a href="mailto:elima@igalia.com">elima@igalia.com</a> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><br>
<br>
On 12/18/18 9:05 AM, Eduardo Lima Mitev wrote:<br>
> On 12/17/18 10:02 PM, Ilia Mirkin wrote:<br>
>> Note that the format may not be known. I suspect that falls into your<br>
>> "default" case.<br>
>><br>
> <br>
> Hi Ilia,<br>
> <br>
> while on GLES profiles the format qualifier must be declared for all<br>
> image variables, it is true that core profiles allow to omit it for<br>
> writeonly-qualified images.<br>
> <br>
> I guess we can add a special case for GL_NONE to the switch, that also<br>
> returns 4 components, to at least not break current behavior if image<br>
> format is not known. What do you think?<br>
> <br>
<br>
Thinking a bit more about this, if we care about core profile then there<br>
are more GL formats to consider apart from those supported by GLES 3.1.<br>
<br>
However, since image format layout qualifiers were introduced in core<br>
4.20, I don't think we should care for now. So I would leave the patch<br>
as-is and fail the assert on unknown formats.<br>
<br>
Eduardo<br>
<br>
> Eduardo<br>
> <br>
>> On Mon, Dec 17, 2018 at 3:41 PM Eduardo Lima Mitev <<a href="mailto:elima@igalia.com" target="_blank" rel="noreferrer">elima@igalia.com</a>> wrote:<br>
>>><br>
>>> emit_intrinsic_store_image() is always using 4 components when<br>
>>> collecting registers for the value. When image has less than<br>
>>> 4 components (e.g, r32f, r32i, r32ui) this results in extra mov<br>
>>> instructions.<br>
>>><br>
>>> This patch uses the actual number of components from the image format.<br>
>>><br>
>>> For example, in a shader like:<br>
>>><br>
>>> layout (r32f, binding=0) writeonly uniform imageBuffer u_image;<br>
>>> ...<br>
>>> void main(void) {<br>
>>>    ...<br>
>>>    imageStore (u_image, some_offset, vec4(1.0));<br>
>>>    ...<br>
>>> }<br>
>>><br>
>>> instruction count is reduced in at least 3 instructions (note image<br>
>>> format is r32f, 1 component only).<br>
>>><br>
>>> This obviously reduces register pressure as well.<br>
>>> ---<br>
>>>  src/freedreno/ir3/ir3_compiler_nir.c | 34 ++++++++++++++++++++++++++--<br>
>>>  1 file changed, 32 insertions(+), 2 deletions(-)<br>
>>><br>
>>> diff --git a/src/freedreno/ir3/ir3_compiler_nir.c b/src/freedreno/ir3/ir3_compiler_nir.c<br>
>>> index 85f14f354d2..cc00602c249 100644<br>
>>> --- a/src/freedreno/ir3/ir3_compiler_nir.c<br>
>>> +++ b/src/freedreno/ir3/ir3_compiler_nir.c<br>
>>> @@ -1251,6 +1251,35 @@ emit_intrinsic_load_image(struct ir3_context *ctx, nir_intrinsic_instr *intr,<br>
>>>         ir3_split_dest(b, dst, sam, 0, 4);<br>
>>>  }<br>
>>><br>
>>> +/* Get the number of components of the different image formats supported<br>
>>> + * by the GLES 3.1 spec.<br>
>>> + */<br>
>>> +static unsigned<br>
>>> +get_num_components_for_glformat(GLuint format)<br>
>>> +{<br>
>>> +       switch (format) {<br>
>>> +       case GL_R32F:<br>
>>> +       case GL_R32I:<br>
>>> +       case GL_R32UI:<br>
>>> +               return 1;<br>
>>> +<br>
>>> +       case GL_RGBA32F:<br>
>>> +       case GL_RGBA16F:<br>
>>> +       case GL_RGBA8:<br>
>>> +       case GL_RGBA8_SNORM:<br>
>>> +       case GL_RGBA32I:<br>
>>> +       case GL_RGBA16I:<br>
>>> +       case GL_RGBA8I:<br>
>>> +       case GL_RGBA32UI:<br>
>>> +       case GL_RGBA16UI:<br>
>>> +       case GL_RGBA8UI:<br>
>>> +               return 4;<br>
>>> +<br>
>>> +       default:<br>
>>> +               assert(!"Unsupported GL format for image");<br>
>>> +       }<br>
>>> +}<br>
>>> +<br>
>>>  /* src[] = { deref, coord, sample_index, value }. const_index[] = {} */<br>
>>>  static void<br>
>>>  emit_intrinsic_store_image(struct ir3_context *ctx, nir_intrinsic_instr *intr)<br>
>>> @@ -1262,6 +1291,7 @@ emit_intrinsic_store_image(struct ir3_context *ctx, nir_intrinsic_instr *intr)<br>
>>>         struct ir3_instruction * const *coords = ir3_get_src(ctx, &intr->src[1]);<br>
>>>         unsigned ncoords = get_image_coords(var, NULL);<br>
>>>         unsigned tex_idx = get_image_slot(ctx, nir_src_as_deref(intr->src[0]));<br>
>>> +       unsigned ncomp = get_num_components_for_glformat(var->data.image.format);<br>
>>><br>
>>>         /* src0 is value<br>
>>>          * src1 is coords<br>
>>> @@ -1276,10 +1306,10 @@ emit_intrinsic_store_image(struct ir3_context *ctx, nir_intrinsic_instr *intr)<br>
>>>          */<br>
>>><br>
>>>         stib = ir3_STIB(b, create_immed(b, tex_idx), 0,<br>
>>> -                       ir3_create_collect(ctx, value, 4), 0,<br>
>>> +                       ir3_create_collect(ctx, value, ncomp), 0,<br>
>>>                         ir3_create_collect(ctx, coords, ncoords), 0,<br>
>>>                         offset, 0);<br>
>>> -       stib->cat6.iim_val = 4;<br>
>>> +       stib->cat6.iim_val = ncomp;<br>
>>>         stib->cat6.d = ncoords;<br>
>>>         stib->cat6.type = get_image_type(var);<br>
>>>         stib->cat6.typed = true;<br>
>>> --<br>
>>> 2.19.2<br>
>>><br>
>>> _______________________________________________<br>
>>> mesa-dev mailing list<br>
>>> <a href="mailto:mesa-dev@lists.freedesktop.org" target="_blank" rel="noreferrer">mesa-dev@lists.freedesktop.org</a><br>
>>> <a href="https://lists.freedesktop.org/mailman/listinfo/mesa-dev" rel="noreferrer noreferrer" target="_blank">https://lists.freedesktop.org/mailman/listinfo/mesa-dev</a><br>
>><br>
> _______________________________________________<br>
> mesa-dev mailing list<br>
> <a href="mailto:mesa-dev@lists.freedesktop.org" target="_blank" rel="noreferrer">mesa-dev@lists.freedesktop.org</a><br>
> <a href="https://lists.freedesktop.org/mailman/listinfo/mesa-dev" rel="noreferrer noreferrer" target="_blank">https://lists.freedesktop.org/mailman/listinfo/mesa-dev</a><br>
> <br>
</blockquote></div>