Skip to content
  • Kenneth Graunke's avatar
    i965: Handle mix-and-match TCS/TES with separate shader objects. · 794eb9d7
    Kenneth Graunke authored
    
    
    GL_ARB_separate_shader_objects allows the application to mix-and-match
    TCS and TES programs separately.  This means that the interface between
    the two stages isn't known until the final SSO pipeline is in place.
    
    This isn't a great match for our hardware: the TCS and TES have to agree
    on the Patch URB entry layout.  Since we store data as per-patch slots
    followed by per-vertex slots, changing the number of per-patch slots can
    significantly alter the layout.  This can easily happen with SSO.
    
    To handle this, we store the [Patch]OutputsWritten and [Patch]InputsRead
    bitfields in the TCS/TES program keys, introducing program recompiles.
    brw_upload_programs() decides the layout for both TCS and TES, and
    passes it to brw_upload_tcs/tes(), which store it in the key.
    
    When creating the NIR for a shader specialization, we override
    nir->info.inputs_read (and friends) to the program key's values.
    Since everything uses those, no further compiler changes are needed.
    This also replaces the hack in brw_create_nir().
    
    To avoid recompiles, brw_precompile_tes() looks to see if there's a
    TCS in the linked shader.  If so, it accounts for the TCS outputs,
    just as brw_upload_programs() would.  This eliminates all recompiles
    in the non-SSO case.  In the SSO case, there should only be recompiles
    when using a TCS and TES that have different input/output interfaces.
    
    Fixes Piglit's mix-and-match-tcs-tes test.
    
    v2: Pull the brw_upload_programs code into a brw_upload_tess_programs()
        helper function (requested by Jordan Justen).
    
    Signed-off-by: Kenneth Graunke's avatarKenneth Graunke <kenneth@whitecape.org>
    Reviewed-by: default avatarJordan Justen <jordan.l.justen@intel.com>
    794eb9d7