Skip to content
  • Timothy Arceri's avatar
    mesa/glsl: delete previously linked shaders earlier when linking · d2861d68
    Timothy Arceri authored
    
    
    This moves the delete linked shaders call to
    _mesa_clear_shader_program_data() which makes sure we delete them
    before returning due to any validation problems.
    
    It also reduces some code duplication.
    
    From the OpenGL 4.5 Core spec:
    
       "If LinkProgram failed, any information about a previous link of
       that program object is lost. Thus, a failed link does not restore
       the old state of program.
    
       ...
    
       If one of these commands is called with a program for which
       LinkProgram failed, no error is generated unless otherwise noted.
       Implementations may return information on variables and interface
       blocks that would have been active had the program been linked
       successfully. In cases where the link failed because the program
       required too many resources, these commands may help applications
       determine why limits were exceeded."
    
    Therefore it's expected that we shouldn't be able to query the
    program that failed to link and retrieve information about a
    previously successful link.
    
    Before this change the linker was doing validation before freeing
    the previously linked shaders and therefore could exit on failure
    before they were freed.
    
    This change also fixes an issue in compat profile where a program
    with no shaders attached is expect to fall back to fixed function
    but was instead trying to relink IR from a previous link.
    
    Reviewed-by: default avatarTapani Pälli <tapani.palli@intel.com>
    Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=97715
    Cc: "13.0" <mesa-stable@lists.freedesktop.org>
    d2861d68