Moved CPU capabilities check to the main window init function.

This commit is contained in:
LoRd_MuldeR 2012-02-07 21:48:25 +01:00
parent 9db58c543f
commit f07f8bcb13
6 changed files with 44 additions and 43 deletions

View File

@ -423,7 +423,7 @@ extern "C"
/* /*
* Detect CPU features * Detect CPU features
*/ */
x264_cpu_t x264_detect_cpu_features(int argc, char **argv) const x264_cpu_t x264_detect_cpu_features(int argc, char **argv)
{ {
typedef BOOL (WINAPI *IsWow64ProcessFun)(__in HANDLE hProcess, __out PBOOL Wow64Process); typedef BOOL (WINAPI *IsWow64ProcessFun)(__in HANDLE hProcess, __out PBOOL Wow64Process);
typedef VOID (WINAPI *GetNativeSystemInfoFun)(__out LPSYSTEM_INFO lpSystemInfo); typedef VOID (WINAPI *GetNativeSystemInfoFun)(__out LPSYSTEM_INFO lpSystemInfo);

View File

@ -19,6 +19,8 @@
// http://www.gnu.org/licenses/gpl-2.0.txt // http://www.gnu.org/licenses/gpl-2.0.txt
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
#pragma once
#include "targetver.h" #include "targetver.h"
//C++ includes //C++ includes
@ -102,7 +104,7 @@ const char *x264_version_compiler(void);
const char *x264_version_arch(void); const char *x264_version_arch(void);
void x264_init_console(int argc, char* argv[]); void x264_init_console(int argc, char* argv[]);
bool x264_init_qt(int argc, char* argv[]); bool x264_init_qt(int argc, char* argv[]);
x264_cpu_t x264_detect_cpu_features(int argc, char **argv); const x264_cpu_t x264_detect_cpu_features(int argc, char **argv);
bool x264_shutdown_computer(const QString &message, const unsigned long timeout, const bool forceShutdown); bool x264_shutdown_computer(const QString &message, const unsigned long timeout, const bool forceShutdown);
SIZE_T x264_dbg_private_bytes(void); SIZE_T x264_dbg_private_bytes(void);
void x264_finalization(void); void x264_finalization(void);

View File

@ -55,27 +55,12 @@ static int x264_main(int argc, char* argv[])
} }
//Detect CPU capabilities //Detect CPU capabilities
x264_cpu_t cpuFeatures = x264_detect_cpu_features(argc, argv); const x264_cpu_t cpuFeatures = x264_detect_cpu_features(argc, argv);
qDebug(" CPU vendor id : %s (Intel: %s)", cpuFeatures.vendor, X264_BOOL(cpuFeatures.intel)); qDebug(" CPU vendor id : %s (Intel: %s)", cpuFeatures.vendor, X264_BOOL(cpuFeatures.intel));
qDebug("CPU brand string : %s", cpuFeatures.brand); qDebug("CPU brand string : %s", cpuFeatures.brand);
qDebug(" CPU signature : Family: %d, Model: %d, Stepping: %d", cpuFeatures.family, cpuFeatures.model, cpuFeatures.stepping); qDebug(" CPU signature : Family: %d, Model: %d, Stepping: %d", cpuFeatures.family, cpuFeatures.model, cpuFeatures.stepping);
qDebug("CPU capabilities : MMX=%s, MMXEXT=%s, SSE=%s, SSE2=%s, SSE3=%s, SSSE3=%s, X64=%s", X264_BOOL(cpuFeatures.mmx), X264_BOOL(cpuFeatures.mmx2), X264_BOOL(cpuFeatures.sse), X264_BOOL(cpuFeatures.sse2), X264_BOOL(cpuFeatures.sse3), X264_BOOL(cpuFeatures.ssse3), X264_BOOL(cpuFeatures.x64)); qDebug("CPU capabilities : MMX=%s, MMXEXT=%s, SSE=%s, SSE2=%s, SSE3=%s, SSSE3=%s, X64=%s", X264_BOOL(cpuFeatures.mmx), X264_BOOL(cpuFeatures.mmx2), X264_BOOL(cpuFeatures.sse), X264_BOOL(cpuFeatures.sse2), X264_BOOL(cpuFeatures.sse3), X264_BOOL(cpuFeatures.ssse3), X264_BOOL(cpuFeatures.x64));
qDebug(" Number of CPU's : %d\n", cpuFeatures.count); qDebug(" Number of CPU's : %d\n", cpuFeatures.count);
//Make sure this CPU can run x264 (requires MMX + MMXEXT/iSSE to run x264 with ASM enabled, additionally requires SSE1 for most x264 builds)
if(!(cpuFeatures.mmx && cpuFeatures.mmx2))
{
qFatal("Sorry, but this machine is not physically capable of running x264. Please get a CPU that supports at least the MMX and MMXEXT instruction sets!");
}
else if(!(cpuFeatures.mmx && cpuFeatures.sse))
{
qWarning("WARNING: System does not support SSE1, most x264 builds will not work !!!\n");
for(;;)
{
int ret = MessageBoxW(NULL, L"BIG FAT WARNING: This machine apparently does NOT support the SSE1 instruction set and thus probably will NOT be able to run x264!", L"Simple x264 Launcher", MB_ABORTRETRYIGNORE|MB_TOPMOST|MB_ICONEXCLAMATION);
if(ret == IDIGNORE) break; else if(ret == IDRETRY) continue; else return -1;
}
}
//Initialize Qt //Initialize Qt
if(!x264_init_qt(argc, argv)) if(!x264_init_qt(argc, argv))
@ -87,7 +72,7 @@ static int x264_main(int argc, char* argv[])
qApp->setStyle(new QPlastiqueStyle()); qApp->setStyle(new QPlastiqueStyle());
//Create Main Window //Create Main Window
MainWindow *mainWin = new MainWindow(cpuFeatures.x64); MainWindow *mainWin = new MainWindow(&cpuFeatures);
mainWin->show(); mainWin->show();
//Run application //Run application

