Compare commits

...

11 Commits

Author SHA1 Message Date
refractionpcsx2
ae4be6e2b1 GS/CRC: Remove CRC for Simple 2000 Series Vol. 114, update GameDB Fixes 2025-06-04 18:35:00 +02:00
refractionpcsx2
434df49a7d GS/HW: Clear matched target on HW Move 2025-06-04 18:35:00 +02:00
JordanTheToaster
c939c0fcd5 GameDB: Re-add CRC to Death by Degrees 2025-06-04 18:33:36 +02:00
Berylskid
952c39f324 GameDB: Remove SoftwareRendererFMVHack from Armored Core 2 2025-06-03 13:44:40 +02:00
PCSX2 Bot
0fea7e2a70 [ci skip] Qt: Update Base Translation. 2025-06-03 03:40:13 +02:00
lightningterror
c1baab68d0 GS: Better handle hazards when dx12/vk device creation fails.
VK/DX12: Move CreateNullTexture before reading shader resource.
Fixes null pointer dereference.

VK: Check if vertex buffer is valid before binding.
Fixes vertex buffer validation error null handle.
2025-06-02 21:28:41 +02:00
PCSX2 Bot
ccef18f7a9 [ci skip] PAD: Update to latest controller database. 2025-06-02 19:08:36 +02:00
TheLastRar
8cb056bde3 Qt: Use DevicePixelRatioChange to detect DPR changes 2025-06-02 14:58:00 +02:00
TheLastRar
6ecaaee9e0 QtUtils: Remove redundant method 2025-06-02 14:58:00 +02:00
TheLastRar
c5f916bda0 Qt: Fix DPI icon scaling in various settings windows 2025-06-02 14:58:00 +02:00
TheLastRar
52a9a4649c Qt: Improve handling of DPI 2025-06-02 14:58:00 +02:00
20 changed files with 180 additions and 137 deletions

View File

@@ -1940,11 +1940,13 @@ SCAJ-20115:
name: "Yoshitsune Eiyuuden"
region: "NTSC-Unk"
SCAJ-20116:
name: "Death by Degrees - Tekken - Nina Williams"
region: "NTSC-C-J"
name: "戰慄殺機 鐵拳 - 妮娜 - 威廉斯"
name-en: "Death by Degrees"
region: "NTSC-C"
gsHWFixes:
alignSprite: 1 # Fixes FMV lines.
getSkipCount: "GSC_NamcoGames"
halfPixelOffset: 5 # Fixes alignment of shuffles and post processing.
alignSprite: 1 # Fixes FMV lines.
textureInsideRT: 1 # Fixes post shuffles.
SCAJ-20117:
name: "Fu-un Bakumatsu-den"
@@ -5763,8 +5765,9 @@ SCES-52586:
region: "PAL-E-S"
compat: 5
gsHWFixes:
alignSprite: 1 # Fixes FMV lines.
getSkipCount: "GSC_NamcoGames"
halfPixelOffset: 5 # Fixes alignment of shuffles and post processing.
alignSprite: 1 # Fixes FMV lines.
textureInsideRT: 1 # Fixes post shuffles.
SCES-52596:
name: "This is Football 2005"
@@ -5865,16 +5868,18 @@ SCES-53053:
name: "Death by Degrees"
region: "PAL-F-I"
gsHWFixes:
alignSprite: 1 # Fixes FMV lines.
getSkipCount: "GSC_NamcoGames"
halfPixelOffset: 5 # Fixes alignment of shuffles and post processing.
alignSprite: 1 # Fixes FMV lines.
textureInsideRT: 1 # Fixes post shuffles.
SCES-53054:
name: "Death by Degrees"
region: "PAL-E-G"
compat: 5
gsHWFixes:
alignSprite: 1 # Fixes FMV lines.
getSkipCount: "GSC_NamcoGames"
halfPixelOffset: 5 # Fixes alignment of shuffles and post processing.
alignSprite: 1 # Fixes FMV lines.
textureInsideRT: 1 # Fixes post shuffles.
SCES-53055:
name: "Eyetoy - Antigrav"
@@ -7309,8 +7314,9 @@ SCKA-20039:
name: "Tekken Nina Williams In Death By Degree"
region: "NTSC-K"
gsHWFixes:
getSkipCount: "GSC_NamcoGames"
halfPixelOffset: 5 # Fixes alignment of shuffles and post processing.
alignSprite: 1 # Fixes FMV lines.
halfPixelOffset: 2 # Aligns post effects.
textureInsideRT: 1 # Fixes post shuffles.
SCKA-20040:
name: "Jak 3"
@@ -14276,8 +14282,6 @@ SLES-50078:
SLES-50079:
name: "Armored Core 2"
region: "PAL-E"
gameFixes:
- SoftwareRendererFMVHack # Fixes random corruption.
clampModes:
eeClampMode: 2 # Fixes Abnormal AI behavior.
gsHWFixes:
@@ -34788,8 +34792,9 @@ SLPM-60257:
name-en: "Death by Degrees - Tekken - Nina Williams [Trial]"
region: "NTSC-J"
gsHWFixes:
alignSprite: 1 # Fixes FMV lines.
getSkipCount: "GSC_NamcoGames"
halfPixelOffset: 5 # Fixes alignment of shuffles and post processing.
alignSprite: 1 # Fixes FMV lines.
textureInsideRT: 1 # Fixes post shuffles.
SLPM-60258:
name: "THE TYPING OF THE DEAD ZOMBIE PANIC [体験版]"
@@ -55563,7 +55568,8 @@ SLPS-20489:
name-en: "Simple 2000 Series Vol. 114 - The Onna Okappichi Torimonochou - Oharu-chan GoGoGo!"
region: "NTSC-J"
gsHWFixes:
getSkipCount: "GSC_Simple2000Vol114"
halfPixelOffset: 5 # Fixes DoF alignment.
nativeScaling: 1 # Corrects DoF.
SLPS-20490:
name: "パチスロ倶楽部コレクション アイムジャグラーEXジャグラーセレクション"
name-sort: "ぱちすろくらぶこれくしょん あいむじゃぐらーEX じゃぐらーせれくしょん"
@@ -55725,8 +55731,6 @@ SLPS-25007:
name-sort: "あーまーどこあ 2"
name-en: "Armored Core 2"
region: "NTSC-J"
gameFixes:
- SoftwareRendererFMVHack # Fixes random corruption.
clampModes:
eeClampMode: 2 # Fixes Abnormal AI behavior.
gsHWFixes:
@@ -58223,8 +58227,9 @@ SLPS-25422:
name-en: "Death by Degrees - Tekken - Nina Williams"
region: "NTSC-J"
gsHWFixes:
alignSprite: 1 # Fixes FMV lines.
getSkipCount: "GSC_NamcoGames"
halfPixelOffset: 5 # Fixes alignment of shuffles and post processing.
alignSprite: 1 # Fixes FMV lines.
textureInsideRT: 1 # Fixes post shuffles.
SLPS-25423:
name: "怪盗アプリコット 完全版 [限定版]"
@@ -62370,8 +62375,6 @@ SLPS-73403:
name-sort: "あーまーどこあ 2 [PlayStation2 the Best]"
name-en: "Armored Core 2 [PlayStation2 the Best]"
region: "NTSC-J"
gameFixes:
- SoftwareRendererFMVHack # Fixes random corruption.
clampModes:
eeClampMode: 2 # Fixes Abnormal AI behavior.
gsHWFixes:
@@ -62626,8 +62629,6 @@ SLUS-20014:
name: "Armored Core 2"
region: "NTSC-U"
compat: 5
gameFixes:
- SoftwareRendererFMVHack # Fixes random corruption.
clampModes:
eeClampMode: 2 # Fixes Abnormal AI behavior.
gsHWFixes:
@@ -67262,8 +67263,9 @@ SLUS-20934:
region: "NTSC-U"
compat: 5
gsHWFixes:
alignSprite: 1 # Fixes FMV lines.
getSkipCount: "GSC_NamcoGames"
halfPixelOffset: 5 # Fixes alignment of shuffles and post processing.
alignSprite: 1 # Fixes FMV lines.
textureInsideRT: 1 # Fixes post shuffles.
SLUS-20935:
name: "IHRA Professional Drag Racing 2005"

