From e6bc36e1100d610dc08172bded3d5946f21d9f33 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 17 Mar 2023 22:20:03 +0000 Subject: [PATCH 01/15] Fetch translations & Recreate libretro_core_options_intl.h --- shell/libretro/libretro_core_options_intl.h | 76 ++++++++++----------- 1 file changed, 38 insertions(+), 38 deletions(-) diff --git a/shell/libretro/libretro_core_options_intl.h b/shell/libretro/libretro_core_options_intl.h index 7877f4914..21de47d70 100644 --- a/shell/libretro/libretro_core_options_intl.h +++ b/shell/libretro/libretro_core_options_intl.h @@ -33810,18 +33810,18 @@ struct retro_core_options_v2 options_hu = { #define CATEGORY_VMU_LABEL_ID NULL #define CATEGORY_VMU_INFO_0_ID NULL #define CORE_OPTION_NAME_REGION_LABEL_ID "Daerah" -#define OPTION_VAL_JAPAN_ID NULL +#define OPTION_VAL_JAPAN_ID "Jepang" #define OPTION_VAL_USA_ID NULL -#define OPTION_VAL_EUROPE_ID NULL +#define OPTION_VAL_EUROPE_ID "Eropa" #define OPTION_VAL_DEFAULT_ID NULL #define CORE_OPTION_NAME_LANGUAGE_LABEL_ID "Bahasa" #define CORE_OPTION_NAME_LANGUAGE_INFO_0_ID NULL -#define OPTION_VAL_JAPANESE_ID NULL -#define OPTION_VAL_ENGLISH_ID NULL -#define OPTION_VAL_GERMAN_ID NULL -#define OPTION_VAL_FRENCH_ID NULL -#define OPTION_VAL_SPANISH_ID NULL -#define OPTION_VAL_ITALIAN_ID NULL +#define OPTION_VAL_JAPANESE_ID "Bahasa Jepang" +#define OPTION_VAL_ENGLISH_ID "Bahasa Inggris" +#define OPTION_VAL_GERMAN_ID "Bahasa Jerman" +#define OPTION_VAL_FRENCH_ID "Bahasa Perancis" +#define OPTION_VAL_SPANISH_ID "Bahasa Spanyol" +#define OPTION_VAL_ITALIAN_ID "Bahasa Itali" #define CORE_OPTION_NAME_HLE_BIOS_LABEL_ID NULL #define CORE_OPTION_NAME_HLE_BIOS_INFO_0_ID "Paksa penggunaan BIOS emulasi tingkat tinggi." #define CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_ID "Boot ke BIOS (Perlu Dimulai Ulang)" @@ -33879,7 +33879,7 @@ struct retro_core_options_v2 options_hu = { #define OPTION_VAL_PAL_M_ID NULL #define CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_ID "Orientasi Layar" #define OPTION_VAL_HORIZONTAL_ID NULL -#define OPTION_VAL_VERTICAL_ID NULL +#define OPTION_VAL_VERTICAL_ID "Vertikal" #define CORE_OPTION_NAME_ALPHA_SORTING_LABEL_ID NULL #define OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_ID NULL #define OPTION_VAL_PER_TRIANGLE_NORMAL_ID NULL @@ -33970,10 +33970,10 @@ struct retro_core_options_v2 options_hu = { #define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_ID NULL #define CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_ID NULL #define CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_ID NULL -#define OPTION_VAL_UPPER_LEFT_ID NULL -#define OPTION_VAL_UPPER_RIGHT_ID NULL -#define OPTION_VAL_LOWER_LEFT_ID NULL -#define OPTION_VAL_LOWER_RIGHT_ID NULL +#define OPTION_VAL_UPPER_LEFT_ID "Kiri Atas" +#define OPTION_VAL_UPPER_RIGHT_ID "Kanan Atas" +#define OPTION_VAL_LOWER_LEFT_ID "Kiri Bawah" +#define OPTION_VAL_LOWER_RIGHT_ID "Kanan Bawah" #define CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_ID NULL #define OPTION_VAL_1X_ID NULL #define OPTION_VAL_3X_ID NULL @@ -49051,10 +49051,10 @@ struct retro_core_options_v2 options_pt_pt = { #define OPTION_VAL_12160X9120_RU NULL #define OPTION_VAL_12800X9600_RU NULL #define CORE_OPTION_NAME_CABLE_TYPE_LABEL_RU "Тип кабеля" -#define CORE_OPTION_NAME_CABLE_TYPE_INFO_0_RU "Тип выводимого сигнала. ТВ (Композитный) наиболее поддерживаемый." +#define CORE_OPTION_NAME_CABLE_TYPE_INFO_0_RU "Тип выходного сигнала. Наиболее поддерживаемым является 'ТВ (композит)'." #define OPTION_VAL_VGA_RU NULL #define OPTION_VAL_TV_RGB_RU "ТВ (RGB)" -#define OPTION_VAL_TV_COMPOSITE_RU "ТВ (композитный)" +#define OPTION_VAL_TV_COMPOSITE_RU "ТВ (композит)" #define CORE_OPTION_NAME_BROADCAST_LABEL_RU "Стандарт вещания" #define OPTION_VAL_NTSC_RU NULL #define OPTION_VAL_PAL_RU "PAL (Мир)" @@ -49064,10 +49064,10 @@ struct retro_core_options_v2 options_pt_pt = { #define OPTION_VAL_HORIZONTAL_RU "Горизонтальная" #define OPTION_VAL_VERTICAL_RU "Вертикальная" #define CORE_OPTION_NAME_ALPHA_SORTING_LABEL_RU "Альфа-сортировка" -#define OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_RU "По слоям (самый быстрый, но наименее точный)" -#define OPTION_VAL_PER_TRIANGLE_NORMAL_RU "По треугольникам (обычный)" -#define OPTION_VAL_PER_PIXEL_ACCURATE_RU "По пикселям (самый точный, но наиболее медленный)" -#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_RU NULL +#define OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_RU "По слоям (самая быстрая, наименее точная)" +#define OPTION_VAL_PER_TRIANGLE_NORMAL_RU "По треугольникам (стандартная)" +#define OPTION_VAL_PER_PIXEL_ACCURATE_RU "По пикселям (точная, самая медленная)" +#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_RU "Размер накопительного буфера пикселей" #define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_RU "Большие значения могут требоваться для правильного отображения высоких разрешений." #define OPTION_VAL_512MB_RU "512 МБ" #define OPTION_VAL_1GB_RU "1 ГБ" @@ -49078,21 +49078,21 @@ struct retro_core_options_v2 options_pt_pt = { #define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_RU "Полная эмуляция фреймбуфера" #define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_RU "Включает полную эмуляцию кадрового буфера в VRAM. Полезно для игр, которые напрямую производят чтение или запись фреймбуфера в VRAM. При включении внутреннее разрешение будет принудительно установлено в 640x480 и возможно сильное падение скорости." #define CORE_OPTION_NAME_ENABLE_RTTB_LABEL_RU "Включить буфер рендера в текстуру" -#define CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_RU NULL +#define CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_RU "Копирует отрисованные текстуры из GPU обратно в VRAM. Данная настройка обычно включена для игр, которые этого требуют. При включении не используется масштабирование рендеринга текстур и возможно падение производительности." #define CORE_OPTION_NAME_MIPMAPPING_LABEL_RU "MIP-текстурирование" #define CORE_OPTION_NAME_FOG_LABEL_RU "Эффекты тумана" #define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_RU "Модификатор объема" #define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_RU "Функция графического процессора Dreamcast, которая обычно используется играми для отрисовки теней объектов. По умолчанию она должна быть включена - влияние на производительность обычно минимально или незначительно." #define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_RU "Анизотропная фильтрация" -#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_RU NULL -#define CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_RU "Сглаживание текстур" -#define CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_RU NULL -#define OPTION_VAL_1_RU NULL -#define OPTION_VAL_2_RU NULL +#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_RU "Улучшает качество текстур на поверхностях под непрямыми углами обзора по отношению к камере. Более высокие значения повышают требования к GPU. Изменения настройки вступают в силу при перезапуске." +#define CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_RU "Фильтрация текстур" +#define CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_RU "Используемый режим фильтрации текстур. Применяется для принудительной фильтрации всех текстур, чтобы получить более чёткое (или сглаженное) изображение, отличное от стандартного. Любое значение не по умолчанию может приводить к ошибкам рендеринга. Для применения настройки требуется перезапуск." +#define OPTION_VAL_1_RU "Форс. методом ближайшего соседа" +#define OPTION_VAL_2_RU "Форс. линейное" #define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_RU "Задержка замены кадров" -#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_RU "Помогает избегать мерцания экрана или артефактов видео. Не рекомендуется на медленных платформах." -#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_RU NULL -#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_RU NULL +#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_RU "Помогает избежать мерцания экрана или искажения заставок. Не рекомендуется на медленных платформах." +#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_RU "Определять изменение частоты кадров" +#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_RU "Уведомлять фронтенд об изменениях внутренней частоты кадров (напр. с 60 до 30 к/с). Улучшает распределение кадров в играх с постоянной частотой в 30 или 20 к/с, но должно быть выключено для игр с плавающим значением частоты кадров (напр. Ecco the Dolphin, Unreal Tournament). Недоступно при вкл. опции 'Автопропуск кадров'." #define CORE_OPTION_NAME_PVR2_FILTERING_LABEL_RU "Фильтр постобработки PowerVR2" #define CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_RU "Делает постобработку отображаемого изображения для имитации эффектов, специфичных для графического процессора PowerVR2 и аналоговых видеосигналов." #define CORE_OPTION_NAME_TEXUPSCALE_LABEL_RU "Масштабирование текстур (xBRZ)" @@ -49101,14 +49101,14 @@ struct retro_core_options_v2 options_pt_pt = { #define OPTION_VAL_4_RU NULL #define OPTION_VAL_6_RU NULL #define CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_RU NULL -#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_RU NULL -#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_RU NULL +#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_RU "Нативная глубина интерполяции" +#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_RU "Помогает при проблемах с глубиной и искажением текстур на видеокартах AMD. В ряде случаев также устраняет проблемы на видеокартах Intel." #define CORE_OPTION_NAME_THREADED_RENDERING_LABEL_RU "Рендеринг в отдельном потоке" #define CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_RU "Запускает графический и центральный процессоры в разных потоках. Настоятельно рекомендуется." #define CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_RU "Автоматический пропуск кадров" -#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_RU NULL +#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_RU "Автоматически пропускать кадры при замедлении эмулятора. Применяется только с вкл. опцией 'Рендеринг в отдельном потоке'." #define OPTION_VAL_SOME_RU "Нормальный" -#define OPTION_VAL_MORE_RU NULL +#define OPTION_VAL_MORE_RU "Максимум" #define CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_RU "Пропуск кадров" #define CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_RU "Устанавливает количество кадров пропуска между отображаемыми кадрами." #define CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_RU "Широкоэкранные чит-коды (требуется перезапуск)" @@ -49130,11 +49130,11 @@ struct retro_core_options_v2 options_pt_pt = { #define CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_RU "Мёртвая зона триггеров" #define CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_RU "Цифровые триггеры" #define CORE_OPTION_NAME_ENABLE_PURUPURU_LABEL_RU "Модуль вибрации/Puru Puru" -#define CORE_OPTION_NAME_ENABLE_PURUPURU_INFO_0_RU "Включает обратную связь контроллера." -#define CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_RU NULL -#define CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_RU NULL +#define CORE_OPTION_NAME_ENABLE_PURUPURU_INFO_0_RU "Включает отдачу контроллера." +#define CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_RU "Транслировать цифровые сигналы" +#define CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_RU "Транслировать события цифрового ввода и состояние вибрации в TCP-порт 8000. Совместимо с параметром MAME \"-output network\"." #define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_RU "Показать настройки светового пистолета" -#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_RU NULL +#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_RU "Включает конфигурацию параметров прицела светового пистолета. Для применения настройки требуется переключить быстрое меню." #define CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_RU "Отображение прицела пистолета 1" #define OPTION_VAL_WHITE_RU "Белый" #define OPTION_VAL_RED_RU "Красный" @@ -49150,7 +49150,7 @@ struct retro_core_options_v2 options_pt_pt = { #define OPTION_VAL_ALL_VMUS_RU "Все VMU" #define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_RU "Показывать настройки отображения блока визуальной памяти (VMU)" #define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_RU "Показывать настройки отображения VMU" -#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_RU NULL +#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_RU "Включает конфигурацию размера, положения, цвета и видимости эмулируемого ЖК-экрана VMU. Для применения настройки требуется переключить быстрое меню." #define CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_RU "Показывать экран VMU 1" #define CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_RU "Положение экрана VMU 1" #define OPTION_VAL_UPPER_LEFT_RU "Вверху слева" @@ -49184,7 +49184,7 @@ struct retro_core_options_v2 options_pt_pt = { #define OPTION_VAL_LIGHT_PURPLE_3_22_RU "Светло-фиолетовый (3)" #define OPTION_VAL_LIGHT_ORANGE_23_RU "Светло-оранжевый" #define OPTION_VAL_ORANGE_24_RU "Оранжевый" -#define OPTION_VAL_LIGHT_PURPLE_4_25_RU NULL +#define OPTION_VAL_LIGHT_PURPLE_4_25_RU "Светло-фиолетовый (4)" #define OPTION_VAL_LIGHT_YELLOW_26_RU "Светло-жёлтый" #define OPTION_VAL_LIGHT_YELLOW_2_27_RU "Светло-жёлтый (2)" #define CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_RU "Цвет выкл. пикселей VMU 1" From 9f2ffd102ca0951f59f78d6aed3e9b28ee08f744 Mon Sep 17 00:00:00 2001 From: Flyinghead Date: Tue, 21 Mar 2023 11:22:04 +0100 Subject: [PATCH 02/15] oit: Can't discard pixel in pixel shader when using 2ndary accumulator When using the secondary accumulator as source or destination, pixel must not be discarded even if blending results in a nop. Doing so cancels the transfer to/from the accumulator. Issue #979 dx11 oit: use FAILED to detect pixel shader creation error. Log error codes when Buffers::init fails. --- core/rend/dx11/oit/dx11_oitbuffers.h | 8 ++-- core/rend/dx11/oit/dx11_oitshaders.cpp | 57 +------------------------- core/rend/gl4/gles.cpp | 54 ------------------------ core/rend/vulkan/oit/oit_shaders.cpp | 54 ------------------------ 4 files changed, 5 insertions(+), 168 deletions(-) diff --git a/core/rend/dx11/oit/dx11_oitbuffers.h b/core/rend/dx11/oit/dx11_oitbuffers.h index 0866eda9e..d86930777 100644 --- a/core/rend/dx11/oit/dx11_oitbuffers.h +++ b/core/rend/dx11/oit/dx11_oitbuffers.h @@ -45,7 +45,7 @@ public: } if (FAILED(hr)) { - WARN_LOG(RENDERER, "Pixels buffer creation failed"); + WARN_LOG(RENDERER, "Pixels buffer creation failed: %x", hr); return; } } @@ -59,7 +59,7 @@ public: hr = device->CreateUnorderedAccessView(pixelsBuffer, &uaView, &pixelsBufferView.get()); if (FAILED(hr)) - WARN_LOG(RENDERER, "Pixels buffer UAV creation failed"); + WARN_LOG(RENDERER, "Pixels buffer UAV creation failed: %x", hr); } void resize(int width, int height) @@ -84,7 +84,7 @@ public: HRESULT hr = device->CreateTexture2D(&desc, nullptr, &abufferPointersTex.get()); if (FAILED(hr)) { - WARN_LOG(RENDERER, "A-buffer texture creation failed"); + WARN_LOG(RENDERER, "A-buffer texture creation failed: %x", hr); return; } D3D11_UNORDERED_ACCESS_VIEW_DESC uaView{}; @@ -93,7 +93,7 @@ public: hr = device->CreateUnorderedAccessView(abufferPointersTex, &uaView, &abufferPointersView.get()); if (FAILED(hr)) - WARN_LOG(RENDERER, "A-buffer texture UAV creation failed"); + WARN_LOG(RENDERER, "A-buffer texture UAV creation failed: %x", hr); } void bind() diff --git a/core/rend/dx11/oit/dx11_oitshaders.cpp b/core/rend/dx11/oit/dx11_oitshaders.cpp index 82bcbc2e8..ea4ff6ba7 100644 --- a/core/rend/dx11/oit/dx11_oitshaders.cpp +++ b/core/rend/dx11/oit/dx11_oitshaders.cpp @@ -527,61 +527,6 @@ PSO main(in VertexIn inpix) #if PASS == PASS_COLOR pso.col = color; #elif PASS == PASS_OIT - // Discard as many pixels as possible - switch (cur_blend_mode.y) // DST - { - case ONE: - switch (cur_blend_mode.x) // SRC - { - case ZERO: - discard; - break; - case ONE: - case OTHER_COLOR: - case INVERSE_OTHER_COLOR: - if (all(color == 0.f)) - discard; - break; - case SRC_ALPHA: - if (color.a == 0.f || all(color.rgb == 0.f)) - discard; - break; - case INVERSE_SRC_ALPHA: - if (color.a == 1.0 || all(color.rgb == 0.f)) - discard; - break; - } - break; - case OTHER_COLOR: - if (cur_blend_mode.x == ZERO && all(color == 1.f)) - discard; - break; - case INVERSE_OTHER_COLOR: - if (cur_blend_mode.x <= SRC_ALPHA && all(color == 0.f)) - discard; - break; - case SRC_ALPHA: - if ((cur_blend_mode.x == ZERO || cur_blend_mode.x == INVERSE_SRC_ALPHA) && color.a == 1.f) - discard; - break; - case INVERSE_SRC_ALPHA: - switch (cur_blend_mode.x) // SRC - { - case ZERO: - case SRC_ALPHA: - if (color.a == 0.f) - discard; - break; - case ONE: - case OTHER_COLOR: - case INVERSE_OTHER_COLOR: - if (all(color == 0.f)) - discard; - break; - } - break; - } - uint2 coords = uint2(inpix.pos.xy); uint idx = getNextPixelIndex(); @@ -1126,7 +1071,7 @@ ComPtr DX11OITShaders::compilePS(const char* source, const ch ComPtr shader; if (blob) { - if (device->CreatePixelShader(blob->GetBufferPointer(), blob->GetBufferSize(), nullptr, &shader.get()) != S_OK) + if (FAILED(device->CreatePixelShader(blob->GetBufferPointer(), blob->GetBufferSize(), nullptr, &shader.get()))) ERROR_LOG(RENDERER, "Pixel shader creation failed"); } diff --git a/core/rend/gl4/gles.cpp b/core/rend/gl4/gles.cpp index 58ad6596f..c80fd7c42 100644 --- a/core/rend/gl4/gles.cpp +++ b/core/rend/gl4/gles.cpp @@ -388,60 +388,6 @@ void main() #if PASS == PASS_COLOR FragColor = color; #elif PASS == PASS_OIT - // Discard as many pixels as possible - switch (cur_blend_mode.y) // DST - { - case ONE: - switch (cur_blend_mode.x) // SRC - { - case ZERO: - discard; - case ONE: - case OTHER_COLOR: - case INVERSE_OTHER_COLOR: - if (color == vec4(0.0)) - discard; - break; - case SRC_ALPHA: - if (color.a == 0.0 || color.rgb == vec3(0.0)) - discard; - break; - case INVERSE_SRC_ALPHA: - if (color.a == 1.0 || color.rgb == vec3(0.0)) - discard; - break; - } - break; - case OTHER_COLOR: - if (cur_blend_mode.x == ZERO && color == vec4(1.0)) - discard; - break; - case INVERSE_OTHER_COLOR: - if (cur_blend_mode.x <= SRC_ALPHA && color == vec4(0.0)) - discard; - break; - case SRC_ALPHA: - if ((cur_blend_mode.x == ZERO || cur_blend_mode.x == INVERSE_SRC_ALPHA) && color.a == 1.0) - discard; - break; - case INVERSE_SRC_ALPHA: - switch (cur_blend_mode.x) // SRC - { - case ZERO: - case SRC_ALPHA: - if (color.a == 0.0) - discard; - break; - case ONE: - case OTHER_COLOR: - case INVERSE_OTHER_COLOR: - if (color == vec4(0.0)) - discard; - break; - } - break; - } - ivec2 coords = ivec2(gl_FragCoord.xy); uint idx = getNextPixelIndex(); diff --git a/core/rend/vulkan/oit/oit_shaders.cpp b/core/rend/vulkan/oit/oit_shaders.cpp index df06af9f5..36136c2f6 100644 --- a/core/rend/vulkan/oit/oit_shaders.cpp +++ b/core/rend/vulkan/oit/oit_shaders.cpp @@ -396,60 +396,6 @@ void main() #if PASS == PASS_COLOR FragColor = color; #elif PASS == PASS_OIT - // Discard as many pixels as possible - switch (cur_blend_mode.y) // DST - { - case ONE: - switch (cur_blend_mode.x) // SRC - { - case ZERO: - discard; - case ONE: - case OTHER_COLOR: - case INVERSE_OTHER_COLOR: - if (color == vec4(0.0)) - discard; - break; - case SRC_ALPHA: - if (color.a == 0.0 || color.rgb == vec3(0.0)) - discard; - break; - case INVERSE_SRC_ALPHA: - if (color.a == 1.0 || color.rgb == vec3(0.0)) - discard; - break; - } - break; - case OTHER_COLOR: - if (cur_blend_mode.x == ZERO && color == vec4(1.0)) - discard; - break; - case INVERSE_OTHER_COLOR: - if (cur_blend_mode.x <= SRC_ALPHA && color == vec4(0.0)) - discard; - break; - case SRC_ALPHA: - if ((cur_blend_mode.x == ZERO || cur_blend_mode.x == INVERSE_SRC_ALPHA) && color.a == 1.0) - discard; - break; - case INVERSE_SRC_ALPHA: - switch (cur_blend_mode.x) // SRC - { - case ZERO: - case SRC_ALPHA: - if (color.a == 0.0) - discard; - break; - case ONE: - case OTHER_COLOR: - case INVERSE_OTHER_COLOR: - if (color == vec4(0.0)) - discard; - break; - } - break; - } - ivec2 coords = ivec2(gl_FragCoord.xy); uint idx = getNextPixelIndex(); From 5c5c872afc7a488bd8861ae957a6a5134e42427e Mon Sep 17 00:00:00 2001 From: Flyinghead Date: Tue, 21 Mar 2023 11:32:21 +0100 Subject: [PATCH 03/15] aica: small dma transfer must be correctly scheduled Previously transfer taking less than 4096 cycles would be instantly executed. Fixes Sports Jam announcer broken audio. Issue #980 --- core/hw/aica/aica_if.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/hw/aica/aica_if.cpp b/core/hw/aica/aica_if.cpp index 1b90cbe1e..24c29f2bb 100644 --- a/core/hw/aica/aica_if.cpp +++ b/core/hw/aica/aica_if.cpp @@ -12,6 +12,7 @@ #include "hw/sh4/sh4_sched.h" #include "profiler/dc_profiler.h" #include "hw/sh4/dyna/blockmanager.h" +#include "hw/sh4/sh4_interpreter.h" #include "hw/arm7/arm7.h" #include "cfg/option.h" @@ -395,7 +396,7 @@ static void Write_SB_ADST(u32 addr, u32 data) // Schedule the end of DMA transfer interrupt int cycles = len * (SH4_MAIN_CLOCK / 2 / G2_BUS_CLOCK); // 16 bits @ 25 MHz - if (cycles < 4096) + if (cycles < SH4_TIMESLICE / 2) dma_end_sched(0, 0, 0); else sh4_sched_request(dma_sched_id, cycles); From ea4354ba2ea3fa711960de2c1673a4f24fb9a468 Mon Sep 17 00:00:00 2001 From: Flyinghead Date: Tue, 21 Mar 2023 11:36:47 +0100 Subject: [PATCH 04/15] Shin Nihon Pro Wrestling 4 crashes with RGB component Force TV Composite instead --- core/emulator.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/emulator.cpp b/core/emulator.cpp index cb8909dd2..ef3067bbf 100644 --- a/core/emulator.cpp +++ b/core/emulator.cpp @@ -201,7 +201,8 @@ static void loadSpecialSettings() || prod_id == "T1209N" // Gigawing (US) || prod_id == "T1208M" // Gigawing (JP) || prod_id == "T1235M" // Vampire Chronicle for Matching Service - || prod_id == "T22901N"))// Roadsters (US) + || prod_id == "T22901N" // Roadsters (US) + || prod_id == "T28202M"))// Shin Nihon Pro Wrestling 4 { NOTICE_LOG(BOOT, "Game doesn't support RGB. Using TV Composite instead"); config::Cable.override(3); From f2f8f3ccd27dcbe7af468d897444c568a0544ab5 Mon Sep 17 00:00:00 2001 From: Flyinghead Date: Fri, 24 Mar 2023 11:48:52 +0100 Subject: [PATCH 05/15] bump libchdr to latest commit 8e09bf2b Fixes MINIDUMP-HD, MINIDUMP-M8 --- core/deps/libchdr | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/deps/libchdr b/core/deps/libchdr index 8c319cf7b..8e09bf2ba 160000 --- a/core/deps/libchdr +++ b/core/deps/libchdr @@ -1 +1 @@ -Subproject commit 8c319cf7be87186857972829e343b9082341d365 +Subproject commit 8e09bf2badf8866a360babbf722fada2393b26e3 From 068861d0cc795327e0459af603f7e9d12e4ff699 Mon Sep 17 00:00:00 2001 From: Flyinghead Date: Fri, 24 Mar 2023 11:53:38 +0100 Subject: [PATCH 06/15] pvr: mask low address bits according to 32-bit vram access size Avoid crash when accessing the very last vram byte with short or int. Correct behavior should be to raise an sh4 address exception. Fixes MINIDUMP-N2 --- core/hw/pvr/pvr_mem.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/hw/pvr/pvr_mem.cpp b/core/hw/pvr/pvr_mem.cpp index 71be06c1f..cdd5dcbad 100644 --- a/core/hw/pvr/pvr_mem.cpp +++ b/core/hw/pvr/pvr_mem.cpp @@ -202,7 +202,7 @@ void YUV_deserialize(Deserializer& deser) template T DYNACALL pvr_read32p(u32 addr) { - return *(T *)&vram[pvr_map32(addr)]; + return *(T *)&vram[pvr_map32(addr) & ~(sizeof(T) - 1)]; } template u8 pvr_read32p(u32 addr); template u16 pvr_read32p(u32 addr); @@ -218,6 +218,7 @@ void DYNACALL pvr_write32p(u32 addr, T data) INFO_LOG(MEMORY, "%08x: 8-bit VRAM writes are not possible", addr); return; } + addr &= ~(sizeof(T) - 1); u32 vaddr = addr & VRAM_MASK; if (vaddr >= fb_watch_addr_start && vaddr < fb_watch_addr_end) fb_dirty = true; From b36ef9da1e6507afce7f9f8456484ac76f7ca24c Mon Sep 17 00:00:00 2001 From: Flyinghead Date: Fri, 24 Mar 2023 11:59:46 +0100 Subject: [PATCH 07/15] libretro: use gamepad left analog stick for lightgun coordinates Issue #881 --- shell/libretro/libretro.cpp | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/shell/libretro/libretro.cpp b/shell/libretro/libretro.cpp index 1f63e936a..485bf808a 100644 --- a/shell/libretro/libretro.cpp +++ b/shell/libretro/libretro.cpp @@ -2429,6 +2429,18 @@ static void updateLightgunCoordinates(u32 port) lightgun_params[port].y = mo_y_abs[port]; } +void updateLightgunCoordinatesFromAnalogStick(int port) +{ + int x = input_cb(port, RETRO_DEVICE_ANALOG, RETRO_DEVICE_INDEX_ANALOG_LEFT, RETRO_DEVICE_ID_ANALOG_X); + mo_x_abs[port] = 320 + x * 320 / 32767; + int y = input_cb(port, RETRO_DEVICE_ANALOG, RETRO_DEVICE_INDEX_ANALOG_LEFT, RETRO_DEVICE_ID_ANALOG_Y); + mo_y_abs[port] = 240 + y * 240 / 32767; + + lightgun_params[port].offscreen = false; + lightgun_params[port].x = mo_x_abs[port]; + lightgun_params[port].y = mo_y_abs[port]; +} + static void UpdateInputStateNaomi(u32 port) { switch (config::MapleMainDevices[port]) @@ -2565,6 +2577,7 @@ static void UpdateInputStateNaomi(u32 port) // -- mouse, for rotary encoders updateMouseState(port); + updateLightgunCoordinatesFromAnalogStick(port); } break; } From 47a33f97f9ea03065687e3032ff149f659f2e946 Mon Sep 17 00:00:00 2001 From: Flyinghead Date: Sat, 25 Mar 2023 11:43:17 +0100 Subject: [PATCH 08/15] dx11: disable texture support check on uwp/xbox Tentative fix for Issue #865 --- core/rend/dx11/dx11context.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/core/rend/dx11/dx11context.cpp b/core/rend/dx11/dx11context.cpp index 82991282f..96077b94b 100644 --- a/core/rend/dx11/dx11context.cpp +++ b/core/rend/dx11/dx11context.cpp @@ -365,6 +365,9 @@ bool DX11Context::checkTextureSupport() UINT support; for (size_t i = 0; i < ARRAY_SIZE(formats); i++) { +#if defined(LIBRETRO) && defined(TARGET_UWP) + supportedTexFormats[(int)dcTexTypes[i]] = true; +#else supportedTexFormats[(int)dcTexTypes[i]] = false; pDevice->CheckFormatSupport(formats[i], &support); if ((support & (D3D11_FORMAT_SUPPORT_TEXTURE2D | D3D11_FORMAT_SUPPORT_SHADER_SAMPLE)) != (D3D11_FORMAT_SUPPORT_TEXTURE2D | D3D11_FORMAT_SUPPORT_SHADER_SAMPLE)) @@ -386,6 +389,7 @@ bool DX11Context::checkTextureSupport() else supportedTexFormats[(int)dcTexTypes[i]] = true; } +#endif } return true; From 5e4e48fffe60c798adeaf66f6b2735edf8aa373f Mon Sep 17 00:00:00 2001 From: Flyinghead Date: Sat, 25 Mar 2023 11:45:03 +0100 Subject: [PATCH 09/15] mmu: don't crash when table full, just ignore Fixes MINIDUMP-NF --- core/hw/sh4/modules/fastmmu.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/hw/sh4/modules/fastmmu.cpp b/core/hw/sh4/modules/fastmmu.cpp index a3c30b41c..6910d6f9f 100644 --- a/core/hw/sh4/modules/fastmmu.cpp +++ b/core/hw/sh4/modules/fastmmu.cpp @@ -57,7 +57,8 @@ static void cache_entry(const TLB_Entry &entry) { if (entry.Data.SZ0 == 0 && entry.Data.SZ1 == 0) return; - verify(full_table_size < ARRAY_SIZE(full_table)); + if (full_table_size >= ARRAY_SIZE(full_table)) + return; full_table[full_table_size].entry = entry; From 4514a4bfccf3b29531d58a85e3d5c00e75d58526 Mon Sep 17 00:00:00 2001 From: Flyinghead Date: Sat, 25 Mar 2023 11:52:18 +0100 Subject: [PATCH 10/15] libretro: lightgun with gamepad fixes. Lightgun with touchscreen support Lightgun with gamepad: fix reload, fix trigger and buttons on AW Issue #881 Support for lr pointer device for lightgun with touchscreen. Issue #604 --- shell/libretro/libretro.cpp | 129 +++++++++++++++++++++++++++++++++--- 1 file changed, 121 insertions(+), 8 deletions(-) diff --git a/shell/libretro/libretro.cpp b/shell/libretro/libretro.cpp index 485bf808a..1c0d57fec 100644 --- a/shell/libretro/libretro.cpp +++ b/shell/libretro/libretro.cpp @@ -186,7 +186,6 @@ static retro_rumble_interface rumble; static void refresh_devices(bool first_startup); static void init_disk_control_interface(); static bool read_m3u(const char *file); -void UpdateInputState(); void gui_display_notification(const char *msg, int duration); static void updateVibration(u32 port, float power, float inclination, u32 durationMs); @@ -280,13 +279,14 @@ void retro_set_environment(retro_environment_t cb) { "Light Gun", RETRO_DEVICE_LIGHTGUN }, { "Twin Stick", RETRO_DEVICE_TWINSTICK }, { "Saturn Twin-Stick", RETRO_DEVICE_TWINSTICK_SATURN }, + { "Pointer", RETRO_DEVICE_POINTER }, { 0 }, }; static const struct retro_controller_info ports[] = { - { ports_default, 7 }, - { ports_default, 7 }, - { ports_default, 7 }, - { ports_default, 7 }, + { ports_default, 8 }, + { ports_default, 8 }, + { ports_default, 8 }, + { ports_default, 8 }, { 0 }, }; environ_cb(RETRO_ENVIRONMENT_SET_CONTROLLER_INFO, (void*)ports); @@ -1297,6 +1297,7 @@ static uint32_t map_gamepad_button(unsigned device, unsigned id) switch (device) { case RETRO_DEVICE_JOYPAD: + case RETRO_DEVICE_POINTER: joymap = dc_joymap; joymap_size = ARRAY_SIZE(dc_joymap); break; @@ -1314,6 +1315,7 @@ static uint32_t map_gamepad_button(unsigned device, unsigned id) switch (device) { case RETRO_DEVICE_JOYPAD: + case RETRO_DEVICE_POINTER: joymap = nao_joymap; joymap_size = ARRAY_SIZE(nao_joymap); break; @@ -1330,6 +1332,7 @@ static uint32_t map_gamepad_button(unsigned device, unsigned id) switch (device) { case RETRO_DEVICE_JOYPAD: + case RETRO_DEVICE_POINTER: joymap = aw_joymap; joymap_size = ARRAY_SIZE(aw_joymap); break; @@ -2191,6 +2194,7 @@ void retro_set_controller_port_device(unsigned in_port, unsigned device) } break; case RETRO_DEVICE_LIGHTGUN: + case RETRO_DEVICE_POINTER: config::MapleMainDevices[in_port] = MDT_LightGun; if (settings.platform.isConsole()) { config::MapleExpansionDevices[in_port][0] = enable_purupuru ? MDT_PurupuruPack : MDT_SegaVMU; @@ -2416,8 +2420,18 @@ static void updateMouseState(u32 port) static void updateLightgunCoordinates(u32 port) { - int x = input_cb(port, RETRO_DEVICE_LIGHTGUN, 0, RETRO_DEVICE_ID_LIGHTGUN_SCREEN_X); - int y = input_cb(port, RETRO_DEVICE_LIGHTGUN, 0, RETRO_DEVICE_ID_LIGHTGUN_SCREEN_Y); + int x; + int y; + if (device_type[port] == RETRO_DEVICE_LIGHTGUN) + { + x = input_cb(port, RETRO_DEVICE_LIGHTGUN, 0, RETRO_DEVICE_ID_LIGHTGUN_SCREEN_X); + y = input_cb(port, RETRO_DEVICE_LIGHTGUN, 0, RETRO_DEVICE_ID_LIGHTGUN_SCREEN_Y); + } + else + { + x = input_cb(port, RETRO_DEVICE_POINTER, 0, RETRO_DEVICE_ID_POINTER_X); + y = input_cb(port, RETRO_DEVICE_POINTER, 0, RETRO_DEVICE_ID_POINTER_Y); + } if (config::Widescreen && config::ScreenStretching == 100 && !config::EmulateFramebuffer) mo_x_abs[port] = 640.f * ((x + 0x8000) * 4.f / 3.f / 0x10000 - (4.f / 3.f - 1.f) / 2.f); else @@ -2446,6 +2460,7 @@ static void UpdateInputStateNaomi(u32 port) switch (config::MapleMainDevices[port]) { case MDT_LightGun: + if (device_type[port] == RETRO_DEVICE_LIGHTGUN) { // // -- buttons @@ -2488,6 +2503,44 @@ static void UpdateInputStateNaomi(u32 port) updateLightgunCoordinates(port); } } + else + { + // RETRO_DEVICE_POINTER + setDeviceButtonState(port, RETRO_DEVICE_JOYPAD, RETRO_DEVICE_ID_JOYPAD_B); + setDeviceButtonState(port, RETRO_DEVICE_JOYPAD, RETRO_DEVICE_ID_JOYPAD_START); + setDeviceButtonState(port, RETRO_DEVICE_JOYPAD, RETRO_DEVICE_ID_JOYPAD_UP); + setDeviceButtonState(port, RETRO_DEVICE_JOYPAD, RETRO_DEVICE_ID_JOYPAD_DOWN); + setDeviceButtonState(port, RETRO_DEVICE_JOYPAD, RETRO_DEVICE_ID_JOYPAD_LEFT); + setDeviceButtonState(port, RETRO_DEVICE_JOYPAD, RETRO_DEVICE_ID_JOYPAD_RIGHT); + + int pressed = input_cb(port, RETRO_DEVICE_POINTER, 0, RETRO_DEVICE_ID_POINTER_PRESSED); + int count = input_cb(port, RETRO_DEVICE_POINTER, 0, RETRO_DEVICE_ID_POINTER_COUNT); + if (count > 1) + { + // reload + mo_x_abs[port] = 0; + mo_y_abs[port] = 0; + lightgun_params[port].offscreen = true; + } + else if (count == 1) + { + updateLightgunCoordinates(port); + } + if (pressed) + { + if (settings.platform.isAtomiswave()) + kcode[port] &= ~AWAVE_TRIGGER_KEY; + else + kcode[port] &= ~NAOMI_BTN0_KEY; + } + else + { + if (settings.platform.isAtomiswave()) + kcode[port] |= AWAVE_TRIGGER_KEY; + else + kcode[port] |= NAOMI_BTN0_KEY; + } + } break; default: @@ -2577,7 +2630,35 @@ static void UpdateInputStateNaomi(u32 port) // -- mouse, for rotary encoders updateMouseState(port); - updateLightgunCoordinatesFromAnalogStick(port); + // lightgun with analog stick + if (settings.input.JammaSetup == JVS::LightGun || settings.input.JammaSetup == JVS::LightGunAsAnalog) + { + updateLightgunCoordinatesFromAnalogStick(port); + if (input_cb(port, RETRO_DEVICE_LIGHTGUN, 0, RETRO_DEVICE_ID_LIGHTGUN_RELOAD)) + { + mo_x_abs[port] = 0; + mo_y_abs[port] = 0; + lightgun_params[port].offscreen = true; + if (settings.platform.isAtomiswave()) + kcode[port] &= ~AWAVE_TRIGGER_KEY; + else + kcode[port] &= ~NAOMI_BTN0_KEY; + } + else if (settings.platform.isAtomiswave()) + { + // map btn0 to trigger, btn1 to btn0, etc. + u32 k = kcode[port] | (AWAVE_BTN0_KEY | AWAVE_BTN1_KEY | AWAVE_BTN2_KEY | AWAVE_BTN3_KEY | AWAVE_TRIGGER_KEY); + if ((kcode[port] & AWAVE_BTN0_KEY) == 0) + k &= ~AWAVE_TRIGGER_KEY; + if ((kcode[port] & AWAVE_BTN1_KEY) == 0) + k &= ~AWAVE_BTN0_KEY; + if ((kcode[port] & AWAVE_BTN2_KEY) == 0) + k &= ~AWAVE_BTN1_KEY; + if ((kcode[port] & AWAVE_BTN3_KEY) == 0) + k &= ~AWAVE_BTN2_KEY; + kcode[port] = k; + } + } } break; } @@ -2871,6 +2952,7 @@ static void UpdateInputState(u32 port) break; case MDT_LightGun: + if (device_type[port] == RETRO_DEVICE_LIGHTGUN) { // // -- buttons @@ -2904,6 +2986,37 @@ static void UpdateInputState(u32 port) updateLightgunCoordinates(port); } } + else + { + // RETRO_DEVICE_POINTER + setDeviceButtonState(port, RETRO_DEVICE_JOYPAD, RETRO_DEVICE_ID_JOYPAD_B); + setDeviceButtonState(port, RETRO_DEVICE_JOYPAD, RETRO_DEVICE_ID_JOYPAD_START); + setDeviceButtonState(port, RETRO_DEVICE_JOYPAD, RETRO_DEVICE_ID_JOYPAD_UP); + setDeviceButtonState(port, RETRO_DEVICE_JOYPAD, RETRO_DEVICE_ID_JOYPAD_DOWN); + setDeviceButtonState(port, RETRO_DEVICE_JOYPAD, RETRO_DEVICE_ID_JOYPAD_LEFT); + setDeviceButtonState(port, RETRO_DEVICE_JOYPAD, RETRO_DEVICE_ID_JOYPAD_RIGHT); + + int pressed = input_cb(port, RETRO_DEVICE_POINTER, 0, RETRO_DEVICE_ID_POINTER_PRESSED); + int count = input_cb(port, RETRO_DEVICE_POINTER, 0, RETRO_DEVICE_ID_POINTER_COUNT); + if (count > 1) + { + // reload + mo_x_abs[port] = -1000; + mo_y_abs[port] = -1000; + lightgun_params[port].offscreen = true; + + lightgun_params[port].x = mo_x_abs[port]; + lightgun_params[port].y = mo_y_abs[port]; + } + else if (count == 1) + { + updateLightgunCoordinates(port); + } + if (pressed) + kcode[port] &= ~DC_BTN_A; + else + kcode[port] |= DC_BTN_A; + } break; case MDT_Mouse: From 55b36fe7191a22668d86ccf1efd95c28c870dbd5 Mon Sep 17 00:00:00 2001 From: Flyinghead Date: Tue, 28 Mar 2023 20:55:56 +0200 Subject: [PATCH 11/15] dx11: revert 47a33f97f9ea03065687e3032ff149f659f2e946 Issue #865 --- core/rend/dx11/dx11context.cpp | 4 ---- 1 file changed, 4 deletions(-) diff --git a/core/rend/dx11/dx11context.cpp b/core/rend/dx11/dx11context.cpp index 96077b94b..82991282f 100644 --- a/core/rend/dx11/dx11context.cpp +++ b/core/rend/dx11/dx11context.cpp @@ -365,9 +365,6 @@ bool DX11Context::checkTextureSupport() UINT support; for (size_t i = 0; i < ARRAY_SIZE(formats); i++) { -#if defined(LIBRETRO) && defined(TARGET_UWP) - supportedTexFormats[(int)dcTexTypes[i]] = true; -#else supportedTexFormats[(int)dcTexTypes[i]] = false; pDevice->CheckFormatSupport(formats[i], &support); if ((support & (D3D11_FORMAT_SUPPORT_TEXTURE2D | D3D11_FORMAT_SUPPORT_SHADER_SAMPLE)) != (D3D11_FORMAT_SUPPORT_TEXTURE2D | D3D11_FORMAT_SUPPORT_SHADER_SAMPLE)) @@ -389,7 +386,6 @@ bool DX11Context::checkTextureSupport() else supportedTexFormats[(int)dcTexTypes[i]] = true; } -#endif } return true; From f67aad0b2d73f774bcc6aef3303275543f974a70 Mon Sep 17 00:00:00 2001 From: Flyinghead Date: Tue, 28 Mar 2023 21:01:56 +0200 Subject: [PATCH 12/15] pvr: don't wait if Present msg is already in the queue Only Render* msgs are an issue when piling up on slow platforms. Fixes frame skipping only working when delay frame swap is on Issue #975 --- core/hw/pvr/Renderer_if.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/core/hw/pvr/Renderer_if.cpp b/core/hw/pvr/Renderer_if.cpp index a4efb1732..14508c61d 100644 --- a/core/hw/pvr/Renderer_if.cpp +++ b/core/hw/pvr/Renderer_if.cpp @@ -73,8 +73,10 @@ public: dupe = true; break; } - if (!dupe) + if (!dupe || type == Present) { queue.push_back(msg); + dupe = false; + } } if (dupe) { From 79be46432613f6782ddb0eb4d8eb01912ddce208 Mon Sep 17 00:00:00 2001 From: Flyinghead Date: Tue, 28 Mar 2023 21:05:18 +0200 Subject: [PATCH 13/15] aica: proper write mask on aica dma address registers Fixes MINIDUMP-P3 --- core/hw/aica/aica_if.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/core/hw/aica/aica_if.cpp b/core/hw/aica/aica_if.cpp index 24c29f2bb..4e1e20cc4 100644 --- a/core/hw/aica/aica_if.cpp +++ b/core/hw/aica/aica_if.cpp @@ -464,10 +464,8 @@ void aica_sb_Init() // AICA sb_rio_register(SB_ADST_addr, RIO_FUNC, &Read_SB_ADST, &Write_SB_ADST); -#ifdef STRICT_MODE sb_rio_register(SB_ADSTAR_addr, RIO_WF, nullptr, &Write_SB_STAR); sb_rio_register(SB_ADSTAG_addr, RIO_WF, nullptr, &Write_SB_STAG); -#endif // G2 Ext device #1 sb_rio_register(SB_E1ST_addr, RIO_WF, nullptr, &Write_DmaStart Date: Tue, 28 Mar 2023 21:07:50 +0200 Subject: [PATCH 14/15] lr: build fix when USE_OPENGL=OFF Issue #997 --- core/wsi/libretro.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/core/wsi/libretro.cpp b/core/wsi/libretro.cpp index d9b140566..7b7a44535 100644 --- a/core/wsi/libretro.cpp +++ b/core/wsi/libretro.cpp @@ -24,9 +24,7 @@ LibretroGraphicsContext theGLContext; #endif -#if defined(HAVE_D3D11) && !(defined(HAVE_OPENGL) || defined(HAVE_OPENGLES)) #include "context.h" -#endif GraphicsContext *GraphicsContext::instance; #endif From 5df9127add091544fa6c873c109fa6e9a583ab52 Mon Sep 17 00:00:00 2001 From: Flyinghead Date: Tue, 28 Mar 2023 21:20:37 +0200 Subject: [PATCH 15/15] vk: enable depth writing in oit pass so Make sure both depth attachments are the same at the end of each pass. Get rid of unneeded depth dependency/transition. Issue #996 --- core/rend/vulkan/oit/oit_pipeline.cpp | 17 +++++++---------- core/rend/vulkan/oit/oit_renderpass.cpp | 13 ++++--------- 2 files changed, 11 insertions(+), 19 deletions(-) diff --git a/core/rend/vulkan/oit/oit_pipeline.cpp b/core/rend/vulkan/oit/oit_pipeline.cpp index 18a5db05d..12eede501 100644 --- a/core/rend/vulkan/oit/oit_pipeline.cpp +++ b/core/rend/vulkan/oit/oit_pipeline.cpp @@ -57,16 +57,13 @@ void OITPipelineManager::CreatePipeline(u32 listType, bool autosort, const PolyP depthOp = vk::CompareOp::eGreaterOrEqual; else depthOp = depthOps[pp.isp.DepthMode]; - bool depthWriteEnable = false; - if (pass == Pass::Depth || pass == Pass::Color) - { - // Z Write Disable seems to be ignored for punch-through. - // Fixes Worms World Party, Bust-a-Move 4 and Re-Volt - if (listType == ListType_Punch_Through) - depthWriteEnable = true; - else - depthWriteEnable = !pp.isp.ZWriteDis; - } + bool depthWriteEnable; + // Z Write Disable seems to be ignored for punch-through. + // Fixes Worms World Party, Bust-a-Move 4 and Re-Volt + if (listType == ListType_Punch_Through) + depthWriteEnable = true; + else + depthWriteEnable = !pp.isp.ZWriteDis; bool shadowed = pass == Pass::Depth && (listType == ListType_Opaque || listType == ListType_Punch_Through); vk::StencilOpState stencilOpState; diff --git a/core/rend/vulkan/oit/oit_renderpass.cpp b/core/rend/vulkan/oit/oit_renderpass.cpp index 10d04ed1c..056d693f4 100644 --- a/core/rend/vulkan/oit/oit_renderpass.cpp +++ b/core/rend/vulkan/oit/oit_renderpass.cpp @@ -36,13 +36,13 @@ vk::UniqueRenderPass RenderPasses::MakeRenderPass(bool initial, bool last) initial ? vk::AttachmentLoadOp::eClear : vk::AttachmentLoadOp::eLoad, last ? vk::AttachmentStoreOp::eDontCare : vk::AttachmentStoreOp::eStore, vk::AttachmentLoadOp::eClear, vk::AttachmentStoreOp::eDontCare, - initial ? vk::ImageLayout::eUndefined : vk::ImageLayout::eDepthStencilReadOnlyOptimal, vk::ImageLayout::eDepthStencilReadOnlyOptimal), + initial ? vk::ImageLayout::eUndefined : vk::ImageLayout::eDepthStencilAttachmentOptimal, vk::ImageLayout::eDepthStencilAttachmentOptimal), // OP+PT depth attachment for subpass 1 vk::AttachmentDescription(vk::AttachmentDescriptionFlags(), GetContext()->GetDepthFormat(), vk::SampleCountFlagBits::e1, initial ? vk::AttachmentLoadOp::eClear : vk::AttachmentLoadOp::eLoad, last ? vk::AttachmentStoreOp::eDontCare : vk::AttachmentStoreOp::eStore, vk::AttachmentLoadOp::eClear, vk::AttachmentStoreOp::eDontCare, - initial ? vk::ImageLayout::eUndefined : vk::ImageLayout::eDepthStencilReadOnlyOptimal, vk::ImageLayout::eDepthStencilReadOnlyOptimal), + initial ? vk::ImageLayout::eUndefined : vk::ImageLayout::eDepthStencilAttachmentOptimal, vk::ImageLayout::eDepthStencilAttachmentOptimal), }; vk::AttachmentReference swapChainReference(0, vk::ImageLayout::eColorAttachmentOptimal); vk::AttachmentReference colorReference(1, vk::ImageLayout::eColorAttachmentOptimal); @@ -70,17 +70,12 @@ vk::UniqueRenderPass RenderPasses::MakeRenderPass(bool initial, bool last) colorInput, swapChainReference, nullptr, - &depthReference2), // depth-only Tr pass when continuation + &depthReference), // depth-only Tr pass when continuation }; std::vector dependencies = GetSubpassDependencies(); - dependencies.emplace_back(VK_SUBPASS_EXTERNAL, 0, vk::PipelineStageFlagBits::eFragmentShader, - vk::PipelineStageFlagBits::eEarlyFragmentTests | vk::PipelineStageFlagBits::eLateFragmentTests, - vk::AccessFlagBits::eInputAttachmentRead | vk::AccessFlagBits::eShaderRead, - vk::AccessFlagBits::eDepthStencilAttachmentRead | vk::AccessFlagBits::eDepthStencilAttachmentWrite, - vk::DependencyFlagBits::eByRegion); dependencies.emplace_back(VK_SUBPASS_EXTERNAL, 1, vk::PipelineStageFlagBits::eFragmentShader, vk::PipelineStageFlagBits::eColorAttachmentOutput, - vk::AccessFlagBits::eInputAttachmentRead, vk::AccessFlagBits::eColorAttachmentWrite, vk::DependencyFlagBits::eByRegion), + vk::AccessFlagBits::eInputAttachmentRead, vk::AccessFlagBits::eColorAttachmentWrite, vk::DependencyFlagBits::eByRegion); dependencies.emplace_back(0, 1, vk::PipelineStageFlagBits::eLateFragmentTests, vk::PipelineStageFlagBits::eFragmentShader, vk::AccessFlagBits::eDepthStencilAttachmentRead | vk::AccessFlagBits::eDepthStencilAttachmentWrite, vk::AccessFlagBits::eInputAttachmentRead | vk::AccessFlagBits::eShaderRead, vk::DependencyFlagBits::eByRegion);