diff --git a/src/gallium/drivers/iris/iris_context.h b/src/gallium/drivers/iris/iris_context.h index c94217c5033..d820cb094c9 100644 --- a/src/gallium/drivers/iris/iris_context.h +++ b/src/gallium/drivers/iris/iris_context.h @@ -963,6 +963,15 @@ struct iris_compiled_shader *iris_create_shader_variant(const struct iris_screen uint32_t key_size, const void *key); +void iris_finalize_program(struct iris_compiled_shader *shader, + struct brw_stage_prog_data *prog_data, + uint32_t *streamout, + enum brw_param_builtin *system_values, + unsigned num_system_values, + unsigned kernel_input_size, + unsigned num_cbufs, + const struct iris_binding_table *bt); + void iris_upload_shader(struct iris_screen *screen, struct iris_uncompiled_shader *, struct iris_compiled_shader *, @@ -971,14 +980,7 @@ void iris_upload_shader(struct iris_screen *screen, enum iris_program_cache_id, uint32_t key_size, const void *key, - const void *assembly, - struct brw_stage_prog_data *, - uint32_t *streamout, - enum brw_param_builtin *sysv, - unsigned num_system_values, - unsigned kernel_input_size, - unsigned num_cbufs, - const struct iris_binding_table *bt); + const void *assembly); void iris_delete_shader_variant(struct iris_compiled_shader *shader); void iris_destroy_shader_state(struct pipe_context *ctx, void *state); diff --git a/src/gallium/drivers/iris/iris_disk_cache.c b/src/gallium/drivers/iris/iris_disk_cache.c index 62313edde31..a62cf5db612 100644 --- a/src/gallium/drivers/iris/iris_disk_cache.c +++ b/src/gallium/drivers/iris/iris_disk_cache.c @@ -239,14 +239,16 @@ iris_disk_cache_retrieve(struct iris_screen *screen, if (num_system_values || kernel_input_size) num_cbufs++; + iris_finalize_program(shader, prog_data, so_decls, system_values, + num_system_values, kernel_input_size, num_cbufs, + &bt); + assert(stage < ARRAY_SIZE(cache_id_for_stage)); enum iris_program_cache_id cache_id = cache_id_for_stage[stage]; /* Upload our newly read shader to the in-memory program cache. */ iris_upload_shader(screen, ish, shader, NULL, uploader, - cache_id, key_size, prog_key, assembly, - prog_data, so_decls, system_values, - num_system_values, kernel_input_size, num_cbufs, &bt); + cache_id, key_size, prog_key, assembly); free(buffer); diff --git a/src/gallium/drivers/iris/iris_program.c b/src/gallium/drivers/iris/iris_program.c index 1bd83baa938..384d331f21c 100644 --- a/src/gallium/drivers/iris/iris_program.c +++ b/src/gallium/drivers/iris/iris_program.c @@ -69,6 +69,32 @@ get_new_program_id(struct iris_screen *screen) return p_atomic_inc_return(&screen->program_id); } +void +iris_finalize_program(struct iris_compiled_shader *shader, + struct brw_stage_prog_data *prog_data, + uint32_t *streamout, + enum brw_param_builtin *system_values, + unsigned num_system_values, + unsigned kernel_input_size, + unsigned num_cbufs, + const struct iris_binding_table *bt) +{ + shader->prog_data = prog_data; + shader->streamout = streamout; + shader->system_values = system_values; + shader->num_system_values = num_system_values; + shader->kernel_input_size = kernel_input_size; + shader->num_cbufs = num_cbufs; + shader->bt = *bt; + + ralloc_steal(shader, shader->prog_data); + ralloc_steal(shader->prog_data, (void *)prog_data->relocs); + ralloc_steal(shader->prog_data, prog_data->param); + ralloc_steal(shader->prog_data, prog_data->pull_param); + ralloc_steal(shader, shader->streamout); + ralloc_steal(shader, shader->system_values); +} + static struct brw_vs_prog_key iris_to_brw_vs_key(const struct intel_device_info *devinfo, const struct iris_vs_prog_key *key) @@ -1296,9 +1322,11 @@ iris_compile_vs(struct iris_screen *screen, screen->vtbl.create_so_decl_list(&ish->stream_output, &vue_prog_data->vue_map); + iris_finalize_program(shader, prog_data, so_decls, system_values, + num_system_values, 0, num_cbufs, &bt); + iris_upload_shader(screen, ish, shader, NULL, uploader, IRIS_CACHE_VS, - sizeof(*key), key, program, prog_data, so_decls, - system_values, num_system_values, 0, num_cbufs, &bt); + sizeof(*key), key, program); iris_disk_cache_store(screen->disk_cache, ish, shader, key, sizeof(*key)); @@ -1491,10 +1519,11 @@ iris_compile_tcs(struct iris_screen *screen, iris_debug_recompile(screen, dbg, ish, &brw_key.base); + iris_finalize_program(shader, prog_data, NULL, system_values, + num_system_values, 0, num_cbufs, &bt); + iris_upload_shader(screen, ish, shader, passthrough_ht, uploader, - IRIS_CACHE_TCS, sizeof(*key), key, program, prog_data, - NULL, system_values, num_system_values, 0, num_cbufs, - &bt); + IRIS_CACHE_TCS, sizeof(*key), key, program); if (ish) iris_disk_cache_store(screen->disk_cache, ish, shader, key, sizeof(*key)); @@ -1651,9 +1680,11 @@ iris_compile_tes(struct iris_screen *screen, screen->vtbl.create_so_decl_list(&ish->stream_output, &vue_prog_data->vue_map); + iris_finalize_program(shader, prog_data, so_decls, system_values, + num_system_values, 0, num_cbufs, &bt); + iris_upload_shader(screen, ish, shader, NULL, uploader, IRIS_CACHE_TES, - sizeof(*key), key, program, prog_data, so_decls, - system_values, num_system_values, 0, num_cbufs, &bt); + sizeof(*key), key, program); iris_disk_cache_store(screen->disk_cache, ish, shader, key, sizeof(*key)); @@ -1782,9 +1813,11 @@ iris_compile_gs(struct iris_screen *screen, screen->vtbl.create_so_decl_list(&ish->stream_output, &vue_prog_data->vue_map); + iris_finalize_program(shader, prog_data, so_decls, system_values, + num_system_values, 0, num_cbufs, &bt); + iris_upload_shader(screen, ish, shader, NULL, uploader, IRIS_CACHE_GS, - sizeof(*key), key, program, prog_data, so_decls, - system_values, num_system_values, 0, num_cbufs, &bt); + sizeof(*key), key, program); iris_disk_cache_store(screen->disk_cache, ish, shader, key, sizeof(*key)); @@ -1916,9 +1949,11 @@ iris_compile_fs(struct iris_screen *screen, iris_debug_recompile(screen, dbg, ish, &brw_key.base); + iris_finalize_program(shader, prog_data, NULL, system_values, + num_system_values, 0, num_cbufs, &bt); + iris_upload_shader(screen, ish, shader, NULL, uploader, IRIS_CACHE_FS, - sizeof(*key), key, program, prog_data, NULL, - system_values, num_system_values, 0, num_cbufs, &bt); + sizeof(*key), key, program); iris_disk_cache_store(screen->disk_cache, ish, shader, key, sizeof(*key)); @@ -2186,10 +2221,12 @@ iris_compile_cs(struct iris_screen *screen, iris_debug_recompile(screen, dbg, ish, &brw_key.base); + iris_finalize_program(shader, prog_data, NULL, system_values, + num_system_values, ish->kernel_input_size, num_cbufs, + &bt); + iris_upload_shader(screen, ish, shader, NULL, uploader, IRIS_CACHE_CS, - sizeof(*key), key, program, prog_data, NULL, - system_values, num_system_values, ish->kernel_input_size, - num_cbufs, &bt); + sizeof(*key), key, program); iris_disk_cache_store(screen->disk_cache, ish, shader, key, sizeof(*key)); diff --git a/src/gallium/drivers/iris/iris_program_cache.c b/src/gallium/drivers/iris/iris_program_cache.c index bb8795403cb..d31ba7785f1 100644 --- a/src/gallium/drivers/iris/iris_program_cache.c +++ b/src/gallium/drivers/iris/iris_program_cache.c @@ -155,26 +155,19 @@ iris_upload_shader(struct iris_screen *screen, enum iris_program_cache_id cache_id, uint32_t key_size, const void *key, - const void *assembly, - struct brw_stage_prog_data *prog_data, - uint32_t *streamout, - enum brw_param_builtin *system_values, - unsigned num_system_values, - unsigned kernel_input_size, - unsigned num_cbufs, - const struct iris_binding_table *bt) + const void *assembly) { const struct intel_device_info *devinfo = &screen->devinfo; - u_upload_alloc(uploader, 0, prog_data->program_size, 64, + u_upload_alloc(uploader, 0, shader->prog_data->program_size, 64, &shader->assembly.offset, &shader->assembly.res, &shader->map); - memcpy(shader->map, assembly, prog_data->program_size); + memcpy(shader->map, assembly, shader->prog_data->program_size); struct iris_resource *res = (void *) shader->assembly.res; uint64_t shader_data_addr = res->bo->gtt_offset + shader->assembly.offset + - prog_data->const_data_offset; + shader->prog_data->const_data_offset; struct brw_shader_reloc_value reloc_values[] = { { @@ -186,23 +179,9 @@ iris_upload_shader(struct iris_screen *screen, .value = shader_data_addr >> 32, }, }; - brw_write_shader_relocs(&screen->devinfo, shader->map, prog_data, - reloc_values, ARRAY_SIZE(reloc_values)); - - shader->prog_data = prog_data; - shader->streamout = streamout; - shader->system_values = system_values; - shader->num_system_values = num_system_values; - shader->kernel_input_size = kernel_input_size; - shader->num_cbufs = num_cbufs; - shader->bt = *bt; - - ralloc_steal(shader, shader->prog_data); - ralloc_steal(shader->prog_data, (void *)prog_data->relocs); - ralloc_steal(shader->prog_data, prog_data->param); - ralloc_steal(shader->prog_data, prog_data->pull_param); - ralloc_steal(shader, shader->streamout); - ralloc_steal(shader, shader->system_values); + brw_write_shader_relocs(&screen->devinfo, shader->map, + shader->prog_data, reloc_values, + ARRAY_SIZE(reloc_values)); /* Store the 3DSTATE shader packets and other derived state. */ screen->vtbl.store_derived_program_state(devinfo, cache_id, shader); @@ -262,10 +241,11 @@ iris_blorp_upload_shader(struct blorp_batch *blorp_batch, uint32_t stage, iris_create_shader_variant(screen, ice->shaders.cache, IRIS_CACHE_BLORP, key_size, key); + iris_finalize_program(shader, prog_data, NULL, NULL, 0, 0, 0, &bt); + iris_upload_shader(screen, NULL, shader, ice->shaders.cache, ice->shaders.uploader_driver, - IRIS_CACHE_BLORP, key_size, key, kernel, - prog_data, NULL, NULL, 0, 0, 0, &bt); + IRIS_CACHE_BLORP, key_size, key, kernel); struct iris_bo *bo = iris_resource_bo(shader->assembly.res); *kernel_out =