mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-22 11:20:11 +01:00
clover/spirv: support CL_KERNEL_COMPILE_WORK_GROUP_SIZE
Reviewed-by: Serge Martin <edb@sigluy.net> Reviewed-by: Francisco Jerez <currojerez@riseup.net> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4974>
This commit is contained in:
parent
2bb2ba7e34
commit
ee5b46fcfd
2 changed files with 30 additions and 4 deletions
|
|
@ -288,7 +288,10 @@ module clover::nir::spirv_to_nir(const module &mod, const device &dev,
|
||||||
throw build_error();
|
throw build_error();
|
||||||
}
|
}
|
||||||
|
|
||||||
nir->info.cs.local_size_variable = true;
|
nir->info.cs.local_size_variable = sym.reqd_work_group_size[0] == 0;
|
||||||
|
nir->info.cs.local_size[0] = sym.reqd_work_group_size[0];
|
||||||
|
nir->info.cs.local_size[1] = sym.reqd_work_group_size[1];
|
||||||
|
nir->info.cs.local_size[2] = sym.reqd_work_group_size[2];
|
||||||
nir_validate_shader(nir, "clover");
|
nir_validate_shader(nir, "clover");
|
||||||
|
|
||||||
// Inline all functions first.
|
// Inline all functions first.
|
||||||
|
|
@ -391,7 +394,7 @@ module clover::nir::spirv_to_nir(const module &mod, const device &dev,
|
||||||
text.data.insert(text.data.end(), blob.data, blob.data + blob.size);
|
text.data.insert(text.data.end(), blob.data, blob.data + blob.size);
|
||||||
|
|
||||||
m.syms.emplace_back(sym.name, std::string(),
|
m.syms.emplace_back(sym.name, std::string(),
|
||||||
std::vector<size_t>(), section_id, 0, args);
|
sym.reqd_work_group_size, section_id, 0, args);
|
||||||
m.secs.push_back(text);
|
m.secs.push_back(text);
|
||||||
section_id++;
|
section_id++;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -135,9 +135,11 @@ namespace {
|
||||||
std::string kernel_name;
|
std::string kernel_name;
|
||||||
size_t kernel_nb = 0u;
|
size_t kernel_nb = 0u;
|
||||||
std::vector<module::argument> args;
|
std::vector<module::argument> args;
|
||||||
|
std::vector<size_t> req_local_size;
|
||||||
|
|
||||||
module m;
|
module m;
|
||||||
|
|
||||||
|
std::unordered_map<SpvId, std::vector<size_t> > req_local_sizes;
|
||||||
std::unordered_map<SpvId, std::string> kernels;
|
std::unordered_map<SpvId, std::string> kernels;
|
||||||
std::unordered_map<SpvId, module::argument> types;
|
std::unordered_map<SpvId, module::argument> types;
|
||||||
std::unordered_map<SpvId, SpvId> pointer_types;
|
std::unordered_map<SpvId, SpvId> pointer_types;
|
||||||
|
|
@ -185,6 +187,19 @@ namespace {
|
||||||
source.data() + (i + 3u) * sizeof(uint32_t));
|
source.data() + (i + 3u) * sizeof(uint32_t));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case SpvOpExecutionMode:
|
||||||
|
switch (get<SpvExecutionMode>(inst, 2)) {
|
||||||
|
case SpvExecutionModeLocalSize:
|
||||||
|
req_local_sizes[get<SpvId>(inst, 1)] = {
|
||||||
|
get<uint32_t>(inst, 3),
|
||||||
|
get<uint32_t>(inst, 4),
|
||||||
|
get<uint32_t>(inst, 5)
|
||||||
|
};
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
case SpvOpDecorate: {
|
case SpvOpDecorate: {
|
||||||
const auto id = get<SpvId>(inst, 1);
|
const auto id = get<SpvId>(inst, 1);
|
||||||
const auto decoration = get<SpvDecoration>(inst, 2);
|
const auto decoration = get<SpvDecoration>(inst, 2);
|
||||||
|
|
@ -367,9 +382,17 @@ namespace {
|
||||||
}
|
}
|
||||||
|
|
||||||
case SpvOpFunction: {
|
case SpvOpFunction: {
|
||||||
const auto kernels_iter = kernels.find(get<SpvId>(inst, 2));
|
auto id = get<SpvId>(inst, 2);
|
||||||
|
const auto kernels_iter = kernels.find(id);
|
||||||
if (kernels_iter != kernels.end())
|
if (kernels_iter != kernels.end())
|
||||||
kernel_name = kernels_iter->second;
|
kernel_name = kernels_iter->second;
|
||||||
|
|
||||||
|
const auto req_local_size_iter = req_local_sizes.find(id);
|
||||||
|
if (req_local_size_iter != req_local_sizes.end())
|
||||||
|
req_local_size = (*req_local_size_iter).second;
|
||||||
|
else
|
||||||
|
req_local_size = { 0, 0, 0 };
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -428,7 +451,7 @@ namespace {
|
||||||
args[i].info.type_name = param_type_names[kernel_name][i];
|
args[i].info.type_name = param_type_names[kernel_name][i];
|
||||||
|
|
||||||
m.syms.emplace_back(kernel_name, std::string(),
|
m.syms.emplace_back(kernel_name, std::string(),
|
||||||
std::vector<size_t>(), 0, kernel_nb, args);
|
req_local_size, 0, kernel_nb, args);
|
||||||
++kernel_nb;
|
++kernel_nb;
|
||||||
kernel_name.clear();
|
kernel_name.clear();
|
||||||
args.clear();
|
args.clear();
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue