linker: Assign varying locations for separable programs
Signed-off-by: Ian Romanick <ian.d.romanick@intel.com>
This commit is contained in:
@@ -1198,6 +1198,23 @@ assign_varying_locations(struct gl_context *ctx,
|
|||||||
matches.record(output_var, input_var);
|
matches.record(output_var, input_var);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
/* If there's no producer stage, then this must be a separable program.
|
||||||
|
* For example, we may have a program that has just a fragment shader.
|
||||||
|
* Later this program will be used with some arbitrary vertex (or
|
||||||
|
* geometry) shader program. This means that locations must be assigned
|
||||||
|
* for all the inputs.
|
||||||
|
*/
|
||||||
|
foreach_list(node, consumer->ir) {
|
||||||
|
ir_variable *const input_var =
|
||||||
|
((ir_instruction *) node)->as_variable();
|
||||||
|
|
||||||
|
if ((input_var == NULL) ||
|
||||||
|
(input_var->data.mode != ir_var_shader_in))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
matches.record(NULL, input_var);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (unsigned i = 0; i < num_tfeedback_decls; ++i) {
|
for (unsigned i = 0; i < num_tfeedback_decls; ++i) {
|
||||||
|
@@ -2502,7 +2502,7 @@ link_shaders(struct gl_context *ctx, struct gl_shader_program *prog)
|
|||||||
if (last >= 0 && last < MESA_SHADER_FRAGMENT) {
|
if (last >= 0 && last < MESA_SHADER_FRAGMENT) {
|
||||||
gl_shader *const sh = prog->_LinkedShaders[last];
|
gl_shader *const sh = prog->_LinkedShaders[last];
|
||||||
|
|
||||||
if (num_tfeedback_decls != 0) {
|
if (num_tfeedback_decls != 0 || prog->SeparateShader) {
|
||||||
/* There was no fragment shader, but we still have to assign varying
|
/* There was no fragment shader, but we still have to assign varying
|
||||||
* locations for use by transform feedback.
|
* locations for use by transform feedback.
|
||||||
*/
|
*/
|
||||||
@@ -2516,6 +2516,7 @@ link_shaders(struct gl_context *ctx, struct gl_shader_program *prog)
|
|||||||
do_dead_builtin_varyings(ctx, sh, NULL,
|
do_dead_builtin_varyings(ctx, sh, NULL,
|
||||||
num_tfeedback_decls, tfeedback_decls);
|
num_tfeedback_decls, tfeedback_decls);
|
||||||
|
|
||||||
|
if (!prog->SeparateShader)
|
||||||
demote_shader_inputs_and_outputs(sh, ir_var_shader_out);
|
demote_shader_inputs_and_outputs(sh, ir_var_shader_out);
|
||||||
|
|
||||||
/* Eliminate code that is now dead due to unused outputs being demoted.
|
/* Eliminate code that is now dead due to unused outputs being demoted.
|
||||||
@@ -2531,6 +2532,15 @@ link_shaders(struct gl_context *ctx, struct gl_shader_program *prog)
|
|||||||
do_dead_builtin_varyings(ctx, NULL, sh,
|
do_dead_builtin_varyings(ctx, NULL, sh,
|
||||||
num_tfeedback_decls, tfeedback_decls);
|
num_tfeedback_decls, tfeedback_decls);
|
||||||
|
|
||||||
|
if (prog->SeparateShader) {
|
||||||
|
if (!assign_varying_locations(ctx, mem_ctx, prog,
|
||||||
|
NULL /* producer */,
|
||||||
|
sh /* consumer */,
|
||||||
|
0 /* num_tfeedback_decls */,
|
||||||
|
NULL /* tfeedback_decls */,
|
||||||
|
0 /* gs_input_vertices */))
|
||||||
|
goto done;
|
||||||
|
} else
|
||||||
demote_shader_inputs_and_outputs(sh, ir_var_shader_in);
|
demote_shader_inputs_and_outputs(sh, ir_var_shader_in);
|
||||||
|
|
||||||
while (do_dead_code(sh->ir, false))
|
while (do_dead_code(sh->ir, false))
|
||||||
|
Reference in New Issue
Block a user