Auto select tesseract versions depending on cpu info
This commit is contained in:
parent
fdfa43c093
commit
0e72af3770
@ -131,6 +131,51 @@ void cleanupOutdated(QSettings& settings)
|
|||||||
settings.endGroup();
|
settings.endGroup();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
#include <intrin.h>
|
||||||
|
#endif
|
||||||
|
#ifdef __GNUC__
|
||||||
|
void __cpuid(int* cpuinfo, int info)
|
||||||
|
{
|
||||||
|
__asm__ __volatile__(
|
||||||
|
"xchg %%ebx, %%edi;"
|
||||||
|
"cpuid;"
|
||||||
|
"xchg %%ebx, %%edi;"
|
||||||
|
: "=a"(cpuinfo[0]), "=D"(cpuinfo[1]), "=c"(cpuinfo[2]), "=d"(cpuinfo[3])
|
||||||
|
: "0"(info));
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned long long _xgetbv(unsigned int index)
|
||||||
|
{
|
||||||
|
unsigned int eax, edx;
|
||||||
|
__asm__ __volatile__("xgetbv;" : "=a"(eax), "=d"(edx) : "c"(index));
|
||||||
|
return ((unsigned long long)edx << 32) | eax;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
bool checkOptimizedTesseractSupport()
|
||||||
|
{
|
||||||
|
bool sse4_1Supportted = false;
|
||||||
|
bool sse4_2Supportted = false;
|
||||||
|
bool avxSupportted = false;
|
||||||
|
|
||||||
|
int cpuinfo[4];
|
||||||
|
__cpuid(cpuinfo, 1);
|
||||||
|
|
||||||
|
sse4_1Supportted = cpuinfo[2] & (1 << 19) || false;
|
||||||
|
sse4_2Supportted = cpuinfo[2] & (1 << 20) || false;
|
||||||
|
|
||||||
|
avxSupportted = cpuinfo[2] & (1 << 28) || false;
|
||||||
|
bool osxsaveSupported = cpuinfo[2] & (1 << 27) || false;
|
||||||
|
if (osxsaveSupported && avxSupportted) {
|
||||||
|
// _XCR_XFEATURE_ENABLED_MASK = 0
|
||||||
|
unsigned long long xcrFeatureMask = _xgetbv(0);
|
||||||
|
avxSupportted = (xcrFeatureMask & 0x6) == 0x6;
|
||||||
|
}
|
||||||
|
|
||||||
|
return sse4_1Supportted && sse4_2Supportted && avxSupportted;
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
void Settings::save() const
|
void Settings::save() const
|
||||||
@ -263,9 +308,15 @@ void Settings::load()
|
|||||||
|
|
||||||
settings.beginGroup(qs_recogntionGroup);
|
settings.beginGroup(qs_recogntionGroup);
|
||||||
sourceLanguage = settings.value(qs_ocrLanguage, sourceLanguage).toString();
|
sourceLanguage = settings.value(qs_ocrLanguage, sourceLanguage).toString();
|
||||||
|
if (!settings.contains(qs_tesseractVersion)) {
|
||||||
|
tesseractVersion = checkOptimizedTesseractSupport()
|
||||||
|
? TesseractVersion::Optimized
|
||||||
|
: TesseractVersion::Compatible;
|
||||||
|
} else {
|
||||||
tesseractVersion = TesseractVersion(std::clamp(
|
tesseractVersion = TesseractVersion(std::clamp(
|
||||||
settings.value(qs_tesseractVersion, int(tesseractVersion)).toInt(),
|
settings.value(qs_tesseractVersion, int(tesseractVersion)).toInt(),
|
||||||
int(TesseractVersion::Optimized), int(TesseractVersion::Compatible)));
|
int(TesseractVersion::Optimized), int(TesseractVersion::Compatible)));
|
||||||
|
}
|
||||||
settings.endGroup();
|
settings.endGroup();
|
||||||
|
|
||||||
settings.beginGroup(qs_correctionGroup);
|
settings.beginGroup(qs_correctionGroup);
|
||||||
|
Loading…
Reference in New Issue
Block a user