intel-clc: avoid using spirv-linker.

There is not real need to use the spirv-linker here at all,
we can just read all the CL C files into one buffer, then compile
that buffer in a single pass.

This worksaround an issue seen with llvm17 and opaque pointers
and the spirv linker.

Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
Cc: mesa-stable
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/25759>
This commit is contained in:
Dave Airlie 2023-10-04 16:35:29 +10:00
parent 843f2eb3c8
commit d6613deed9

View file

@ -402,6 +402,8 @@ int main(int argc, char **argv)
.warning = msg_callback, .warning = msg_callback,
}; };
size_t total_size = 0;
char *all_inputs = NULL;
util_dynarray_foreach(&input_files, char *, infile) { util_dynarray_foreach(&input_files, char *, infile) {
int fd = open(*infile, O_RDONLY); int fd = open(*infile, O_RDONLY);
if (fd < 0) { if (fd < 0) {
@ -411,46 +413,50 @@ int main(int argc, char **argv)
} }
off_t len = lseek(fd, 0, SEEK_END); off_t len = lseek(fd, 0, SEEK_END);
const void *map = mmap(NULL, len, PROT_READ, MAP_PRIVATE, fd, 0); size_t new_size = total_size + len;
all_inputs = reralloc_size(mem_ctx, all_inputs, new_size + 1);
if (!all_inputs) {
fprintf(stderr, "Failed to allocate memory\n");
ralloc_free(mem_ctx);
return 1;
}
lseek(fd, 0, SEEK_SET);
read(fd, all_inputs + total_size, len);
close(fd); close(fd);
if (map == MAP_FAILED) { total_size = new_size;
fprintf(stderr, "Failed to mmap the file: errno=%d, %s\n", all_inputs[total_size] = '\0';
errno, strerror(errno)); }
ralloc_free(mem_ctx);
return 1;
}
const char *allowed_spirv_extensions[] = { const char *allowed_spirv_extensions[] = {
"SPV_EXT_shader_atomic_float_add", "SPV_EXT_shader_atomic_float_add",
"SPV_EXT_shader_atomic_float_min_max", "SPV_EXT_shader_atomic_float_min_max",
"SPV_KHR_float_controls", "SPV_KHR_float_controls",
"SPV_INTEL_subgroups", "SPV_INTEL_subgroups",
NULL, NULL,
}; };
struct clc_compile_args clc_args = { struct clc_compile_args clc_args = {
.source = { .source = {
.name = *infile, .name = "intel_clc_files",
.value = map, .value = all_inputs,
}, },
.features = { .features = {
.fp16 = true, .fp16 = true,
.intel_subgroups = true, .intel_subgroups = true,
.subgroups = true, .subgroups = true,
.subgroups_ifp = true, .subgroups_ifp = true,
}, },
.args = util_dynarray_begin(&clang_args), .args = util_dynarray_begin(&clang_args),
.num_args = util_dynarray_num_elements(&clang_args, char *), .num_args = util_dynarray_num_elements(&clang_args, char *),
.allowed_spirv_extensions = allowed_spirv_extensions, .allowed_spirv_extensions = allowed_spirv_extensions,
}; };
struct clc_binary *spirv_out = struct clc_binary *spirv_out =
util_dynarray_grow(&spirv_objs, struct clc_binary, 1); util_dynarray_grow(&spirv_objs, struct clc_binary, 1);
if (!clc_compile_c_to_spirv(&clc_args, &logger, spirv_out)) { if (!clc_compile_c_to_spirv(&clc_args, &logger, spirv_out)) {
ralloc_free(mem_ctx); ralloc_free(mem_ctx);
return 1; return 1;
}
} }
util_dynarray_foreach(&spirv_objs, struct clc_binary, p) { util_dynarray_foreach(&spirv_objs, struct clc_binary, p) {