From: Alexander Alekhin Date: Thu, 7 Sep 2017 13:40:03 +0000 (+0300) Subject: ocl: define ProgramSource before program X-Git-Tag: accepted/tizen/6.0/unified/20201030.111113~531^2~1 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=04b4495493057eee2334274b001fb9d454bd47f1;p=platform%2Fupstream%2Fopencv.git ocl: define ProgramSource before program no changes in code --- diff --git a/modules/core/src/ocl.cpp b/modules/core/src/ocl.cpp index 60dca8b..028c2a6 100644 --- a/modules/core/src/ocl.cpp +++ b/modules/core/src/ocl.cpp @@ -2489,6 +2489,130 @@ size_t Kernel::localMemSize() const sizeof(val), &val, &retsz) == CL_SUCCESS ? (size_t)val : 0; } + + +///////////////////////////////////////// ProgramSource /////////////////////////////////////////////// + +struct ProgramSource::Impl +{ + Impl(const String& src) + { + init(cv::String(), cv::String(), src, cv::String()); + } + Impl(const String& module, const String& name, const String& codeStr, const String& codeHash) + { + init(module, name, codeStr, codeHash); + } + void init(const String& module, const String& name, const String& codeStr, const String& codeHash) + { + refcount = 1; + module_ = module; + name_ = name; + codeStr_ = codeStr; + codeHash_ = codeHash; + + isHashUpdated = false; + if (codeHash_.empty()) + { + updateHash(); + codeHash_ = cv::format("%08llx", hash_); + } + } + + void updateHash() + { + hash_ = crc64((uchar*)codeStr_.c_str(), codeStr_.size()); + isHashUpdated = true; + } + + IMPLEMENT_REFCOUNTABLE(); + + String module_; + String name_; + String codeStr_; + String codeHash_; + // TODO std::vector includes_; + + bool isHashUpdated; + ProgramSource::hash_t hash_; +}; + + +ProgramSource::ProgramSource() +{ + p = 0; +} + +ProgramSource::ProgramSource(const String& module, const String& name, const String& codeStr, const String& codeHash) +{ + p = new Impl(module, name, codeStr, codeHash); +} + +ProgramSource::ProgramSource(const char* prog) +{ + p = new Impl(prog); +} + +ProgramSource::ProgramSource(const String& prog) +{ + p = new Impl(prog); +} + +ProgramSource::~ProgramSource() +{ + if(p) + p->release(); +} + +ProgramSource::ProgramSource(const ProgramSource& prog) +{ + p = prog.p; + if(p) + p->addref(); +} + +ProgramSource& ProgramSource::operator = (const ProgramSource& prog) +{ + Impl* newp = (Impl*)prog.p; + if(newp) + newp->addref(); + if(p) + p->release(); + p = newp; + return *this; +} + +const String& ProgramSource::source() const +{ + CV_Assert(p); + return p->codeStr_; +} + +ProgramSource::hash_t ProgramSource::hash() const +{ + CV_Assert(p); + if (!p->isHashUpdated) + p->updateHash(); + return p->hash_; +} + + +internal::ProgramEntry::operator ProgramSource&() const +{ + if (this->pProgramSource == NULL) + { + cv::AutoLock lock(cv::getInitializationMutex()); + if (this->pProgramSource == NULL) + { + ProgramSource* ps = new ProgramSource(this->module, this->name, this->programCode, this->programHash); + const_cast(this)->pProgramSource = ps; + } + } + return *this->pProgramSource; +} + + + /////////////////////////////////////////// Program ///////////////////////////////////////////// struct Program::Impl @@ -2717,125 +2841,6 @@ String Program::getPrefix(const String& buildflags) dev.name().c_str(), dev.driverVersion().c_str(), buildflags.c_str()); } -///////////////////////////////////////// ProgramSource /////////////////////////////////////////////// - -struct ProgramSource::Impl -{ - Impl(const String& src) - { - init(cv::String(), cv::String(), src, cv::String()); - } - Impl(const String& module, const String& name, const String& codeStr, const String& codeHash) - { - init(module, name, codeStr, codeHash); - } - void init(const String& module, const String& name, const String& codeStr, const String& codeHash) - { - refcount = 1; - module_ = module; - name_ = name; - codeStr_ = codeStr; - codeHash_ = codeHash; - - isHashUpdated = false; - if (codeHash_.empty()) - { - updateHash(); - codeHash_ = cv::format("%08llx", hash_); - } - } - - void updateHash() - { - hash_ = crc64((uchar*)codeStr_.c_str(), codeStr_.size()); - isHashUpdated = true; - } - - IMPLEMENT_REFCOUNTABLE(); - - String module_; - String name_; - String codeStr_; - String codeHash_; - // TODO std::vector includes_; - - bool isHashUpdated; - ProgramSource::hash_t hash_; -}; - - -ProgramSource::ProgramSource() -{ - p = 0; -} - -ProgramSource::ProgramSource(const String& module, const String& name, const String& codeStr, const String& codeHash) -{ - p = new Impl(module, name, codeStr, codeHash); -} - -ProgramSource::ProgramSource(const char* prog) -{ - p = new Impl(prog); -} - -ProgramSource::ProgramSource(const String& prog) -{ - p = new Impl(prog); -} - -ProgramSource::~ProgramSource() -{ - if(p) - p->release(); -} - -ProgramSource::ProgramSource(const ProgramSource& prog) -{ - p = prog.p; - if(p) - p->addref(); -} - -ProgramSource& ProgramSource::operator = (const ProgramSource& prog) -{ - Impl* newp = (Impl*)prog.p; - if(newp) - newp->addref(); - if(p) - p->release(); - p = newp; - return *this; -} - -const String& ProgramSource::source() const -{ - CV_Assert(p); - return p->codeStr_; -} - -ProgramSource::hash_t ProgramSource::hash() const -{ - CV_Assert(p); - if (!p->isHashUpdated) - p->updateHash(); - return p->hash_; -} - - -internal::ProgramEntry::operator ProgramSource&() const -{ - if (this->pProgramSource == NULL) - { - cv::AutoLock lock(cv::getInitializationMutex()); - if (this->pProgramSource == NULL) - { - ProgramSource* ps = new ProgramSource(this->module, this->name, this->programCode, this->programHash); - const_cast(this)->pProgramSource = ps; - } - } - return *this->pProgramSource; -} //////////////////////////////////////////// OpenCLAllocator //////////////////////////////////////////////////