+/**
+ * Precompiles a shader variant at shader state creation time if
+ * V3D_DEBUG=precompile is set. Used for shader-db
+ * (https://gitlab.freedesktop.org/mesa/shader-db)
+ */
+static void
+v3d_shader_precompile(struct v3d_context *v3d,
+ struct v3d_uncompiled_shader *so)
+{
+ nir_shader *s = so->base.ir.nir;
+
+ if (s->info.stage == MESA_SHADER_FRAGMENT) {
+ struct v3d_fs_key key = {
+ .base.shader_state = so,
+ };
+
+ v3d_setup_shared_precompile_key(so, &key.base);
+ v3d_get_compiled_shader(v3d, &key.base);
+ } else {
+ struct v3d_vs_key key = {
+ .base.shader_state = so,
+ };
+
+ v3d_setup_shared_precompile_key(so, &key.base);
+
+ /* Compile VS: All outputs */
+ for (int vary = 0; vary < 64; vary++) {
+ if (!(s->info.outputs_written & (1ull << vary)))
+ continue;
+ for (int i = 0; i < 4; i++) {
+ key.fs_inputs[key.num_fs_inputs++] =
+ v3d_slot_from_slot_and_component(vary,
+ i);
+ }
+ }
+
+ v3d_get_compiled_shader(v3d, &key.base);
+
+ /* Compile VS bin shader: only position (XXX: include TF) */
+ key.is_coord = true;
+ key.num_fs_inputs = 0;
+ for (int i = 0; i < 4; i++) {
+ key.fs_inputs[key.num_fs_inputs++] =
+ v3d_slot_from_slot_and_component(VARYING_SLOT_POS,
+ i);
+ }
+ v3d_get_compiled_shader(v3d, &key.base);
+ }
+}
+