[Mesa-dev] [PATCH 1/2] clover: implement clCreateImage
Serge Martin
edb+mesa at sigluy.net
Thu Sep 17 14:18:09 PDT 2015
---
src/gallium/state_trackers/clover/api/memory.cpp | 117 +++++++++++++++++++++--
1 file changed, 107 insertions(+), 10 deletions(-)
diff --git a/src/gallium/state_trackers/clover/api/memory.cpp b/src/gallium/state_trackers/clover/api/memory.cpp
index 1efb95b..6e95931 100644
--- a/src/gallium/state_trackers/clover/api/memory.cpp
+++ b/src/gallium/state_trackers/clover/api/memory.cpp
@@ -117,6 +117,113 @@ clCreateSubBuffer(cl_mem d_mem, cl_mem_flags d_flags,
}
CLOVER_API cl_mem
+clCreateImage(cl_context d_ctx, cl_mem_flags d_flags,
+ const cl_image_format *format,
+ const cl_image_desc *desc,
+ void *host_ptr, cl_int *r_errcode) try {
+ auto &ctx = obj(d_ctx);
+
+ if (!format)
+ throw error(CL_INVALID_IMAGE_FORMAT_DESCRIPTOR);
+
+ if (!desc)
+ throw error(CL_INVALID_IMAGE_DESCRIPTOR);
+
+ if (desc->image_array_size == 0 && (
+ (desc->image_type == CL_MEM_OBJECT_IMAGE1D_ARRAY) ||
+ (desc->image_type == CL_MEM_OBJECT_IMAGE2D_ARRAY)))
+ throw error(CL_INVALID_IMAGE_DESCRIPTOR);
+
+ if (!host_ptr &&
+ (desc->image_row_pitch || desc->image_slice_pitch))
+ throw error(CL_INVALID_IMAGE_DESCRIPTOR);
+
+ if (desc->num_mip_levels || desc->num_samples)
+ throw error(CL_INVALID_IMAGE_DESCRIPTOR);
+
+ if (desc->buffer && (desc->image_type !=
+ CL_MEM_OBJECT_IMAGE1D_BUFFER))
+ throw error(CL_INVALID_IMAGE_DESCRIPTOR);
+
+ const cl_mem_flags flags = d_flags |
+ ((d_flags & dev_access_flags) &&
+ !(desc->image_type == CL_MEM_OBJECT_IMAGE1D_BUFFER) ?
+ 0 : CL_MEM_READ_WRITE);
+
+ if (desc->image_type == CL_MEM_OBJECT_IMAGE1D_BUFFER) {
+ auto &buf = obj(desc->buffer);
+ validate_flags(flags | buf.flags(),
+ dev_access_flags | host_access_flags);
+ } else {
+ validate_flags(flags, all_mem_flags);
+ }
+
+ if (bool(host_ptr) != bool(flags & (CL_MEM_USE_HOST_PTR |
+ CL_MEM_COPY_HOST_PTR)))
+ throw error(CL_INVALID_HOST_PTR);
+
+ if (!any_of(std::mem_fn(&device::image_support), ctx.devices()))
+ throw error(CL_INVALID_OPERATION);
+
+ if (!supported_formats(ctx, desc->image_type).count(*format))
+ throw error(CL_IMAGE_FORMAT_NOT_SUPPORTED);
+
+ cl_mem img = NULL;
+ switch (desc->image_type) {
+ case CL_MEM_OBJECT_IMAGE3D:
+ if (!desc->image_width || !desc->image_height || !desc->image_depth)
+ throw error(CL_INVALID_IMAGE_SIZE);
+
+ if (any_of([=](device &dev) {
+ const size_t max = 1 << dev.max_image_levels_3d();
+ return desc->image_width > max ||
+ desc->image_height > max ||
+ desc->image_depth > max;
+ }, ctx.devices()))
+ throw error(CL_INVALID_IMAGE_SIZE);
+
+ img = new image3d(ctx, flags, format,
+ desc->image_width, desc->image_height,
+ desc->image_depth, desc->image_row_pitch,
+ desc->image_slice_pitch, host_ptr);
+ break;
+
+ case CL_MEM_OBJECT_IMAGE2D:
+ if (!desc->image_width || !desc->image_height)
+ throw error(CL_INVALID_IMAGE_SIZE);
+
+ if (any_of([=](device &dev) {
+ const size_t max = 1 << dev.max_image_levels_2d();
+ return desc->image_width > max ||
+ desc->image_height > max;
+ }, ctx.devices()))
+ throw error(CL_INVALID_IMAGE_SIZE);
+
+ img = new image2d(ctx, flags, format,
+ desc->image_width, desc->image_height,
+ desc->image_row_pitch, host_ptr);
+ break;
+
+ case CL_MEM_OBJECT_IMAGE2D_ARRAY:
+ case CL_MEM_OBJECT_IMAGE1D_ARRAY:
+ case CL_MEM_OBJECT_IMAGE1D_BUFFER:
+ case CL_MEM_OBJECT_IMAGE1D:
+ throw error(CL_IMAGE_FORMAT_NOT_SUPPORTED);
+ break;
+
+ default:
+ throw error(CL_INVALID_IMAGE_DESCRIPTOR);
+ }
+
+ ret_error(r_errcode, CL_SUCCESS);
+ return img;
+
+} catch (error &e) {
+ ret_error(r_errcode, e);
+ return NULL;
+}
+
+CLOVER_API cl_mem
clCreateImage2D(cl_context d_ctx, cl_mem_flags d_flags,
const cl_image_format *format,
size_t width, size_t height, size_t row_pitch,
@@ -352,16 +459,6 @@ clSetMemObjectDestructorCallback(cl_mem d_mem,
return e.get();
}
-CLOVER_API cl_mem
-clCreateImage(cl_context d_ctx, cl_mem_flags flags,
- const cl_image_format *format,
- const cl_image_desc *image_desc,
- void *host_ptr, cl_int *r_errcode) {
- CLOVER_NOT_SUPPORTED_UNTIL("1.2");
- ret_error(r_errcode, CL_INVALID_OPERATION);
- return NULL;
-}
-
CLOVER_API cl_int
clEnqueueFillBuffer(cl_command_queue command_queue, cl_mem buffer,
const void *pattern, size_t pattern_size,
--
2.5.2
More information about the mesa-dev
mailing list