aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIago Toral Quiroga <[email protected]>2018-07-31 15:37:59 +0200
committerAlejandro PiƱeiro <[email protected]>2018-08-13 16:28:27 +0200
commit40947d47445e5791d11209e27a64ef5fa9fdc40b (patch)
treeb7a738609faf581e2d21414dcd99fb81236bf90b
parent32e1d4c34b3d153ce20726a39eac5f93d8ef26dc (diff)
mesa/glspirv: pick off the only entry point we need
This is the same we do for vulkan drivers This is needed to pass the following CTS test: KHR-GL45.gl_spirv.spirv_modules_shader_binary_multiple_shader_objects_test Reviewed-by: Timothy Arceri <[email protected]>
-rw-r--r--src/mesa/main/glspirv.c15
1 files changed, 15 insertions, 0 deletions
diff --git a/src/mesa/main/glspirv.c b/src/mesa/main/glspirv.c
index 7af73efd589..5a2d6a4bb2a 100644
--- a/src/mesa/main/glspirv.c
+++ b/src/mesa/main/glspirv.c
@@ -252,8 +252,23 @@ _mesa_spirv_to_nir(struct gl_context *ctx,
prog->Name);
nir_validate_shader(nir);
+ /* We have to lower away local constant initializers right before we
+ * inline functions. That way they get properly initialized at the top
+ * of the function and not at the top of its caller.
+ */
+ NIR_PASS_V(nir, nir_lower_constant_initializers, nir_var_local);
+ NIR_PASS_V(nir, nir_lower_returns);
+ NIR_PASS_V(nir, nir_inline_functions);
NIR_PASS_V(nir, nir_copy_prop);
+ /* Pick off the single entrypoint that we want */
+ foreach_list_typed_safe(nir_function, func, node, &nir->functions) {
+ if (func != entry_point)
+ exec_node_remove(&func->node);
+ }
+ assert(exec_list_length(&nir->functions) == 1);
+ entry_point->name = ralloc_strdup(entry_point, "main");
+
/* Split member structs. We do this before lower_io_to_temporaries so that
* it doesn't lower system values to temporaries by accident.
*/