View File

@@ -1283,7 +1283,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
030000006f0e00008401000011010000,Faceoff Deluxe Nintendo Switch Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
030000006f0e00008101000011010000,Faceoff Deluxe Pro Nintendo Switch Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
030000006f0e00008001000011010000,Faceoff Pro Nintendo Switch Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
03005036852100000201000010010000,Final Fantasy XIV Online Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
03000000852100000201000010010000,FF GP1,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
05000000b40400001224000001010000,Flydigi APEX 4,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b14,leftshoulder:b4,leftstick:b10,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b20,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux,
03000000b40400001124000011010000,Flydigi Vader 2,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b12,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b14,paddle1:b2,paddle2:b5,paddle3:b16,paddle4:b17,rightshoulder:b7,rightstick:b13,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,
03000000b40400001224000011010000,Flydigi Vader 2,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b12,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b2,paddle1:b16,paddle2:b17,paddle3:b14,paddle4:b15,rightshoulder:b7,rightstick:b13,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,
@@ -1606,6 +1606,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
0300132d9b2800006500000001010000,Raphnet GameCube Adapter,a:b0,b:b7,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b2,righttrigger:b5,rightx:a3,righty:a4,start:b3,x:b1,y:b8,platform:Linux,
030000009b2800003200000001010000,Raphnet GC and N64 Adapter,a:b0,b:b7,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b2,righttrigger:b5,rightx:a3,righty:a4,start:b3,x:b1,y:b8,platform:Linux,
030000009b2800006000000001010000,Raphnet GC and N64 Adapter,a:b0,b:b7,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b2,righttrigger:b5,rightx:a3,righty:a4,start:b3,x:b1,y:b8,platform:Linux,
030000009b2800006100000001010000,Raphnet N64 Adapter,+rightx:b9,+righty:b7,-rightx:b8,-righty:b6,a:b0,b:b1,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,leftshoulder:b4,lefttrigger:b2,leftx:a0,lefty:a1,rightshoulder:b5,start:b3,platform:Linux,
030000009b2800008000000020020000,Raphnet Wii Classic Adapter,a:b1,b:b4,back:b2,dpdown:b13,dpleft:b14,dpright:b15,dpup:b12,leftshoulder:b6,rightshoulder:b7,start:b3,x:b0,y:b5,platform:Linux,
030000009b2800008000000001010000,Raphnet Wii Classic Adapter V3,a:b1,b:b4,back:b2,dpdown:b13,dpleft:b14,dpright:b15,dpup:b12,leftshoulder:b6,rightshoulder:b7,start:b3,x:b0,y:b5,platform:Linux,
03000000f8270000bf0b000011010000,Razer Kishi,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,
@@ -1802,6 +1803,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
060000005e040000120b00000b050000,Xbox Series Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
060000005e040000120b00000d050000,Xbox Series Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,misc1:b11,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
060000005e040000120b00000f050000,Xbox Series Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,misc1:b11,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
050000005e040000130b000022050000,Xbox Series X Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b15,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,
050000005e040000200b000013050000,Xbox Wireless Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,
050000005e040000200b000017050000,Xbox Wireless Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,
050000005e040000220b000017050000,Xbox Wireless Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,

