summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEdward O'Callaghan <funfunctor@folklore1984.net>2016-11-18 17:21:51 +1100
committerEdward O'Callaghan <funfunctor@folklore1984.net>2016-12-27 20:39:54 +1100
commitd9e8eb56510a1d0a9b38f69627a4fb804b5beb20 (patch)
treef64ac6494db9b22d58cc29dd4972a64dcc85a0d6
parent8a51d7bfd6d8e1fc149a6ffc7146b9b9102f7e63 (diff)
clover: Implement 'CL_MEM_OBJECT_IMAGE1D_ARRAY'clover-image-support
V.2: Consider surface height as valid when unused by using 1. Fixup width boundary checking.
-rw-r--r--src/gallium/state_trackers/clover/api/memory.cpp24
-rw-r--r--src/gallium/state_trackers/clover/core/memory.cpp14
-rw-r--r--src/gallium/state_trackers/clover/core/memory.hpp11
3 files changed, 45 insertions, 4 deletions
diff --git a/src/gallium/state_trackers/clover/api/memory.cpp b/src/gallium/state_trackers/clover/api/memory.cpp
index f081a5866b..4b0cff295b 100644
--- a/src/gallium/state_trackers/clover/api/memory.cpp
+++ b/src/gallium/state_trackers/clover/api/memory.cpp
@@ -200,6 +200,26 @@ clCreateImage(cl_context d_ctx, cl_mem_flags d_flags,
desc->image_width,
desc->image_row_pitch, host_ptr);
+ case CL_MEM_OBJECT_IMAGE1D_ARRAY:
+ if (!desc->image_width)
+ throw error(CL_INVALID_IMAGE_SIZE);
+
+ /**
+ * NOTE: We sligntly abuse image_levels_2d() for 1d case.
+ */
+ if (all_of([=](const device &dev) {
+ const size_t max = 1 << dev.max_image_levels_2d();
+ const size_t amax = 1 << dev.max_image_array_number();
+ return (desc->image_width > max ||
+ desc->image_array_size > amax);
+ }, ctx.devices()))
+ throw error(CL_INVALID_IMAGE_SIZE);
+
+ return new image1d_array(ctx, flags, format,
+ desc->image_width,
+ desc->image_array_size, desc->image_slice_pitch,
+ host_ptr);
+
case CL_MEM_OBJECT_IMAGE2D:
if (!desc->image_width || !desc->image_height)
throw error(CL_INVALID_IMAGE_SIZE);
@@ -248,10 +268,6 @@ clCreateImage(cl_context d_ctx, cl_mem_flags d_flags,
desc->image_depth, desc->image_row_pitch,
desc->image_slice_pitch, host_ptr);
- case CL_MEM_OBJECT_IMAGE1D_ARRAY:
- // XXX - Not implemented.
- throw error(CL_IMAGE_FORMAT_NOT_SUPPORTED);
-
default:
throw error(CL_INVALID_IMAGE_DESCRIPTOR);
}
diff --git a/src/gallium/state_trackers/clover/core/memory.cpp b/src/gallium/state_trackers/clover/core/memory.cpp
index e9cdc77e53..1f6e6730e6 100644
--- a/src/gallium/state_trackers/clover/core/memory.cpp
+++ b/src/gallium/state_trackers/clover/core/memory.cpp
@@ -216,6 +216,20 @@ image1d_buffer::type() const {
return CL_MEM_OBJECT_IMAGE1D_BUFFER;
}
+image1d_array::image1d_array(clover::context &ctx, cl_mem_flags flags,
+ const cl_image_format *format,
+ size_t width,
+ size_t array_size, size_t slice_pitch,
+ void *host_ptr) :
+ image(ctx, flags, format, width, 1, 1,
+ 0, slice_pitch, slice_pitch * array_size, host_ptr) {
+}
+
+cl_mem_object_type
+image1d_array::type() const {
+ return CL_MEM_OBJECT_IMAGE1D_ARRAY;
+}
+
image2d::image2d(clover::context &ctx, cl_mem_flags flags,
const cl_image_format *format, size_t width,
size_t height, size_t row_pitch,
diff --git a/src/gallium/state_trackers/clover/core/memory.hpp b/src/gallium/state_trackers/clover/core/memory.hpp
index 99ae038e05..731bd1ded3 100644
--- a/src/gallium/state_trackers/clover/core/memory.hpp
+++ b/src/gallium/state_trackers/clover/core/memory.hpp
@@ -156,6 +156,17 @@ namespace clover {
virtual cl_mem_object_type type() const;
};
+ class image1d_array : public image {
+ public:
+ image1d_array(clover::context &ctx, cl_mem_flags flags,
+ const cl_image_format *format,
+ size_t width,
+ size_t array_size, size_t slice_pitch,
+ void *host_ptr);
+
+ virtual cl_mem_object_type type() const;
+ };
+
class image2d : public image {
public:
image2d(clover::context &ctx, cl_mem_flags flags,