Skip to content
  • Neil Roberts's avatar
    spirv/nir: handle location decorations on block interface members · dfc3a7cb
    Neil Roberts authored and Alejandro Piñeiro's avatar Alejandro Piñeiro committed
    Previously the code was taking any location decoration on the block
    and using that to calculate the member locations for all of the
    members. I think this was assuming that there would only be one
    location decoration for the entire block. According to the Vulkan spec
    it is possible to add location decorations to individual members:
    
       “If the structure type is a Block but without a Location, then each
        of its members must have a Location decoration. If it is a Block
        with a Location decoration, then its members are assigned
        consecutive locations in declaration order, starting from the
        first member which is initially the Block. Any member with its own
        Location decoration is assigned that location. Each remaining
        member is assigned the location after the immediately preceding
        member in declaration order.”
    
    This patch makes it instead keep track of which members have been
    assigned an explicit location. It also has a space to store the
    location for the struct as a whole. Once all the decorations have been
    processed it iterates over each member to fill in the missing
    locations using the rules described above.
    
    So, this commit is needed to get working a case like this, on both
    Vulkan and OpenGL using SPIR-V (ARB_gl_spirv):
    
         out block {
                layout(location = 2) vec4 c;
                layout(location = 3) vec4 d;
                layout(location = 0) vec4 a;
                layout(location = 1) vec4 b;
         } name;
    
    v2: (changes made by Alejandro Piñeiro)
       * Update after introducing struct member splitting (See commit b0c643d8
    
    )
       * Update after only exposing interface_type for blocks, not to any struct
       * Update after last changes done for xfb support
    
    v3: use "assign" instead of "add" on the new method added (Tapani)
    
    Signed-off-by: default avatarNeil Roberts <nroberts@igalia.com>
    Signed-off-by: default avatarAlejandro Piñeiro <apinheiro@igalia.com>
    
    Reviewed-by: default avatarTapani Pälli <tapani.palli@intel.com>
    dfc3a7cb