View File

@@ -2,6 +2,7 @@
// SPDX-License-Identifier: GPL-3.0+
#include "CoverDownloadDialog.h"
#include "QtUtils.h"
#include "pcsx2/GameList.h"
@@ -11,7 +12,7 @@ CoverDownloadDialog::CoverDownloadDialog(QWidget* parent /*= nullptr*/)
: QDialog(parent)
{
m_ui.setupUi(this);
m_ui.coverIcon->setPixmap(QIcon::fromTheme("artboard-2-line").pixmap(32));
QtUtils::SetScalableIcon(m_ui.coverIcon, QIcon::fromTheme(QStringLiteral("artboard-2-line")), QSize(32, 32));
updateEnabled();
connect(m_ui.start, &QPushButton::clicked, this, &CoverDownloadDialog::onStartClicked);

View File

@@ -52,12 +52,12 @@ DisplayWidget::~DisplayWidget()
int DisplayWidget::scaledWindowWidth() const
{
return std::max(static_cast<int>(std::ceil(static_cast<qreal>(width()) * QtUtils::GetDevicePixelRatioForWidget(this))), 1);
return std::max(static_cast<int>(std::ceil(static_cast<qreal>(width()) * devicePixelRatioF())), 1);
}
int DisplayWidget::scaledWindowHeight() const
{
return std::max(static_cast<int>(std::ceil(static_cast<qreal>(height()) * QtUtils::GetDevicePixelRatioForWidget(this))), 1);
return std::max(static_cast<int>(std::ceil(static_cast<qreal>(height()) * devicePixelRatioF())), 1);
}
std::optional<WindowInfo> DisplayWidget::getWindowInfo()
@@ -268,7 +268,7 @@ bool DisplayWidget::event(QEvent* event)
if (!m_relative_mouse_enabled)
{
const qreal dpr = QtUtils::GetDevicePixelRatioForWidget(this);
const qreal dpr = devicePixelRatioF();
const QPoint mouse_pos = mouse_event->pos();
const float scaled_x = static_cast<float>(static_cast<qreal>(mouse_pos.x()) * dpr);
@@ -349,13 +349,12 @@ bool DisplayWidget::event(QEvent* event)
return true;
}
// According to https://bugreports.qt.io/browse/QTBUG-95925 the recommended practice for handling DPI change is responding to paint events
case QEvent::Paint:
case QEvent::DevicePixelRatioChange:
case QEvent::Resize:
{
QWidget::event(event);
const float dpr = QtUtils::GetDevicePixelRatioForWidget(this);
const float dpr = devicePixelRatioF();
const u32 scaled_width = static_cast<u32>(std::max(static_cast<int>(std::ceil(static_cast<qreal>(width()) * dpr)), 1));
const u32 scaled_height = static_cast<u32>(std::max(static_cast<int>(std::ceil(static_cast<qreal>(height()) * dpr)), 1));

View File

@@ -25,17 +25,17 @@ static constexpr int COVER_ART_HEIGHT = 512;
static constexpr int COVER_ART_SPACING = 32;
static constexpr int MIN_COVER_CACHE_SIZE = 256;
static int DPRScale(int size, float dpr)
static int DPRScale(int size, qreal dpr)
{
return static_cast<int>(static_cast<float>(size) * dpr);
return static_cast<int>(static_cast<qreal>(size) * dpr);
}
static int DPRUnscale(int size, float dpr)
static int DPRUnscale(int size, qreal dpr)
{
return static_cast<int>(static_cast<float>(size) / dpr);
return static_cast<int>(static_cast<qreal>(size) / dpr);
}
static void resizeAndPadPixmap(QPixmap* pm, int expected_width, int expected_height, float dpr)
static void resizeAndPadPixmap(QPixmap* pm, int expected_width, int expected_height, qreal dpr)
{
const int dpr_expected_width = DPRScale(expected_width, dpr);
const int dpr_expected_height = DPRScale(expected_height, dpr);
@@ -71,9 +71,8 @@ static void resizeAndPadPixmap(QPixmap* pm, int expected_width, int expected_hei
}
static QPixmap createPlaceholderImage(const QPixmap& placeholder_pixmap, int width, int height, float scale,
const std::string& title)
qreal dpr, const std::string& title)
{
const float dpr = qApp->devicePixelRatio();
QPixmap pm(placeholder_pixmap.copy());
pm.setDevicePixelRatio(dpr);
if (pm.isNull())
@@ -113,9 +112,10 @@ const char* GameListModel::getColumnName(Column col)
return s_column_names[static_cast<int>(col)];
}
GameListModel::GameListModel(float cover_scale, bool show_cover_titles, QObject* parent /* = nullptr */)
GameListModel::GameListModel(float cover_scale, bool show_cover_titles, qreal dpr, QObject* parent /* = nullptr */)
: QAbstractTableModel(parent)
, m_show_titles_for_covers(show_cover_titles)
, m_dpr{dpr}
{
loadSettings();
loadCommonImages();
@@ -160,6 +160,13 @@ void GameListModel::updateCacheSize(int width, int height)
m_cover_pixmap_cache.SetMaxCapacity(static_cast<int>(std::max(num_columns * num_rows, MIN_COVER_CACHE_SIZE)));
}
void GameListModel::setDevicePixelRatio(qreal dpr)
{
m_dpr = dpr;
loadCommonImages();
refreshCovers();
}
void GameListModel::loadOrGenerateCover(const GameList::Entry* ge)
{
// Why this counter: Every time we change the cover scale, we increment the counter variable. This way if the scale is changed
@@ -173,12 +180,11 @@ void GameListModel::loadOrGenerateCover(const GameList::Entry* ge)
const std::string cover_path(GameList::GetCoverImagePathForEntry(&entry));
if (!cover_path.empty())
{
const float dpr = qApp->devicePixelRatio();
image = QPixmap(QString::fromStdString(cover_path));
if (!image.isNull())
{
image.setDevicePixelRatio(dpr);
resizeAndPadPixmap(&image, getCoverArtWidth(), getCoverArtHeight(), dpr);
image.setDevicePixelRatio(m_dpr);
resizeAndPadPixmap(&image, getCoverArtWidth(), getCoverArtHeight(), m_dpr);
}
}
}
@@ -186,7 +192,7 @@ void GameListModel::loadOrGenerateCover(const GameList::Entry* ge)
const std::string& title = entry.GetTitle(m_prefer_english_titles);
if (image.isNull())
image = createPlaceholderImage(m_placeholder_pixmap, getCoverArtWidth(), getCoverArtHeight(), m_cover_scale, title);
image = createPlaceholderImage(m_placeholder_pixmap, getCoverArtWidth(), getCoverArtHeight(), m_cover_scale, m_dpr, title);
if (m_cover_scale_counter.load(std::memory_order_acquire) != counter)
image = {};
@@ -575,10 +581,10 @@ QIcon GameListModel::getIconForRegion(GameList::Region region)
void GameListModel::loadThemeSpecificImages()
{
for (u32 type = 0; type < static_cast<u32>(GameList::EntryType::Count); type++)
m_type_pixmaps[type] = getIconForType(static_cast<GameList::EntryType>(type)).pixmap(QSize(24, 24));
m_type_pixmaps[type] = getIconForType(static_cast<GameList::EntryType>(type)).pixmap(QSize(24, 24), m_dpr);
for (u32 i = 0; i < static_cast<u32>(GameList::Region::Count); i++)
m_region_pixmaps[i] = getIconForRegion(static_cast<GameList::Region>(i)).pixmap(QSize(36, 26));
m_region_pixmaps[i] = getIconForRegion(static_cast<GameList::Region>(i)).pixmap(QSize(36, 26), m_dpr);
}
void GameListModel::loadCommonImages()
@@ -587,7 +593,7 @@ void GameListModel::loadCommonImages()
const QString base_path(QtHost::GetResourcesBasePath());
for (u32 i = 1; i < GameList::CompatibilityRatingCount; i++)
m_compatibility_pixmaps[i].load(QStringLiteral("%1/icons/star-%2.svg").arg(base_path).arg(i - 1));
m_compatibility_pixmaps[i] = QIcon((QStringLiteral("%1/icons/star-%2.svg").arg(base_path).arg(i - 1))).pixmap(QSize(88, 16), m_dpr);
m_placeholder_pixmap.load(QStringLiteral("%1/cover-placeholder.png").arg(base_path));
}

View File

@@ -43,7 +43,7 @@ public:
static QIcon getIconForType(GameList::EntryType type);
static QIcon getIconForRegion(GameList::Region region);
GameListModel(float cover_scale, bool show_cover_titles, QObject* parent = nullptr);
GameListModel(float cover_scale, bool show_cover_titles, qreal dpr, QObject* parent = nullptr);
~GameListModel();
int rowCount(const QModelIndex& parent = QModelIndex()) const override;
@@ -71,6 +71,8 @@ public:
void refreshCovers();
void updateCacheSize(int width, int height);
void setDevicePixelRatio(qreal dpr);
Q_SIGNALS:
void coverScaleChanged();
@@ -94,6 +96,7 @@ private:
std::array<QPixmap, static_cast<u32>(GameList::Region::Count)> m_region_pixmaps;
QPixmap m_placeholder_pixmap;
QPixmap m_loading_pixmap;
qreal m_dpr;
std::array<QPixmap, static_cast<int>(GameList::CompatibilityRatingCount)> m_compatibility_pixmaps;
mutable LRUCache<std::string, QPixmap> m_cover_pixmap_cache;

View File

@@ -181,7 +181,7 @@ void GameListWidget::initialize()
{
const float cover_scale = Host::GetBaseFloatSettingValue("UI", "GameListCoverArtScale", 0.45f);
const bool show_cover_titles = Host::GetBaseBoolSettingValue("UI", "GameListShowCoverTitles", true);
m_model = new GameListModel(cover_scale, show_cover_titles, this);
m_model = new GameListModel(cover_scale, show_cover_titles, devicePixelRatioF(), this);
m_model->updateCacheSize(width(), height());
m_sort_model = new GameListSortModel(m_model);
@@ -559,6 +559,18 @@ void GameListWidget::resizeEvent(QResizeEvent* event)
m_model->updateCacheSize(width(), height());
}
bool GameListWidget::event(QEvent* event)
{
if (event->type() == QEvent::DevicePixelRatioChange)
{
m_model->setDevicePixelRatio(devicePixelRatioF());
QWidget::event(event);
return true;
}
return QWidget::event(event);
}
void GameListWidget::resizeTableViewColumnsToFit()
{
QtUtils::ResizeColumnsForTableView(m_table_view, {

View File

@@ -93,6 +93,7 @@ public Q_SLOTS:
protected:
void resizeEvent(QResizeEvent* event);
bool event(QEvent* event) override;
private:
void loadTableViewColumnVisibilitySettings();

View File

@@ -254,15 +254,6 @@ namespace QtUtils
widget->resize(width, height);
}
qreal GetDevicePixelRatioForWidget(const QWidget* widget)
{
const QScreen* screen_for_ratio = widget->screen();
if (!screen_for_ratio)
screen_for_ratio = QGuiApplication::primaryScreen();
return screen_for_ratio ? screen_for_ratio->devicePixelRatio() : static_cast<qreal>(1);
}
std::optional<WindowInfo> GetWindowInfoForWidget(QWidget* widget)
{
WindowInfo wi;
@@ -303,7 +294,7 @@ namespace QtUtils
}
#endif
const qreal dpr = GetDevicePixelRatioForWidget(widget);
const qreal dpr = widget->devicePixelRatioF();
wi.surface_width = static_cast<u32>(static_cast<qreal>(widget->width()) * dpr);
wi.surface_height = static_cast<u32>(static_cast<qreal>(widget->height()) * dpr);
wi.surface_scale = static_cast<float>(dpr);
@@ -374,4 +365,37 @@ namespace QtUtils
return true;
}
class IconVariableDpiFilter : QObject
{
public:
explicit IconVariableDpiFilter(QLabel* lbl, const QIcon& icon, const QSize& size, QObject* parent = nullptr)
: QObject(parent)
, m_lbl{lbl}
, m_icn{icon}
, m_size{size}
{
lbl->installEventFilter(this);
m_lbl->setPixmap(m_icn.pixmap(m_size, m_lbl->devicePixelRatioF()));
}
protected:
bool eventFilter(QObject* object, QEvent* event) override
{
if (object == m_lbl && event->type() == QEvent::DevicePixelRatioChange)
m_lbl->setPixmap(m_icn.pixmap(m_size, m_lbl->devicePixelRatioF()));
// Don't block the event
return false;
}
private:
QLabel* m_lbl;
QIcon m_icn;
QSize m_size;
};
void SetScalableIcon(QLabel* lbl, const QIcon& icon, const QSize& size)
{
new IconVariableDpiFilter(lbl, icon, size, lbl);
}
} // namespace QtUtils

View File

@@ -20,6 +20,7 @@ class QAction;
class QComboBox;
class QFileInfo;
class QFrame;
class QIcon;
class QLabel;
class QKeyEvent;
class QSlider;
@@ -82,9 +83,6 @@ namespace QtUtils
/// Adjusts the fixed size for a window if it's not resizeable.
void ResizePotentiallyFixedSizeWindow(QWidget* widget, int width, int height);
/// Returns the pixel ratio/scaling factor for a widget.
qreal GetDevicePixelRatioForWidget(const QWidget* widget);
/// Returns the common window info structure for a Qt widget.
std::optional<WindowInfo> GetWindowInfoForWidget(QWidget* widget);
@@ -102,4 +100,8 @@ namespace QtUtils
bool IsLightTheme(const QPalette& palette);
bool IsCompositorManagerRunning();
/// Sets the scalable icon to a given label (svg icons, or icons with multiple size pixmaps)
/// The icon will then be reloaded on DPR changes using an event filter
void SetScalableIcon(QLabel* lbl, const QIcon& icon, const QSize& size);
} // namespace QtUtils

