// // Copyright 2021 The ANGLE Project Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // // CLMemoryCL.cpp: Implements the class methods for CLMemoryCL. #include "libANGLE/renderer/cl/CLMemoryCL.h" #include "libANGLE/renderer/cl/CLContextCL.h" #include "libANGLE/CLBuffer.h" #include "libANGLE/CLContext.h" #include "libANGLE/cl_utils.h" namespace rx { CLMemoryCL::CLMemoryCL(const cl::Memory &memory, cl_mem native) : CLMemoryImpl(memory), mNative(native) { memory.getContext().getImpl().mData->mMemories.emplace(memory.getNative()); } CLMemoryCL::~CLMemoryCL() { const size_t numRemoved = mMemory.getContext().getImpl().mData->mMemories.erase(mMemory.getNative()); ASSERT(numRemoved == 1u); if (mNative->getDispatch().clReleaseMemObject(mNative) != CL_SUCCESS) { ERR() << "Error while releasing CL memory object"; } } angle::Result CLMemoryCL::createSubBuffer(const cl::Buffer &buffer, cl::MemFlags flags, size_t size, CLMemoryImpl::Ptr *subBufferOut) { cl_int errorCode = CL_SUCCESS; const cl_buffer_region region = {buffer.getOffset(), size}; const cl_mem nativeBuffer = mNative->getDispatch().clCreateSubBuffer( mNative, flags.get(), CL_BUFFER_CREATE_TYPE_REGION, ®ion, &errorCode); ANGLE_CL_TRY(errorCode); *subBufferOut = CLMemoryImpl::Ptr(nativeBuffer != nullptr ? new CLMemoryCL(buffer, nativeBuffer) : nullptr); return angle::Result::Continue; } } // namespace rx