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<ProgramSource> 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<ProgramEntry*>(this)->pProgramSource = ps;
+ }
+ }
+ return *this->pProgramSource;
+}
+
+
+
/////////////////////////////////////////// Program /////////////////////////////////////////////
struct Program::Impl
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<ProgramSource> 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<ProgramEntry*>(this)->pProgramSource = ps;
- }
- }
- return *this->pProgramSource;
-}
//////////////////////////////////////////// OpenCLAllocator //////////////////////////////////////////////////