clover: rework quering image max sizes

The 3D one was always wrongly used, also the consumers always wanted the
size, not the levels. This should make it easier to use the interface and
also prevent future bugs like the 3D one.

Signed-off-by: Karol Herbst <kherbst@redhat.com>
Reviewed-by: Francisco Jerez <currojerez@riseup.net>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/9212>
This commit is contained in:
Karol Herbst 2020-10-26 13:57:22 +01:00 committed by Marge Bot
parent 60173853c2
commit f5284a36f9
5 changed files with 14 additions and 12 deletions

View File

@ -192,13 +192,13 @@ clGetDeviceInfo(cl_device_id d_dev, cl_device_info param,
case CL_DEVICE_IMAGE2D_MAX_WIDTH:
case CL_DEVICE_IMAGE2D_MAX_HEIGHT:
buf.as_scalar<size_t>() = 1 << dev.max_image_levels_2d();
buf.as_scalar<size_t>() = dev.max_image_size();
break;
case CL_DEVICE_IMAGE3D_MAX_WIDTH:
case CL_DEVICE_IMAGE3D_MAX_HEIGHT:
case CL_DEVICE_IMAGE3D_MAX_DEPTH:
buf.as_scalar<size_t>() = 1 << dev.max_image_levels_3d();
buf.as_scalar<size_t>() = dev.max_image_size_3d();
break;
case CL_DEVICE_IMAGE_MAX_BUFFER_SIZE:

View File

@ -219,7 +219,7 @@ clCreateImageWithProperties(cl_context d_ctx,
throw error(CL_INVALID_IMAGE_SIZE);
if (all_of([=](const device &dev) {
const size_t max = 1 << dev.max_image_levels_2d();
const size_t max = dev.max_image_size();
return (desc->image_width > max ||
desc->image_height > max);
}, ctx.devices()))
@ -234,7 +234,7 @@ clCreateImageWithProperties(cl_context d_ctx,
throw error(CL_INVALID_IMAGE_SIZE);
if (all_of([=](const device &dev) {
const size_t max = 1 << dev.max_image_levels_3d();
const size_t max = dev.max_image_size_3d();
return (desc->image_width > max ||
desc->image_height > max ||
desc->image_depth > max);

View File

@ -121,13 +121,13 @@ namespace {
switch (img.type()) {
case CL_MEM_OBJECT_IMAGE2D: {
const size_t max = 1 << dev.max_image_levels_2d();
const size_t max = dev.max_image_size();
if (img.width() > max || img.height() > max)
throw error(CL_INVALID_IMAGE_SIZE);
break;
}
case CL_MEM_OBJECT_IMAGE3D: {
const size_t max = 1 << dev.max_image_levels_3d();
const size_t max = dev.max_image_size_3d();
if (img.width() > max || img.height() > max || img.depth() > max)
throw error(CL_INVALID_IMAGE_SIZE);
break;

View File

@ -131,13 +131,13 @@ device::max_image_buffer_size() const {
}
cl_uint
device::max_image_levels_2d() const {
return util_last_bit(pipe->get_param(pipe, PIPE_CAP_MAX_TEXTURE_2D_SIZE));
device::max_image_size() const {
return pipe->get_param(pipe, PIPE_CAP_MAX_TEXTURE_2D_SIZE);
}
cl_uint
device::max_image_levels_3d() const {
return pipe->get_param(pipe, PIPE_CAP_MAX_TEXTURE_3D_LEVELS);
device::max_image_size_3d() const {
return 1 << (pipe->get_param(pipe, PIPE_CAP_MAX_TEXTURE_3D_LEVELS) - 1);
}
size_t

View File

@ -57,8 +57,10 @@ namespace clover {
size_t max_images_read() const;
size_t max_images_write() const;
size_t max_image_buffer_size() const;
cl_uint max_image_levels_2d() const;
cl_uint max_image_levels_3d() const;
// Use for 1D and 2D images.
cl_uint max_image_size() const;
// Use for 3D images.
cl_uint max_image_size_3d() const;
size_t max_image_array_number() const;
cl_uint max_samplers() const;
cl_ulong max_mem_global() const;