iris: compile a TCS...don't bother with passthrough yet
authorKenneth Graunke <kenneth@whitecape.org>
Tue, 17 Jul 2018 21:21:42 +0000 (14:21 -0700)
committerKenneth Graunke <kenneth@whitecape.org>
Thu, 21 Feb 2019 18:26:07 +0000 (10:26 -0800)
src/gallium/drivers/iris/iris_program.c

index 7a11840590e080e9bc02154a40923cc1a0b4b3c3..1a425eb53338651174b9cbe937d74bbf5025a267 100644 (file)
@@ -386,10 +386,70 @@ get_unified_tess_slots(const struct iris_context *ice,
    }
 }
 
+static bool
+iris_compile_tcs(struct iris_context *ice,
+                 struct iris_uncompiled_shader *ish,
+                 const struct brw_tcs_prog_key *key)
+{
+   struct iris_screen *screen = (struct iris_screen *)ice->ctx.screen;
+   const struct brw_compiler *compiler = screen->compiler;
+   const struct gen_device_info *devinfo = &screen->devinfo;
+   void *mem_ctx = ralloc_context(NULL);
+   struct brw_tcs_prog_data *tcs_prog_data =
+      rzalloc(mem_ctx, struct brw_tcs_prog_data);
+   struct brw_vue_prog_data *vue_prog_data = &tcs_prog_data->base;
+   struct brw_stage_prog_data *prog_data = &vue_prog_data->base;
+
+   assert(ish->base.type == PIPE_SHADER_IR_NIR);
+
+   nir_shader *nir = ish->base.ir.nir;
+
+   assign_common_binding_table_offsets(devinfo, nir, prog_data, 0);
+
+   iris_setup_uniforms(compiler, mem_ctx, nir, prog_data);
+
+   char *error_str = NULL;
+   const unsigned *program =
+      brw_compile_tcs(compiler, &ice->dbg, mem_ctx, key, tcs_prog_data, nir,
+                      -1, &error_str);
+   if (program == NULL) {
+      dbg_printf("Failed to compile evaluation shader: %s\n", error_str);
+      ralloc_free(mem_ctx);
+      return false;
+   }
+
+   iris_setup_push_uniform_range(compiler, prog_data);
+
+   iris_upload_and_bind_shader(ice, IRIS_CACHE_TCS, key, program, prog_data,
+                               NULL);
+
+   ralloc_free(mem_ctx);
+   return true;
+}
+
 static void
 iris_update_compiled_tcs(struct iris_context *ice)
 {
-   // XXX: TCS
+   struct iris_uncompiled_shader *tcs =
+      ice->shaders.uncompiled[MESA_SHADER_TESS_CTRL];
+
+   if (!tcs)
+      return;
+
+   const struct shader_info *tes_info =
+      get_shader_info(ice, MESA_SHADER_TESS_EVAL);
+   struct brw_tcs_prog_key key = {
+      .program_string_id = tcs->program_id,
+      .tes_primitive_mode = tes_info->tess.primitive_mode,
+   };
+   get_unified_tess_slots(ice, &key.outputs_written,
+                          &key.patch_outputs_written);
+   ice->vtbl.populate_tcs_key(ice, &key);
+
+   if (iris_bind_cached_shader(ice, IRIS_CACHE_TCS, &key))
+      return;
+
+   UNUSED bool success = iris_compile_tcs(ice, tcs, &key);
 }
 
 static bool