diff options
author | Edward O'Callaghan <funfunctor@folklore1984.net> | 2016-11-18 17:21:51 +1100 |
---|---|---|
committer | Edward O'Callaghan <funfunctor@folklore1984.net> | 2016-12-27 20:39:54 +1100 |
commit | d9e8eb56510a1d0a9b38f69627a4fb804b5beb20 (patch) | |
tree | f64ac6494db9b22d58cc29dd4972a64dcc85a0d6 | |
parent | 8a51d7bfd6d8e1fc149a6ffc7146b9b9102f7e63 (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.cpp | 24 | ||||
-rw-r--r-- | src/gallium/state_trackers/clover/core/memory.cpp | 14 | ||||
-rw-r--r-- | src/gallium/state_trackers/clover/core/memory.hpp | 11 |
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, |