clover: Handle multiple kernels in the same program v2

v2: Tom Stellard
  - Use pc parameter of launch_grid()

Reviewed-by: Francisco Jerez <currojerez@riseup.net>
Reviewed-by: Tom Stellard <thomas.stellard@amd.com>
This commit is contained in:
Blaž Tomažič
2012-09-13 14:51:46 +00:00
committed by Tom Stellard
parent 68a4bb553b
commit e59505e34b
2 changed files with 35 additions and 31 deletions

View File

@@ -507,6 +507,10 @@ struct pipe_context {
* grid (in block units) and working block (in thread units) to be * grid (in block units) and working block (in thread units) to be
* used, respectively. * used, respectively.
* *
* \a pc For drivers that use PIPE_SHADER_IR_LLVM as their prefered IR,
* this value will be the index of the kernel in the opencl.kernels
* metadata list.
*
* \a input will be used to initialize the INPUT resource, and it * \a input will be used to initialize the INPUT resource, and it
* should point to a buffer of at least * should point to a buffer of at least
* pipe_compute_state::req_input_mem bytes. * pipe_compute_state::req_input_mem bytes.

View File

@@ -199,41 +199,42 @@ namespace {
llvm::WriteBitcodeToFile(mod, bitcode_ostream); llvm::WriteBitcodeToFile(mod, bitcode_ostream);
bitcode_ostream.flush(); bitcode_ostream.flush();
llvm::Function *kernel_func; for (unsigned i = 0; i < kernels.size(); ++i) {
std::string kernel_name; llvm::Function *kernel_func;
compat::vector<module::argument> args; std::string kernel_name;
compat::vector<module::argument> args;
// XXX: Support more than one kernel kernel_func = kernels[i];
assert(kernels.size() == 1); kernel_name = kernel_func->getName();
kernel_func = kernels[0]; for (llvm::Function::arg_iterator I = kernel_func->arg_begin(),
kernel_name = kernel_func->getName(); E = kernel_func->arg_end(); I != E; ++I) {
llvm::Argument &arg = *I;
llvm::Type *arg_type = arg.getType();
llvm::TargetData TD(kernel_func->getParent());
unsigned arg_size = TD.getTypeStoreSize(arg_type);
for (llvm::Function::arg_iterator I = kernel_func->arg_begin(), if (llvm::isa<llvm::PointerType>(arg_type) && arg.hasByValAttr()) {
E = kernel_func->arg_end(); I != E; ++I) { arg_type =
llvm::Argument &arg = *I; llvm::dyn_cast<llvm::PointerType>(arg_type)->getElementType();
llvm::Type *arg_type = arg.getType(); }
llvm::TargetData TD(kernel_func->getParent());
unsigned arg_size = TD.getTypeStoreSize(arg_type); if (arg_type->isPointerTy()) {
// XXX: Figure out LLVM->OpenCL address space mappings for each
if (llvm::isa<llvm::PointerType>(arg_type) && arg.hasByValAttr()) { // target. I think we need to ask clang what these are. For now,
arg_type = // pretend everything is in the global address space.
llvm::dyn_cast<llvm::PointerType>(arg_type)->getElementType(); unsigned address_space = llvm::cast<llvm::PointerType>(arg_type)->getAddressSpace();
} switch (address_space) {
default:
if (arg_type->isPointerTy()) { args.push_back(module::argument(module::argument::global, arg_size));
// XXX: Figure out LLVM->OpenCL address space mappings for each break;
// target. I think we need to ask clang what these are. For now, }
// pretend everything is in the global address space. } else {
unsigned address_space = llvm::cast<llvm::PointerType>(arg_type)->getAddressSpace(); args.push_back(module::argument(module::argument::scalar, arg_size));
switch (address_space) {
default:
args.push_back(module::argument(module::argument::global, arg_size));
break;
} }
} else {
args.push_back(module::argument(module::argument::scalar, arg_size));
} }
m.syms.push_back(module::symbol(kernel_name, 0, i, args ));
} }
header.num_bytes = llvm_bitcode.size(); header.num_bytes = llvm_bitcode.size();
@@ -241,7 +242,6 @@ namespace {
data.insert(0, (char*)(&header), sizeof(header)); data.insert(0, (char*)(&header), sizeof(header));
data.insert(data.end(), llvm_bitcode.begin(), data.insert(data.end(), llvm_bitcode.begin(),
llvm_bitcode.end()); llvm_bitcode.end());
m.syms.push_back(module::symbol(kernel_name, 0, 0, args ));
m.secs.push_back(module::section(0, module::section::text, m.secs.push_back(module::section(0, module::section::text,
header.num_bytes, data)); header.num_bytes, data));