From de4102a648109451ea5d51c19784cbb1015aa469 Mon Sep 17 00:00:00 2001 From: Ivan Pelipenko Date: Sun, 31 Jan 2021 21:34:17 +0300 Subject: [PATCH] PIOpenCL::Buffer API improvements --- libs/main/opencl/piopencl.h | 2 ++ libs/opencl/piopencl.cpp | 18 ++++++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/libs/main/opencl/piopencl.h b/libs/main/opencl/piopencl.h index a9704821..c8dcb8d0 100644 --- a/libs/main/opencl/piopencl.h +++ b/libs/main/opencl/piopencl.h @@ -180,8 +180,10 @@ public: void clear(); void copyToContainer(); void copyTo(void * data); + void copyTo(void * data, int elements_count, int elements_offset = 0); void copyFromContainer(); void copyFrom(void * data); + void copyFrom(void * data, int elements_count, int elements_offset = 0); uint elementsCount() const {return elements;} private: enum Container { diff --git a/libs/opencl/piopencl.cpp b/libs/opencl/piopencl.cpp index 5ac9dad8..a3dc52c0 100644 --- a/libs/opencl/piopencl.cpp +++ b/libs/opencl/piopencl.cpp @@ -408,6 +408,15 @@ void PIOpenCL::Buffer::copyTo(void * data) { } +void PIOpenCL::Buffer::copyTo(void * data, int elements_count, int elements_offset) { + if (!PRIVATE->buffer) return; + cl_int ret = clEnqueueReadBuffer(context_->PRIVATEWB->queue, PRIVATE->buffer, CL_TRUE, elements_offset * def.size(), elements_count * def.size(), data, 0, 0, 0); + if (ret != 0) { + piCout << "[PIOpenCL::Buffer]" << "clEnqueueReadBuffer error" << ret; + } +} + + void PIOpenCL::Buffer::copyFromContainer() { if (!PRIVATE->buffer || !container) return; copyFrom(containerData()); @@ -423,6 +432,15 @@ void PIOpenCL::Buffer::copyFrom(void * data) { } +void PIOpenCL::Buffer::copyFrom(void * data, int elements_count, int elements_offset) { + if (!PRIVATE->buffer) return; + cl_int ret = clEnqueueWriteBuffer(context_->PRIVATEWB->queue, PRIVATE->buffer, CL_TRUE, elements_offset * def.size(), elements_count * def.size(), data, 0, 0, 0); + if (ret != 0) { + piCout << "[PIOpenCL::Buffer]" << "clEnqueueWriteBuffer error" << ret; + } +} + + PIOpenCL::Program::Program() {