clover: Respect kernel argument alignment restrictions.
Cc: mesa-stable@lists.freedesktop.org Reviewed-by: Tom Stellard <thomas.stellard@amd.com>
This commit is contained in:
@@ -22,6 +22,7 @@
|
||||
|
||||
#include "core/kernel.hpp"
|
||||
#include "core/resource.hpp"
|
||||
#include "util/u_math.h"
|
||||
#include "pipe/p_context.h"
|
||||
|
||||
using namespace clover;
|
||||
@@ -197,6 +198,15 @@ namespace {
|
||||
std::reverse(v.begin(), v.end());
|
||||
}
|
||||
|
||||
///
|
||||
/// Pad buffer \a v to the next multiple of \a n.
|
||||
///
|
||||
template<typename T>
|
||||
void
|
||||
align(T &v, size_t n) {
|
||||
v.resize(util_align_npot(v.size(), n));
|
||||
}
|
||||
|
||||
bool
|
||||
msb(const std::vector<uint8_t> &s) {
|
||||
if (PIPE_ENDIAN_NATIVE == PIPE_ENDIAN_LITTLE)
|
||||
@@ -278,6 +288,7 @@ _cl_kernel::scalar_argument::bind(exec_context &ctx,
|
||||
|
||||
extend(w, marg.ext_type, marg.target_size);
|
||||
byteswap(w, ctx.q->dev.endianness());
|
||||
align(ctx.input, marg.target_align);
|
||||
insert(ctx.input, w);
|
||||
}
|
||||
|
||||
@@ -300,6 +311,7 @@ _cl_kernel::global_argument::set(size_t size, const void *value) {
|
||||
void
|
||||
_cl_kernel::global_argument::bind(exec_context &ctx,
|
||||
const clover::module::argument &marg) {
|
||||
align(ctx.input, marg.target_align);
|
||||
ctx.g_handles.push_back(allocate(ctx.input, marg.target_size));
|
||||
ctx.g_buffers.push_back(obj->resource(ctx.q).pipe);
|
||||
}
|
||||
@@ -329,6 +341,7 @@ _cl_kernel::local_argument::bind(exec_context &ctx,
|
||||
|
||||
extend(v, module::argument::zero_ext, marg.target_size);
|
||||
byteswap(v, ctx.q->dev.endianness());
|
||||
align(ctx.input, marg.target_align);
|
||||
insert(ctx.input, v);
|
||||
|
||||
ctx.mem_local += __storage;
|
||||
@@ -357,6 +370,7 @@ _cl_kernel::constant_argument::bind(exec_context &ctx,
|
||||
|
||||
extend(v, module::argument::zero_ext, marg.target_size);
|
||||
byteswap(v, ctx.q->dev.endianness());
|
||||
align(ctx.input, marg.target_align);
|
||||
insert(ctx.input, v);
|
||||
|
||||
st = obj->resource(ctx.q).bind_surface(*ctx.q, false);
|
||||
@@ -387,6 +401,7 @@ _cl_kernel::image_rd_argument::bind(exec_context &ctx,
|
||||
|
||||
extend(v, module::argument::zero_ext, marg.target_size);
|
||||
byteswap(v, ctx.q->dev.endianness());
|
||||
align(ctx.input, marg.target_align);
|
||||
insert(ctx.input, v);
|
||||
|
||||
st = obj->resource(ctx.q).bind_sampler_view(*ctx.q);
|
||||
@@ -417,6 +432,7 @@ _cl_kernel::image_wr_argument::bind(exec_context &ctx,
|
||||
|
||||
extend(v, module::argument::zero_ext, marg.target_size);
|
||||
byteswap(v, ctx.q->dev.endianness());
|
||||
align(ctx.input, marg.target_align);
|
||||
insert(ctx.input, v);
|
||||
|
||||
st = obj->resource(ctx.q).bind_surface(*ctx.q, true);
|
||||
|
@@ -317,6 +317,7 @@ namespace {
|
||||
TD.getSmallestLegalIntType(mod->getContext(), arg_size * 8) :
|
||||
arg_type;
|
||||
unsigned target_size = TD.getTypeStoreSize(target_type);
|
||||
unsigned target_align = TD.getABITypeAlignment(target_type);
|
||||
|
||||
if (llvm::isa<llvm::PointerType>(arg_type) && arg.hasByValAttr()) {
|
||||
arg_type =
|
||||
@@ -332,7 +333,7 @@ namespace {
|
||||
default:
|
||||
args.push_back(
|
||||
module::argument(module::argument::global, arg_size,
|
||||
target_size, 0,
|
||||
target_size, target_align,
|
||||
module::argument::zero_ext));
|
||||
break;
|
||||
}
|
||||
@@ -347,7 +348,7 @@ namespace {
|
||||
|
||||
args.push_back(
|
||||
module::argument(module::argument::scalar, arg_size,
|
||||
target_size, 0, ext_type));
|
||||
target_size, target_align, ext_type));
|
||||
}
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user