View File

@ -1038,7 +1038,7 @@ QString EncodeThread::commandline2string(const QString &program, const QStringLi
QStringList EncodeThread::splitParams(const QString &params) QStringList EncodeThread::splitParams(const QString &params)
{ {
QStringList list; QStringList list;
bool isQuoted = false; bool ignoreWhitespaces = false;
QString temp; QString temp;
for(int i = 0; i < params.length(); i++) for(int i = 0; i < params.length(); i++)
@ -1047,11 +1047,10 @@ QStringList EncodeThread::splitParams(const QString &params)
if(c == QChar::fromLatin1('"')) if(c == QChar::fromLatin1('"'))
{ {
APPEND_AND_CLEAR(list, temp); ignoreWhitespaces = (!ignoreWhitespaces);
isQuoted = (!isQuoted);
continue; continue;
} }
else if((!isQuoted) && (c == QChar::fromLatin1(' '))) else if((!ignoreWhitespaces) && (c == QChar::fromLatin1(' ')))
{ {
APPEND_AND_CLEAR(list, temp); APPEND_AND_CLEAR(list, temp);
continue; continue;

View File

@ -21,7 +21,6 @@
#include "win_main.h" #include "win_main.h"
#include "global.h"
#include "model_jobList.h" #include "model_jobList.h"
#include "model_options.h" #include "model_options.h"
#include "win_addJob.h" #include "win_addJob.h"
@ -50,9 +49,9 @@ const char *home_url = "http://mulder.brhack.net/";
// Constructor & Destructor // Constructor & Destructor
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
MainWindow::MainWindow(bool x64supported) MainWindow::MainWindow(const x264_cpu_t *const cpuFeatures)
: :
m_x64supported(x64supported), m_cpuFeatures(cpuFeatures),
m_appDir(QApplication::applicationDirPath()), m_appDir(QApplication::applicationDirPath()),
m_firstShow(true) m_firstShow(true)
{ {
@ -75,7 +74,7 @@ MainWindow::MainWindow(bool x64supported)
//Update title //Update title
labelBuildDate->setText(tr("Built on %1 at %2").arg(x264_version_date().toString(Qt::ISODate), QString::fromLatin1(x264_version_time()))); labelBuildDate->setText(tr("Built on %1 at %2").arg(x264_version_date().toString(Qt::ISODate), QString::fromLatin1(x264_version_time())));
labelBuildDate->installEventFilter(this); labelBuildDate->installEventFilter(this);
setWindowTitle(QString("%1 (%2 Mode)").arg(windowTitle(), m_x64supported ? "64-Bit" : "32-Bit")); setWindowTitle(QString("%1 (%2 Mode)").arg(windowTitle(), m_cpuFeatures->x64 ? "64-Bit" : "32-Bit"));
if(X264_DEBUG) if(X264_DEBUG)
{ {
setWindowTitle(QString("%1 | !!! DEBUG VERSION !!!").arg(windowTitle())); setWindowTitle(QString("%1 | !!! DEBUG VERSION !!!").arg(windowTitle()));
@ -131,7 +130,7 @@ MainWindow::MainWindow(bool x64supported)
connect(actionPreferences, SIGNAL(triggered()), this, SLOT(showPreferences())); connect(actionPreferences, SIGNAL(triggered()), this, SLOT(showPreferences()));
//Create floating label //Create floating label
m_label = new QLabel(jobsView); m_label = new QLabel(jobsView->viewport());
m_label->setText(tr("No job created yet. Please click the 'Add New Job' button!")); m_label->setText(tr("No job created yet. Please click the 'Add New Job' button!"));
m_label->setAlignment(Qt::AlignHCenter | Qt::AlignVCenter); m_label->setAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
SET_TEXT_COLOR(m_label, Qt::darkGray); SET_TEXT_COLOR(m_label, Qt::darkGray);
@ -139,8 +138,8 @@ MainWindow::MainWindow(bool x64supported)
m_label->setVisible(true); m_label->setVisible(true);
m_label->setContextMenuPolicy(Qt::ActionsContextMenu); m_label->setContextMenuPolicy(Qt::ActionsContextMenu);
m_label->addActions(jobsView->actions()); m_label->addActions(jobsView->actions());
connect(splitter, SIGNAL(splitterMoved(int, int)), this, SLOT(updateLabel())); connect(splitter, SIGNAL(splitterMoved(int, int)), this, SLOT(updateLabelPos()));
updateLabel(); updateLabelPos();
//Create options object //Create options object
m_options = new OptionsModel(); m_options = new OptionsModel();
@ -167,7 +166,7 @@ void MainWindow::addButtonPressed(const QString &filePath, int fileNo, int fileT
{ {
if(ok) *ok = false; if(ok) *ok = false;
AddJobDialog *addDialog = new AddJobDialog(this, m_options, m_x64supported); AddJobDialog *addDialog = new AddJobDialog(this, m_options, m_cpuFeatures->x64);
addDialog->setRunImmediately(countRunningJobs() < (m_preferences.autoRunNextJob ? m_preferences.maxRunningJobCount : 1)); addDialog->setRunImmediately(countRunningJobs() < (m_preferences.autoRunNextJob ? m_preferences.maxRunningJobCount : 1));
if((fileNo >= 0) && (fileTotal > 1)) addDialog->setWindowTitle(addDialog->windowTitle().append(tr(" (File %1 of %2)").arg(QString::number(fileNo+1), QString::number(fileTotal)))); if((fileNo >= 0) && (fileTotal > 1)) addDialog->setWindowTitle(addDialog->windowTitle().append(tr(" (File %1 of %2)").arg(QString::number(fileNo+1), QString::number(fileTotal))));
if(!filePath.isEmpty()) addDialog->setSourceFile(filePath); if(!filePath.isEmpty()) addDialog->setSourceFile(filePath);
@ -181,8 +180,8 @@ void MainWindow::addButtonPressed(const QString &filePath, int fileNo, int fileT
addDialog->outputFile(), addDialog->outputFile(),
m_options, m_options,
QString("%1/toolset").arg(m_appDir), QString("%1/toolset").arg(m_appDir),
m_x64supported, m_cpuFeatures->x64,
m_x64supported && m_preferences.useAvisyth64Bit m_cpuFeatures->x64 && m_preferences.useAvisyth64Bit
); );
QModelIndex newIndex = m_jobList->insertJob(thrd); QModelIndex newIndex = m_jobList->insertJob(thrd);
@ -380,7 +379,7 @@ void MainWindow::showWebLink(void)
void MainWindow::showPreferences(void) void MainWindow::showPreferences(void)
{ {
PreferencesDialog *preferences = new PreferencesDialog(this, &m_preferences, m_x64supported); PreferencesDialog *preferences = new PreferencesDialog(this, &m_preferences, m_cpuFeatures->x64);
preferences->exec(); preferences->exec();
X264_DELETE(preferences); X264_DELETE(preferences);
} }
@ -485,7 +484,7 @@ void MainWindow::init(void)
static const char *binFiles = "x264.exe:x264_x64.exe:avs2yuv.exe:avs2yuv_x64.exe"; static const char *binFiles = "x264.exe:x264_x64.exe:avs2yuv.exe:avs2yuv_x64.exe";
QStringList binaries = QString::fromLatin1(binFiles).split(":", QString::SkipEmptyParts); QStringList binaries = QString::fromLatin1(binFiles).split(":", QString::SkipEmptyParts);
updateLabel(); updateLabelPos();
//Check all binaries //Check all binaries
while(!binaries.isEmpty()) while(!binaries.isEmpty())
@ -526,6 +525,20 @@ void MainWindow::init(void)
if(rnd != val) { close(); qApp->exit(-1); return; } if(rnd != val) { close(); qApp->exit(-1); return; }
} }
//Make sure this CPU can run x264 (requires MMX + MMXEXT/iSSE to run x264 with ASM enabled, additionally requires SSE1 for most x264 builds)
if(!(m_cpuFeatures->mmx && m_cpuFeatures->mmx2))
{
QMessageBox::critical(this, tr("Unsupported CPU"), tr("<nobr>Sorry, but this machine is <b>not</b> physically capable of running x264 (with assembly).<br>Please get a CPU that supports at least the MMX and MMXEXT instruction sets!</nobr>"), tr("Quit"));
qFatal("System does not support MMX and MMXEXT, x264 will not work !!!");
close(); qApp->exit(-1); return;
}
else if(!(m_cpuFeatures->mmx && m_cpuFeatures->sse))
{
qWarning("WARNING: System does not support SSE1, most x264 builds will not work !!!\n");
int val = QMessageBox::warning(this, tr("Unsupported CPU"), tr("<nobr>It appears that this machine does <b>not</b> support the SSE1 instruction set.<br>Thus most builds of x264 will <b>not</b> run on this computer at all.<br><br>Please get a CPU that supports the MMX and SSE1 instruction sets!</nobr>"), tr("Quit"), tr("Ignore"));
if(val != 1) { close(); qApp->exit(-1); return; }
}
//Check for Avisynth support //Check for Avisynth support
bool avsAvailable = false; bool avsAvailable = false;
QLibrary *avsLib = new QLibrary("avisynth.dll"); QLibrary *avsLib = new QLibrary("avisynth.dll");
@ -536,7 +549,7 @@ void MainWindow::init(void)
if(!avsAvailable) if(!avsAvailable)
{ {
avsLib->unload(); X264_DELETE(avsLib); avsLib->unload(); X264_DELETE(avsLib);
int val = QMessageBox::warning(this, tr("Avisynth Missing"), tr("<nobr>It appears that Avisynth is not currently installed on your computer.<br>Thus Avisynth input will not be working at all!<br><br>Please download and install Avisynth:<br><a href=\"http://sourceforge.net/projects/avisynth2/files/AviSynth%202.5/\">http://sourceforge.net/projects/avisynth2/files/AviSynth 2.5/</a></nobr>").replace("-", "&minus;"), tr("Quit"), tr("Ignore")); int val = QMessageBox::warning(this, tr("Avisynth Missing"), tr("<nobr>It appears that Avisynth is <b>not</b> currently installed on your computer.<br>Thus Avisynth (.avs) input will <b>not</b> be working at all!<br><br>Please download and install Avisynth:<br><a href=\"http://sourceforge.net/projects/avisynth2/files/AviSynth%202.5/\">http://sourceforge.net/projects/avisynth2/files/AviSynth 2.5/</a></nobr>").replace("-", "&minus;"), tr("Quit"), tr("Ignore"));
if(val != 1) { close(); qApp->exit(-1); return; } if(val != 1) { close(); qApp->exit(-1); return; }
} }
@ -568,7 +581,7 @@ void MainWindow::init(void)
bAddFile = (current.compare("--add", Qt::CaseInsensitive) == 0); bAddFile = (current.compare("--add", Qt::CaseInsensitive) == 0);
continue; continue;
} }
if(QFileInfo(current).exists() && QFileInfo(current).isFile()) if((!current.startsWith("--")) && QFileInfo(current).exists() && QFileInfo(current).isFile())
{ {
files << QFileInfo(current).canonicalFilePath(); files << QFileInfo(current).canonicalFilePath();
} }
@ -585,9 +598,10 @@ void MainWindow::init(void)
} }
} }
void MainWindow::updateLabel(void) void MainWindow::updateLabelPos(void)
{ {
m_label->setGeometry(0, 0, jobsView->width(), jobsView->height()); const QWidget *const viewPort = jobsView->viewport();
m_label->setGeometry(0, 0, viewPort->width(), viewPort->height());
} }
void MainWindow::copyLogToClipboard(bool checked) void MainWindow::copyLogToClipboard(bool checked)
@ -653,7 +667,7 @@ void MainWindow::closeEvent(QCloseEvent *e)
void MainWindow::resizeEvent(QResizeEvent *e) void MainWindow::resizeEvent(QResizeEvent *e)
{ {
QMainWindow::resizeEvent(e); QMainWindow::resizeEvent(e);
updateLabel(); updateLabelPos();
} }
bool MainWindow::eventFilter(QObject *o, QEvent *e) bool MainWindow::eventFilter(QObject *o, QEvent *e)

View File

@ -24,6 +24,7 @@
#include "uic_win_main.h" #include "uic_win_main.h"
#include "thread_encode.h" #include "thread_encode.h"
#include "win_preferences.h" #include "win_preferences.h"
#include "global.h"
class JobListModel; class JobListModel;
class OptionsModel; class OptionsModel;
@ -34,7 +35,7 @@ class MainWindow: public QMainWindow, private Ui::MainWindow
Q_OBJECT Q_OBJECT
public: public:
MainWindow(bool x64supported); MainWindow(const x264_cpu_t *const cpuFeatures);
~MainWindow(void); ~MainWindow(void);
protected: protected:
@ -55,7 +56,7 @@ private:
PreferencesDialog::Preferences m_preferences; PreferencesDialog::Preferences m_preferences;
const bool m_x64supported; const x264_cpu_t *const m_cpuFeatures;
const QString m_appDir; const QString m_appDir;
void updateButtons(EncodeThread::JobStatus status); void updateButtons(EncodeThread::JobStatus status);
@ -79,5 +80,5 @@ private slots:
void showWebLink(void); void showWebLink(void);
void shutdownComputer(void); void shutdownComputer(void);
void startButtonPressed(void); void startButtonPressed(void);
void updateLabel(void); void updateLabelPos(void);
}; };