#include "core/memory.hpp"
#include "core/resource.hpp"
+#include "util/u_format.h"
using namespace clover;
-memory_obj::memory_obj(context &ctx, cl_mem_flags flags,
+memory_obj::memory_obj(clover::context &ctx, cl_mem_flags flags,
size_t size, void *host_ptr) :
- ctx(ctx), _flags(flags),
- _size(size), _host_ptr(host_ptr),
- _destroy_notify([]{}) {
+ context(ctx), _flags(flags),
+ _size(size), _host_ptr(host_ptr) {
if (flags & CL_MEM_COPY_HOST_PTR)
data.append((char *)host_ptr, size);
}
memory_obj::~memory_obj() {
- _destroy_notify();
+ while (_destroy_notify.size()) {
+ _destroy_notify.top()();
+ _destroy_notify.pop();
+ }
+}
+
+bool
+memory_obj::operator==(const memory_obj &obj) const {
+ return this == &obj;
}
void
memory_obj::destroy_notify(std::function<void ()> f) {
- _destroy_notify = f;
+ _destroy_notify.push(f);
}
cl_mem_flags
return _host_ptr;
}
-buffer::buffer(context &ctx, cl_mem_flags flags,
+buffer::buffer(clover::context &ctx, cl_mem_flags flags,
size_t size, void *host_ptr) :
memory_obj(ctx, flags, size, host_ptr) {
}
return CL_MEM_OBJECT_BUFFER;
}
-root_buffer::root_buffer(context &ctx, cl_mem_flags flags,
+root_buffer::root_buffer(clover::context &ctx, cl_mem_flags flags,
size_t size, void *host_ptr) :
buffer(ctx, flags, size, host_ptr) {
}
resource &
root_buffer::resource(command_queue &q) {
// Create a new resource if there's none for this device yet.
- if (!resources.count(&q.dev)) {
+ if (!resources.count(&q.device())) {
auto r = (!resources.empty() ?
- new root_resource(q.dev, *this, *resources.begin()->second) :
- new root_resource(q.dev, *this, q, data));
+ new root_resource(q.device(), *this,
+ *resources.begin()->second) :
+ new root_resource(q.device(), *this, q, data));
- resources.insert(std::make_pair(&q.dev,
+ resources.insert(std::make_pair(&q.device(),
std::unique_ptr<root_resource>(r)));
data.clear();
}
- return *resources.find(&q.dev)->second;
+ return *resources.find(&q.device())->second;
}
sub_buffer::sub_buffer(root_buffer &parent, cl_mem_flags flags,
size_t offset, size_t size) :
- buffer(parent.ctx, flags, size,
+ buffer(parent.context(), flags, size,
(char *)parent.host_ptr() + offset),
parent(parent), _offset(offset) {
}
resource &
sub_buffer::resource(command_queue &q) {
// Create a new resource if there's none for this device yet.
- if (!resources.count(&q.dev)) {
- auto r = new sub_resource(parent.resource(q), {{ offset() }});
+ if (!resources.count(&q.device())) {
+ auto r = new sub_resource(parent().resource(q), {{ offset() }});
- resources.insert(std::make_pair(&q.dev,
+ resources.insert(std::make_pair(&q.device(),
std::unique_ptr<sub_resource>(r)));
}
- return *resources.find(&q.dev)->second;
+ return *resources.find(&q.device())->second;
}
size_t
return _offset;
}
-image::image(context &ctx, cl_mem_flags flags,
+image::image(clover::context &ctx, cl_mem_flags flags,
const cl_image_format *format,
size_t width, size_t height, size_t depth,
size_t row_pitch, size_t slice_pitch, size_t size,
resource &
image::resource(command_queue &q) {
// Create a new resource if there's none for this device yet.
- if (!resources.count(&q.dev)) {
+ if (!resources.count(&q.device())) {
auto r = (!resources.empty() ?
- new root_resource(q.dev, *this, *resources.begin()->second) :
- new root_resource(q.dev, *this, q, data));
+ new root_resource(q.device(), *this,
+ *resources.begin()->second) :
+ new root_resource(q.device(), *this, q, data));
- resources.insert(std::make_pair(&q.dev,
+ resources.insert(std::make_pair(&q.device(),
std::unique_ptr<root_resource>(r)));
data.clear();
}
- return *resources.find(&q.dev)->second;
+ return *resources.find(&q.device())->second;
}
cl_image_format
return _depth;
}
+size_t
+image::pixel_size() const {
+ return util_format_get_blocksize(translate_format(_format));
+}
+
size_t
image::row_pitch() const {
return _row_pitch;
return _slice_pitch;
}
-image2d::image2d(context &ctx, cl_mem_flags flags,
+image2d::image2d(clover::context &ctx, cl_mem_flags flags,
const cl_image_format *format, size_t width,
size_t height, size_t row_pitch,
void *host_ptr) :
- image(ctx, flags, format, width, height, 0,
+ image(ctx, flags, format, width, height, 1,
row_pitch, 0, height * row_pitch, host_ptr) {
}
return CL_MEM_OBJECT_IMAGE2D;
}
-image3d::image3d(context &ctx, cl_mem_flags flags,
+image3d::image3d(clover::context &ctx, cl_mem_flags flags,
const cl_image_format *format,
size_t width, size_t height, size_t depth,
size_t row_pitch, size_t slice_pitch,