- Separate vsync option for exclusive full screen because it tends to work better, so you may want to enable it while leaving non-exclusive vsync off.

- Add some tool tips.


git-svn-id: https://gambatte.svn.sourceforge.net/svnroot/gambatte@260 9dfb2916-2d38-0410-aef4-c5fe6c9ffc24
This commit is contained in:
sinamas 2011-09-11 16:03:55 +00:00
parent bdbb19c1ee
commit 71a555532b
6 changed files with 76 additions and 5 deletions

View File

@ -66,6 +66,7 @@ Direct3DBlitter::Direct3DBlitter(VideoBufferLocker vbl, QWidget *parent) :
adapterSelector(new QComboBox),
vblankblit_(new QCheckBox("Wait for vertical blank"), "direct3dblitter/vblankblit", false),
flipping_(new QCheckBox("Exclusive full screen"), "direct3dblitter/flipping", false),
vblankflip_(new QCheckBox("Flip during vertical blank"), "direct3dblitter/vblankflip", true),
triplebuf_(new QCheckBox("Triple buffering"), "direct3dblitter/triplebuf", false),
bf_(new QCheckBox("Bilinear filtering"), "direct3dblitter/bf", true),
d3d9handle(NULL),
@ -128,12 +129,27 @@ Direct3DBlitter::Direct3DBlitter(VideoBufferLocker vbl, QWidget *parent) :
}
mainLayout->addWidget(vblankblit_.checkBox());
vblankblit_.checkBox()->setToolTip(tr("Prevents tearing. Does not work well on all systems.\n"
"Ignored when exclusive full screen or DWM composition is active."));
mainLayout->addWidget(flipping_.checkBox());
flipping_.checkBox()->setToolTip(tr("Grabs device for better performance when full screen."));
{
QHBoxLayout *const l = new QHBoxLayout;
l->addSpacing(QApplication::style()->pixelMetric(QStyle::PM_LayoutLeftMargin));
l->addWidget(vblankflip_.checkBox());
vblankflip_.checkBox()->setToolTip(tr("Prevents tearing. Recommended."));
mainLayout->addLayout(l);
}
mainLayout->addWidget(triplebuf_.checkBox());
triplebuf_.checkBox()->setToolTip(tr("Attempts to improve video flow at the cost of increased latency."));
mainLayout->addWidget(bf_.checkBox());
confWidget->setLayout(mainLayout);
}
vblankflip_.checkBox()->setEnabled(flipping_.checkBox()->isChecked());
connect(flipping_.checkBox(), SIGNAL(toggled(bool)), vblankflip_.checkBox(), SLOT(setEnabled(bool)));
rejectSettings();
}
@ -180,7 +196,7 @@ void Direct3DBlitter::getPresentParams(D3DPRESENT_PARAMETERS *const presentParam
presentParams->Flags = 0;
presentParams->FullScreen_RefreshRateInHz = excl ? displayMode.RefreshRate : 0;
presentParams->PresentationInterval = swapInterval == 2 ? D3DPRESENT_INTERVAL_TWO :
(swapInterval == 1 || (vblankblit_.value() && (excl || !DwmControl::isCompositingEnabled()))
(swapInterval == 1 || (excl ? vblankflip_.value() : vblankblit_.value() && !DwmControl::isCompositingEnabled())
? D3DPRESENT_INTERVAL_ONE : D3DPRESENT_INTERVAL_IMMEDIATE);
}
@ -378,7 +394,9 @@ void Direct3DBlitter::present() {
if (swapChain) {
enum { DONOTWAIT = 1 };
swapChain->Present(NULL, NULL, 0, NULL, vblankblit_.value() ? DONOTWAIT : 0);
const DWORD flags = (windowed ? vblankblit_.value() : vblankflip_.value()) ? DONOTWAIT : 0;
swapChain->Present(NULL, NULL, 0, NULL, flags);
swapChain->Release();
} else
device->Present(NULL, NULL, 0, NULL);
@ -567,6 +585,7 @@ void Direct3DBlitter::acceptSettings() {
exclusiveChange();
vblankblit_.accept();
vblankflip_.accept();
triplebuf_.accept();
bf_.accept();
resetDevice();
@ -576,6 +595,7 @@ void Direct3DBlitter::rejectSettings() const {
adapterSelector->setCurrentIndex(adapterIndex);
flipping_.reject();
vblankblit_.reject();
vblankflip_.reject();
triplebuf_.reject();
bf_.reject();
}

View File

@ -33,6 +33,7 @@ class Direct3DBlitter : public BlitterWidget {
QComboBox *const adapterSelector;
PersistCheckBox vblankblit_;
PersistCheckBox flipping_;
PersistCheckBox vblankflip_;
PersistCheckBox triplebuf_;
PersistCheckBox bf_;
HMODULE d3d9handle;

View File

@ -49,6 +49,7 @@ DirectDrawBlitter::DirectDrawBlitter(VideoBufferLocker vbl, QWidget *parent) :
confWidget(new QWidget),
vblank_(new QCheckBox(QString("Wait for vertical blank")), "directdrawblitter/vblank", false),
flipping_(new QCheckBox(QString("Exclusive full screen")), "directdrawblitter/flipping", false),
vblankflip_(new QCheckBox(QString("Flip during vertical blank")), "directdrawblitter/vblankflip", true),
triplebuf_(new QCheckBox("Triple buffering"), "directdrawblitter/triplebuf", false),
videoSurface_(new QCheckBox(QString("Use video memory surface")), "directdrawblitter/videoSurface", true),
deviceSelector(new QComboBox),
@ -95,11 +96,19 @@ DirectDrawBlitter::DirectDrawBlitter(VideoBufferLocker vbl, QWidget *parent) :
}
mainLayout->addWidget(vblank_.checkBox());
vblank_.checkBox()->setToolTip(tr("Prevents tearing. Does not work well on all systems.\n"
"Ignored when exclusive full screen or DWM composition is active."));
mainLayout->addWidget(flipping_.checkBox());
flipping_.checkBox()->setToolTip(tr("Grabs device for better performance when full screen."));
{
QHBoxLayout *l = new QHBoxLayout;
l->addSpacing(QApplication::style()->pixelMetric(QStyle::PM_LayoutLeftMargin));
l->addWidget(vblankflip_.checkBox());
vblankflip_.checkBox()->setToolTip(tr("Prevents tearing. Recommended."));
mainLayout->addLayout(l);
l = new QHBoxLayout;
l->addSpacing(QApplication::style()->pixelMetric(QStyle::PM_LayoutLeftMargin));
l->addWidget(triplebuf_.checkBox());
mainLayout->addLayout(l);
}
@ -107,7 +116,9 @@ DirectDrawBlitter::DirectDrawBlitter(VideoBufferLocker vbl, QWidget *parent) :
mainLayout->addWidget(videoSurface_.checkBox());
confWidget->setLayout(mainLayout);
vblankflip_.checkBox()->setEnabled(flipping_.checkBox()->isChecked());
triplebuf_.checkBox()->setEnabled(flipping_.checkBox()->isChecked());
connect(flipping_.checkBox(), SIGNAL(toggled(bool)), vblankflip_.checkBox(), SLOT(setEnabled(bool)));
connect(flipping_.checkBox(), SIGNAL(toggled(bool)), triplebuf_.checkBox(), SLOT(setEnabled(bool)));
rejectSettings();
@ -561,12 +572,12 @@ long DirectDrawBlitter::sync() {
lastblank = now;
} else {
if (!blitted)
finalBlit(vblank_.value() ? DDBLT_DONOTWAIT : DDBLT_WAIT);
finalBlit(vblankflip_.value() ? DDBLT_DONOTWAIT : DDBLT_WAIT);
if (lpDDSPrimary && blitted)
ddrval = lpDDSPrimary->Flip(NULL,
(vblank_.value() ? DDFLIP_DONOTWAIT : DDFLIP_WAIT) |
(vblank_.value() ? 0 : DDFLIP_NOVSYNC));
(vblankflip_.value() ? DDFLIP_DONOTWAIT : DDFLIP_WAIT) |
(vblankflip_.value() ? 0 : DDFLIP_NOVSYNC));
}
} else {
if (const unsigned si = swapInterval ? swapInterval : vblank_.value() && !DwmControl::isCompositingEnabled()) {
@ -606,6 +617,7 @@ void DirectDrawBlitter::acceptSettings() {
vblank_.accept();
flipping_.accept();
vblankflip_.accept();
triplebuf_.accept();
videoSurface_.accept();
@ -629,6 +641,7 @@ void DirectDrawBlitter::acceptSettings() {
void DirectDrawBlitter::rejectSettings() const {
vblank_.reject();
flipping_.reject();
vblankflip_.reject();
triplebuf_.reject();
videoSurface_.reject();
deviceSelector->setCurrentIndex(deviceIndex);

View File

@ -33,6 +33,7 @@ class DirectDrawBlitter : public BlitterWidget {
const std::auto_ptr<QWidget> confWidget;
PersistCheckBox vblank_;
PersistCheckBox flipping_;
PersistCheckBox vblankflip_;
PersistCheckBox triplebuf_;
PersistCheckBox videoSurface_;
QComboBox *const deviceSelector;

View File

@ -1,3 +1,21 @@
/***************************************************************************
* Copyright (C) 2011 by Sindre Aamås *
* aamas@stud.ntnu.no *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License version 2 as *
* published by the Free Software Foundation. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License version 2 for more details. *
* *
* You should have received a copy of the GNU General Public License *
* version 2 along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
***************************************************************************/
#include "dwmcontrol.h"
#ifdef Q_WS_WIN

View File

@ -1,3 +1,21 @@
/***************************************************************************
* Copyright (C) 2011 by Sindre Aamås *
* aamas@stud.ntnu.no *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License version 2 as *
* published by the Free Software Foundation. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License version 2 for more details. *
* *
* You should have received a copy of the GNU General Public License *
* version 2 along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
***************************************************************************/
#ifndef DWMCONTROL_H_
#define DWMCONTROL_H_