View File

@@ -3,6 +3,7 @@
#include "AchievementLoginDialog.h"
#include "QtHost.h"
#include "QtUtils.h"
#include "pcsx2/Achievements.h"
@@ -15,7 +16,7 @@ AchievementLoginDialog::AchievementLoginDialog(QWidget* parent, Achievements::Lo
, m_reason(reason)
{
m_ui.setupUi(this);
m_ui.loginIcon->setPixmap(QIcon::fromTheme("login-box-line").pixmap(32));
QtUtils::SetScalableIcon(m_ui.loginIcon, QIcon::fromTheme(QStringLiteral("login-box-line")), QSize(32, 32));
setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint);
// Adjust text if needed based on reason.
@@ -116,7 +117,6 @@ void AchievementLoginDialog::processLoginResult(bool result, const QString& mess
g_emu_thread->resetVM();
}
}
}
done(0);

View File

@@ -342,7 +342,7 @@ void AudioSettingsWidget::onExpansionSettingsClicked()
QDialog dlg(QtUtils::GetRootWidget(this));
Ui::AudioExpansionSettingsDialog dlgui;
dlgui.setupUi(&dlg);
dlgui.icon->setPixmap(QIcon::fromTheme(QStringLiteral("volume-up-line")).pixmap(32, 32));
QtUtils::SetScalableIcon(dlgui.icon, QIcon::fromTheme(QStringLiteral("volume-up-line")), QSize(32, 32));
SettingsInterface* sif = m_dialog->getSettingsInterface();
SettingWidgetBinder::BindWidgetToIntSetting(sif, dlgui.blockSize, "SPU2/Output", "ExpandBlockSize",
@@ -431,7 +431,7 @@ void AudioSettingsWidget::onStretchSettingsClicked()
QDialog dlg(QtUtils::GetRootWidget(this));
Ui::AudioStretchSettingsDialog dlgui;
dlgui.setupUi(&dlg);
dlgui.icon->setPixmap(QIcon::fromTheme(QStringLiteral("volume-up-line")).pixmap(32, 32));
QtUtils::SetScalableIcon(dlgui.icon, QIcon::fromTheme(QStringLiteral("volume-up-line")), QSize(32, 32));
SettingsInterface* sif = m_dialog->getSettingsInterface();
SettingWidgetBinder::BindWidgetToIntSetting(sif, dlgui.sequenceLength, "SPU2/Output", "StretchSequenceLengthMS",

View File

@@ -170,7 +170,7 @@ ControllerMouseSettingsDialog::ControllerMouseSettingsDialog(QWidget* parent, Co
SettingsInterface* sif = dialog->getProfileSettingsInterface();
m_ui.icon->setPixmap(QIcon::fromTheme(QStringLiteral("mouse-line")).pixmap(32, 32));
QtUtils::SetScalableIcon(m_ui.icon, QIcon::fromTheme(QStringLiteral("mouse-line")), QSize(32, 32));
ControllerSettingWidgetBinder::BindWidgetToInputProfileFloat(sif, m_ui.pointerXSpeedSlider, "Pad", "PointerXSpeed", 40.0f);
ControllerSettingWidgetBinder::BindWidgetToInputProfileFloat(sif, m_ui.pointerYSpeedSlider, "Pad", "PointerYSpeed", 40.0f);
@@ -202,11 +202,10 @@ ControllerMappingSettingsDialog::ControllerMappingSettingsDialog(ControllerSetti
SettingsInterface* sif = parent->getProfileSettingsInterface();
m_ui.icon->setPixmap(QIcon::fromTheme(QStringLiteral("settings-3-line")).pixmap(32, 32));
QtUtils::SetScalableIcon(m_ui.icon, QIcon::fromTheme(QStringLiteral("settings-3-line")), QSize(32, 32));
ControllerSettingWidgetBinder::BindWidgetToInputProfileBool(sif, m_ui.ignoreInversion, "InputSources", "IgnoreInversion", false);
connect(m_ui.buttonBox->button(QDialogButtonBox::Close), &QPushButton::clicked, this, &QDialog::accept);
}
ControllerMappingSettingsDialog::~ControllerMappingSettingsDialog() = default;

View File

@@ -9,6 +9,7 @@
#include <QtWidgets/QPushButton>
#include "Settings/MemoryCardCreateDialog.h"
#include "QtUtils.h"
#include "pcsx2/SIO/Memcard/MemoryCardFile.h"
@@ -16,7 +17,7 @@ MemoryCardCreateDialog::MemoryCardCreateDialog(QWidget* parent /* = nullptr */)
: QDialog(parent)
{
m_ui.setupUi(this);
m_ui.icon->setPixmap(QIcon::fromTheme("memcard-line").pixmap(m_ui.icon->width()));
QtUtils::SetScalableIcon(m_ui.icon, QIcon::fromTheme(QStringLiteral("memcard-line")), QSize(m_ui.icon->width(), m_ui.icon->width()));
setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint);

View File

@@ -95,27 +95,27 @@
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Settings/AchievementLoginDialog.cpp" line="25"/>
<location filename="../Settings/AchievementLoginDialog.cpp" line="26"/>
<source>&lt;strong&gt;Your RetroAchievements login token is no longer valid.&lt;/strong&gt; You must re-enter your credentials for achievements to be tracked. Your password will not be saved in PCSX2, an access token will be generated and used instead.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Settings/AchievementLoginDialog.cpp" line="30"/>
<location filename="../Settings/AchievementLoginDialog.cpp" line="31"/>
<source>&amp;Login</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Settings/AchievementLoginDialog.cpp" line="43"/>
<location filename="../Settings/AchievementLoginDialog.cpp" line="44"/>
<source>Logging in...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Settings/AchievementLoginDialog.cpp" line="73"/>
<location filename="../Settings/AchievementLoginDialog.cpp" line="74"/>
<source>Login Error</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Settings/AchievementLoginDialog.cpp" line="74"/>
<location filename="../Settings/AchievementLoginDialog.cpp" line="75"/>
<source>Login failed.
Error: %1
@@ -123,29 +123,29 @@ Please check your username and password, and try again.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Settings/AchievementLoginDialog.cpp" line="75"/>
<location filename="../Settings/AchievementLoginDialog.cpp" line="76"/>
<source>Login failed.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Settings/AchievementLoginDialog.cpp" line="83"/>
<location filename="../Settings/AchievementLoginDialog.cpp" line="84"/>
<source>Enable Achievements</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Settings/AchievementLoginDialog.cpp" line="84"/>
<location filename="../Settings/AchievementLoginDialog.cpp" line="85"/>
<source>Achievement tracking is not currently enabled. Your login will have no effect until after tracking is enabled.
Do you want to enable tracking now?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Settings/AchievementLoginDialog.cpp" line="95"/>
<location filename="../Settings/AchievementLoginDialog.cpp" line="96"/>
<source>Enable Hardcore Mode</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Settings/AchievementLoginDialog.cpp" line="96"/>
<location filename="../Settings/AchievementLoginDialog.cpp" line="97"/>
<source>Hardcore mode is not currently enabled. Enabling hardcore mode allows you to set times, scores, and participate in game-specific leaderboards.
However, hardcore mode also prevents the usage of save states, cheats and slowdown functionality.
@@ -154,12 +154,12 @@ Do you want to enable hardcore mode?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Settings/AchievementLoginDialog.cpp" line="112"/>
<location filename="../Settings/AchievementLoginDialog.cpp" line="113"/>
<source>Reset System</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Settings/AchievementLoginDialog.cpp" line="113"/>
<location filename="../Settings/AchievementLoginDialog.cpp" line="114"/>
<source>Hardcore mode will not be enabled until the system is reset. Do you want to reset the system now?</source>
<translation type="unfinished"></translation>
</message>
@@ -3539,7 +3539,7 @@ You cannot undo this action.</source>
</message>
<message>
<location filename="../CoverDownloadDialog.ui" line="95"/>
<location filename="../CoverDownloadDialog.cpp" line="86"/>
<location filename="../CoverDownloadDialog.cpp" line="87"/>
<source>Start</source>
<translation type="unfinished"></translation>
</message>
@@ -3549,12 +3549,12 @@ You cannot undo this action.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../CoverDownloadDialog.cpp" line="64"/>
<location filename="../CoverDownloadDialog.cpp" line="65"/>
<source>Download complete.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../CoverDownloadDialog.cpp" line="86"/>
<location filename="../CoverDownloadDialog.cpp" line="87"/>
<source>Stop</source>
<translation type="unfinished"></translation>
</message>
@@ -11599,7 +11599,7 @@ graphical quality, but this will increase system requirements.</source>
<translation type="unfinished"></translation>
</message>
<message numerus="yes">
<location filename="../GameList/GameListModel.cpp" line="268"/>
<location filename="../GameList/GameListModel.cpp" line="274"/>
<location filename="../../pcsx2/GameList.cpp" line="1200"/>
<source>%n hours</source>
<translation type="unfinished">
@@ -11608,7 +11608,7 @@ graphical quality, but this will increase system requirements.</source>
</translation>
</message>
<message numerus="yes">
<location filename="../GameList/GameListModel.cpp" line="270"/>
<location filename="../GameList/GameListModel.cpp" line="276"/>
<location filename="../../pcsx2/GameList.cpp" line="1202"/>
<source>%n minutes</source>
<translation type="unfinished">
@@ -11625,52 +11625,52 @@ graphical quality, but this will increase system requirements.</source>
<context>
<name>GameListModel</name>
<message>
<location filename="../GameList/GameListModel.cpp" line="597"/>
<location filename="../GameList/GameListModel.cpp" line="603"/>
<source>Type</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../GameList/GameListModel.cpp" line="598"/>
<location filename="../GameList/GameListModel.cpp" line="604"/>
<source>Code</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../GameList/GameListModel.cpp" line="599"/>
<location filename="../GameList/GameListModel.cpp" line="605"/>
<source>Title</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../GameList/GameListModel.cpp" line="600"/>
<location filename="../GameList/GameListModel.cpp" line="606"/>
<source>File Title</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../GameList/GameListModel.cpp" line="601"/>
<location filename="../GameList/GameListModel.cpp" line="607"/>
<source>CRC</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../GameList/GameListModel.cpp" line="602"/>
<location filename="../GameList/GameListModel.cpp" line="608"/>
<source>Time Played</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../GameList/GameListModel.cpp" line="603"/>
<location filename="../GameList/GameListModel.cpp" line="609"/>
<source>Last Played</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../GameList/GameListModel.cpp" line="604"/>
<location filename="../GameList/GameListModel.cpp" line="610"/>
<source>Size</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../GameList/GameListModel.cpp" line="605"/>
<location filename="../GameList/GameListModel.cpp" line="611"/>
<source>Region</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../GameList/GameListModel.cpp" line="606"/>
<location filename="../GameList/GameListModel.cpp" line="612"/>
<source>Compatibility</source>
<translation type="unfinished"></translation>
</message>
@@ -17587,10 +17587,10 @@ Savestates should not be used in place of in-game saves.</source>
<name>MemoryCardCreateDialog</name>
<message>
<location filename="../Settings/MemoryCardCreateDialog.ui" line="14"/>
<location filename="../Settings/MemoryCardCreateDialog.cpp" line="106"/>
<location filename="../Settings/MemoryCardCreateDialog.cpp" line="113"/>
<location filename="../Settings/MemoryCardCreateDialog.cpp" line="120"/>
<location filename="../Settings/MemoryCardCreateDialog.cpp" line="133"/>
<location filename="../Settings/MemoryCardCreateDialog.cpp" line="107"/>
<location filename="../Settings/MemoryCardCreateDialog.cpp" line="114"/>
<location filename="../Settings/MemoryCardCreateDialog.cpp" line="121"/>
<location filename="../Settings/MemoryCardCreateDialog.cpp" line="134"/>
<source>Create Memory Card</source>
<translation type="unfinished"></translation>
</message>
@@ -17671,22 +17671,22 @@ Savestates should not be used in place of in-game saves.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Settings/MemoryCardCreateDialog.cpp" line="107"/>
<location filename="../Settings/MemoryCardCreateDialog.cpp" line="108"/>
<source>Failed to create the Memory Card, because the name &apos;%1&apos; contains one or more invalid characters.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Settings/MemoryCardCreateDialog.cpp" line="114"/>
<location filename="../Settings/MemoryCardCreateDialog.cpp" line="115"/>
<source>Failed to create the Memory Card, because another card with the name &apos;%1&apos; already exists.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Settings/MemoryCardCreateDialog.cpp" line="121"/>
<location filename="../Settings/MemoryCardCreateDialog.cpp" line="122"/>
<source>Failed to create the Memory Card, the log may contain more information.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Settings/MemoryCardCreateDialog.cpp" line="133"/>
<location filename="../Settings/MemoryCardCreateDialog.cpp" line="134"/>
<source>Memory Card &apos;%1&apos; created.</source>
<translation type="unfinished"></translation>
</message>

View File

@@ -703,11 +703,17 @@ bool GSDevice12::Create(GSVSyncMode vsync_mode, bool allow_present_throttle)
if (!AcquireWindow(true) || (m_window_info.type != WindowInfo::Type::Surfaceless && !CreateSwapChain()))
return false;
if (!CreateNullTexture())
{
Host::ReportErrorAsync("GS", "Failed to create dummy texture");
return false;
}
{
std::optional<std::string> shader = ReadShaderSource("shaders/dx11/tfx.fx");
if (!shader.has_value())
{
Host::ReportErrorAsync("GS", "Failed to read shaders/dx11/tfx.fxf.");
Host::ReportErrorAsync("GS", "Failed to read shaders/dx11/tfx.fx.");
return false;
}
@@ -717,12 +723,6 @@ bool GSDevice12::Create(GSVSyncMode vsync_mode, bool allow_present_throttle)
if (!m_shader_cache.Open(m_feature_level, GSConfig.UseDebugDevice))
Console.Warning("D3D12: Shader cache failed to open.");
if (!CreateNullTexture())
{
Host::ReportErrorAsync("GS", "Failed to create dummy texture");
return false;
}
if (!CreateRootSignatures())
{
Host::ReportErrorAsync("GS", "Failed to create pipeline layouts");

View File

@@ -557,26 +557,6 @@ bool GSHwHack::GSC_TalesofSymphonia(GSRendererHW& r, int& skip)
return true;
}
bool GSHwHack::GSC_Simple2000Vol114(GSRendererHW& r, int& skip)
{
if (skip == 0)
{
if (!s_nativeres && RTME == 0 && (RFBP == 0x1500) && (RTBP0 == 0x2c97 || RTBP0 == 0x2ace || RTBP0 == 0x03d0 || RTBP0 == 0x2448) && (RFBMSK == 0x0000))
{
// Don't enable hack on native res if crc is below aggressive.
// Upscaling issues, removes glow/blur effect which fixes ghosting.
skip = 1;
}
if (RTME && (RFBP == 0x0e00) && (RTBP0 == 0x1000) && (RFBMSK == 0x0000))
{
// Depth shadows.
skip = 1;
}
}
return true;
}
bool GSHwHack::GSC_UrbanReign(GSRendererHW& r, int& skip)
{
if (skip == 0)
@@ -1419,7 +1399,6 @@ const GSHwHack::Entry<GSRendererHW::GSC_Ptr> GSHwHack::s_get_skip_count_function
CRC_F(GSC_SacredBlaze),
CRC_F(GSC_GuitarHero),
CRC_F(GSC_SakuraWarsSoLongMyLove),
CRC_F(GSC_Simple2000Vol114),
CRC_F(GSC_SFEX3),
CRC_F(GSC_DTGames),
CRC_F(GSC_TalesOfLegendia),

View File

@@ -21,7 +21,6 @@ public:
static bool GSC_SakuraWarsSoLongMyLove(GSRendererHW& r, int& skip);
static bool GSC_UltramanFightingEvolution(GSRendererHW& r, int& skip);
static bool GSC_TalesofSymphonia(GSRendererHW& r, int& skip);
static bool GSC_Simple2000Vol114(GSRendererHW& r, int& skip);
static bool GSC_UrbanReign(GSRendererHW& r, int& skip);
static bool GSC_SteambotChronicles(GSRendererHW& r, int& skip);
static bool GSC_BlueTongueGames(GSRendererHW& r, int& skip);

View File

@@ -4808,8 +4808,17 @@ bool GSTextureCache::Move(u32 SBP, u32 SBW, u32 SPSM, int sx, int sy, u32 DBP, u
if (!dst)
dst = CreateTarget(new_TEX0, target_size, target_size, src->m_scale, src->m_type);
else // Expand if necessary (Silent hill 4 takes an old target which is smaller).
{
dst->ResizeTexture(std::max(dst->m_unscaled_size.x, target_size.x), std::max(dst->m_unscaled_size.y, target_size.y));
// If it was matched to an old target, make sure to clear the other type and update its information.
if (dst->m_was_dst_matched)
{
g_texture_cache->InvalidateVideoMemType(GSTextureCache::DepthStencil - dst->m_type, dst->m_TEX0.TBP0);
dst->m_TEX0 = new_TEX0;
}
}
if (!dst)
return false;

View File

@@ -2059,6 +2059,12 @@ bool GSDeviceVK::Create(GSVSyncMode vsync_mode, bool allow_present_throttle)
return false;
}
if (!CreateNullTexture())
{
Host::ReportErrorAsync("GS", "Failed to create dummy texture");
return false;
}
{
std::optional<std::string> shader = ReadShaderSource("shaders/vulkan/tfx.glsl");
if (!shader.has_value())
@@ -2070,12 +2076,6 @@ bool GSDeviceVK::Create(GSVSyncMode vsync_mode, bool allow_present_throttle)
m_tfx_source = std::move(*shader);
}
if (!CreateNullTexture())
{
Host::ReportErrorAsync("GS", "Failed to create dummy texture");
return false;
}
if (!CreatePipelineLayouts())
{
Host::ReportErrorAsync("GS", "Failed to create pipeline layouts");
@@ -5291,8 +5291,12 @@ void GSDeviceVK::SetPipeline(VkPipeline pipeline)
void GSDeviceVK::SetInitialState(VkCommandBuffer cmdbuf)
{
const VkDeviceSize buffer_offset = 0;
vkCmdBindVertexBuffers(cmdbuf, 0, 1, m_vertex_stream_buffer.GetBufferPtr(), &buffer_offset);
VkBuffer buffer = *m_vertex_stream_buffer.GetBufferPtr();
if (buffer != VK_NULL_HANDLE)
{
constexpr VkDeviceSize buffer_offset = 0;
vkCmdBindVertexBuffers(cmdbuf, 0, 1, &buffer, &buffer_offset);
}
}
__ri void GSDeviceVK::ApplyBaseState(u32 flags, VkCommandBuffer cmdbuf)