[Mesa-dev] [PATCH] nir/linker: Add nir_link_uniforms()

Timothy Arceri tarceri at itsqueeze.com
Mon Apr 30 11:02:26 UTC 2018


On 30/04/18 16:59, Alejandro Piñeiro wrote:
> On 29/04/18 12:09, Timothy Arceri wrote:
>> On 29/04/18 19:05, Alejandro Piñeiro wrote:
>>> On 29/04/18 10:13, Timothy Arceri wrote:
>>>> On 29/04/18 16:48, Alejandro Piñeiro wrote:
>>>>> From: Eduardo Lima Mitev <elima at igalia.com>
>>>>>
>>>>> This function will be the entry point for linking the uniforms from
>>>>> the nir_shader objects associated with the gl_linked_shaders of a
>>>>> program.
>>>>>
>>>>> This patch includes initial support for linking uniforms from NIR
>>>>> shaders. It is tailored for the ARB_gl_spirv needs, and it is far from
>>>>> complete, but it should handle most cases of uniforms, array
>>>>> uniforms, structs, samplers and images.
>>>>>
>>>>> There are some FIXMEs related to specific features that will be
>>>>> implemented in following patches, like atomic counters, UBOs and
>>>>> SSBOs.
>>>>>
>>>>> Also, note that ARB_gl_spirv makes mandatory explicit location for
>>>>> normal uniforms, so this code only handles uniforms with explicit
>>>>> location. But there are cases, like uniform atomic counters, that
>>>>> doesn't have a location from the OpenGL point of view (they have a
>>>>> binding), but that Mesa assign internally a location. That will be
>>>>> handled on following patches.
>>>>>
>>>>> A nir_linker.h file is also added. More NIR-linking related API will
>>>>> be added in subsequent patches and those will include stuff from Mesa,
>>>>> so reusing nir.h didn't seem a good idea.
>>>>
>>>> These files should actually be src/compiler/glsl/nir_link_uniforms.c
>>>> etc these are not general purpose nir helpers they are GLSL specific.
>>>
>>> Yes, it is true that are not general purpose nir helpers, but they are
>>> not GLSL specific either. As mentioned on the commit message and on the
>>> introductory comment, it is heavily tailored for ARB_gl_spirv, so they
>>> are SPIR-V specific.
>>
>> But why? Why not try to make it reusable as a linker for GLSL? What 
>> exactly is tailored for ARB_gl_spirv? And does this really block us 
>> reusing it for GLSL?
>>
>> I've expressed my opinion on this long ago, we are very close to being 
>> able to implement a NIR linker for GLSL, spending a little effort 
>> designing this linker code as share-able seems like a no brainer to me.
> 
> Yes, it is true that we didn't explain in detail that decision on the 
> mailing list. We briefly mentioned that on the patches that we were 
> sending to the list, and explained on my presentation on FOSDEM [1], 
> where Nicolai mentioned during the Q&A section that they agreed to us 
> (at least with going for a nir-based linking). In fact, at the beginning 
> we also hoped that this work would be more aligned with a more general 
> nir-linker, and more easily reused for a nir-based GLSL linker, but our 
> opinion changed as we started to code the needs for this extension.
> 
> In summary the main reason are the names. Right now GLSL linking is 
> based on the names. Uniform name, ubo name, and so on. So for example, 
> from link_uniform_blocks.cpp:
> 
>     /* This hash table will track all of the uniform blocks that have been
>      * encountered.  Since blocks with the same block-name must be the same,
>      * the hash is organized by block-name.
>      */
> 
> And most the validation rules on GLSL are based, or include somehow, the 
> name of the variables.
> 
> But on ARB_gl_spirv, everything should work without names. Read as 
> example issues 12, 21 and 22 of the spec [2] as a reference. In fact 
> names are optional even if the SPIR-V include them (see issue 19). So 
> the linking for nir shaders coming from ARB_gl_spirv should work based 
> on the location, binding, offsets, etc. With the previous example, ubos 
> are linked using the binding. So explicit bindings are now mandatory (so 
> the validation rule here change, as not having a explicit binding can be 
> raised as an error).
> 
> So in order to work for ARB_gl_spirv it should work without names. In 
> order to reuse it for GLSL it should work with names, in fact based on 
> them. Validation rules for both are different. And getting both working 
> at the same time would just add a complexity that IMHO we don't need 
> right now. We already have a GLSL linker, so it is not really worth 
> right now to get this new NIR linker to work there too. Right now we are 
> focusing on getting ARB_gl_spirv linkage working.
> 
> Another reason is that ARB_gl_spirv GLSL supported features are not 
> exactly any existing GLSL. It is based on GL_KHR_vulkan_glsl, but at the 
> same time, slightly tweaked. See "Differences Relative to Other 
> Specifications" on the ARB_gl_spirv spec [2].
> 
> So perhaps in the future some of this work could be reused for nir-base 
> linker for GLSL. But, IMHO, that shouldn't be one of the features 
> driving the development. I think that we should work first on what it is 
> not supported.

None of this looks like anything that should block reuse of at least 
large parts of a NIR linker between the two IRs. Names can be easily 
mapped to numerical ids which we assign in glsl either internally or via 
the API/shader in one why our another.

I'm not saying you must implement a GLSL linker right now, I'm just 
saying it would be a good idea to design the linker in a way you think 
would make it easy to code share in future.


<snip>

The snipped section was covered in a different reply thread.


More information about the mesa-dev mailing list