anv/pipeline: Use more fields from stage in compile_cs

Reviewed-by: Timothy Arceri <tarceri@itsqueeze.com>
Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
This commit is contained in:
Jason Ekstrand
2018-08-07 19:53:38 -07:00
parent 4af1a8c9e4
commit 2e4094cd8f

View File

@@ -1117,6 +1117,9 @@ anv_pipeline_compile_cs(struct anv_pipeline *pipeline,
.module = module,
.entrypoint = entrypoint,
.spec_info = spec_info,
.cache_key = {
.stage = MESA_SHADER_COMPUTE,
}
};
struct anv_shader_bin *bin = NULL;
@@ -1125,13 +1128,11 @@ anv_pipeline_compile_cs(struct anv_pipeline *pipeline,
ANV_FROM_HANDLE(anv_pipeline_layout, layout, info->layout);
unsigned char sha1[20];
anv_pipeline_hash_compute(pipeline, layout, &stage, sha1);
bin = anv_device_search_for_kernel(pipeline->device, cache, sha1, 20);
anv_pipeline_hash_compute(pipeline, layout, &stage, stage.cache_key.sha1);
bin = anv_device_search_for_kernel(pipeline->device, cache, &stage.cache_key,
sizeof(stage.cache_key));
if (bin == NULL) {
struct brw_cs_prog_data prog_data = {};
stage.bind_map = (struct anv_pipeline_bind_map) {
.surface_to_descriptor = stage.surface_to_descriptor,
.sampler_to_descriptor = stage.sampler_to_descriptor
@@ -1139,31 +1140,35 @@ anv_pipeline_compile_cs(struct anv_pipeline *pipeline,
void *mem_ctx = ralloc_context(NULL);
nir_shader *nir = anv_pipeline_compile(pipeline, mem_ctx, layout, &stage,
&prog_data.base, &stage.bind_map);
if (nir == NULL) {
stage.nir = anv_pipeline_compile(pipeline, mem_ctx, layout, &stage,
&stage.prog_data.base,
&stage.bind_map);
if (stage.nir == NULL) {
ralloc_free(mem_ctx);
return vk_error(VK_ERROR_OUT_OF_HOST_MEMORY);
}
NIR_PASS_V(nir, anv_nir_add_base_work_group_id, &prog_data);
NIR_PASS_V(stage.nir, anv_nir_add_base_work_group_id,
&stage.prog_data.cs);
anv_fill_binding_table(&prog_data.base, 1);
anv_fill_binding_table(&stage.prog_data.cs.base, 1);
const unsigned *shader_code =
brw_compile_cs(compiler, NULL, mem_ctx, &stage.key.cs,
&prog_data, nir, -1, NULL);
&stage.prog_data.cs, stage.nir, -1, NULL);
if (shader_code == NULL) {
ralloc_free(mem_ctx);
return vk_error(VK_ERROR_OUT_OF_HOST_MEMORY);
}
const unsigned code_size = prog_data.base.program_size;
bin = anv_device_upload_kernel(pipeline->device, cache, sha1, 20,
const unsigned code_size = stage.prog_data.base.program_size;
bin = anv_device_upload_kernel(pipeline->device, cache,
&stage.cache_key, sizeof(stage.cache_key),
shader_code, code_size,
nir->constant_data,
nir->constant_data_size,
&prog_data.base, sizeof(prog_data),
stage.nir->constant_data,
stage.nir->constant_data_size,
&stage.prog_data.base,
sizeof(stage.prog_data.cs),
&stage.bind_map);
if (!bin) {
ralloc_free(mem_ctx);