SEXP createBufferIntegerVector(SEXP sContext, SEXP sMemFlag, SEXP sGlobalWorkSize){
    Rcpp::XPtr<cl_context> context(sContext);
    int globalWorkSize = Rcpp::as<int>(sGlobalWorkSize);
    
    cl_mem_flags flags = getMemFlags(sMemFlag);
    cl_mem *memBuffer = new cl_mem;
    cl_int ciErr1 = CL_SUCCESS;
    *memBuffer = clCreateBuffer(*context, flags, sizeof(int) * globalWorkSize, NULL, &ciErr1);
    printOnError(ciErr1,"ROpenCL::createBufferIntegerVector()");
    
    Rcpp::XPtr<cl_mem> tempXPtr(memBuffer);
    return tempXPtr;
}
BufferId CLContextWrapper::shareGLTexture(const GLTextureId textureId, BufferType type)
{
    auto flags = getMemFlags(type);

    cl_int err = 0;

    cl_mem mem = clCreateFromGLTexture(_this->context, flags, GL_TEXTURE_2D, 0, textureId, &err);

    if(err || !mem)
    {
        logError("Error: Failed to share texture with Opengl.", getError(err));
        return 0;
    }

    _this->buffers.insert(mem);

    return mem;

}
BufferId CLContextWrapper::createBuffer(size_t bytesSize, void * hostData, BufferType type)
{
    cl_int err;
    cl_mem_flags flags  = getMemFlags(type);

    if(hostData)
    {
        flags |= CL_MEM_COPY_HOST_PTR;
    }

    cl_mem buffer =  clCreateBuffer(_this->context, flags, bytesSize, hostData,  &err);
    if(!buffer)
    {
        std::cout << "Error: Failed to allocate buffer" << std::endl;
        std::cout << getError(err) << std::endl;
        return 0;
    }

    _this->buffers.insert(buffer);
    return buffer;
}