Merge remote-tracking branch 'origin/master' into dev

This commit is contained in:
Flyinghead 2023-03-30 17:31:22 +02:00
commit 7108358ebd
15 changed files with 199 additions and 242 deletions

@ -1 +1 @@
Subproject commit 8c319cf7be87186857972829e343b9082341d365
Subproject commit 8e09bf2badf8866a360babbf722fada2393b26e3

View File

@ -200,7 +200,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);

View File

@ -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"
@ -404,7 +405,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);
@ -472,10 +473,8 @@ void sbInit()
// AICA
hollyRegs.setHandlers<SB_ADST_addr>(Read_SB_ADST, Write_SB_ADST);
#ifdef STRICT_MODE
hollyRegs.setWriteHandler<SB_ADSTAR_addr>(Write_SB_STAR<SB_ADSTAR_addr, holly_AICA_ILLADDR, AICA_TAG>);
hollyRegs.setWriteHandler<SB_ADSTAG_addr>(Write_SB_STAG<SB_ADSTAG_addr, holly_AICA_ILLADDR, AICA_TAG>);
#endif
// G2 Ext device #1
hollyRegs.setWriteHandler<SB_E1ST_addr>(Write_DmaStart<SB_E1EN_addr, SB_E1ST_addr, SB_E1STAR_addr, SB_E1STAG_addr, SB_E1LEN_addr,

View File

@ -73,8 +73,10 @@ public:
dupe = true;
break;
}
if (!dupe)
if (!dupe || type == Present) {
queue.push_back(msg);
dupe = false;
}
}
if (dupe)
{

View File

@ -202,7 +202,7 @@ void YUV_deserialize(Deserializer& deser)
template<typename T>
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<u8>(u32 addr);
template u16 pvr_read32p<u16>(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;

View File

@ -56,7 +56,8 @@ static void cache_entry(const TLB_Entry &entry)
{
if (entry.Data.SZ0 == 0 && entry.Data.SZ1 == 0)
return;
verify(full_table_size < std::size(full_table));
if (full_table_size >= std::size(full_table))
return;
full_table[full_table_size].entry = entry;

View File

@ -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()

View File

@ -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<ID3D11PixelShader> DX11OITShaders::compilePS(const char* source, const ch
ComPtr<ID3D11PixelShader> 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");
}

View File

@ -390,60 +390,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();

View File

@ -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;

View File

@ -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<vk::SubpassDependency> 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);

View File

@ -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();

View File

@ -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

View File

@ -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);
@ -1301,6 +1301,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 = std::size(dc_joymap);
break;
@ -1318,6 +1319,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 = std::size(nao_joymap);
break;
@ -1334,6 +1336,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 = std::size(aw_joymap);
break;
@ -2210,6 +2213,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;
@ -2435,8 +2439,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
@ -2448,11 +2462,24 @@ 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])
{
case MDT_LightGun:
if (device_type[port] == RETRO_DEVICE_LIGHTGUN)
{
//
// -- buttons
@ -2495,6 +2522,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:
@ -2584,6 +2649,35 @@ static void UpdateInputStateNaomi(u32 port)
// -- mouse, for rotary encoders
updateMouseState(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;
}
@ -2877,6 +2971,7 @@ static void UpdateInputState(u32 port)
break;
case MDT_LightGun:
if (device_type[port] == RETRO_DEVICE_LIGHTGUN)
{
//
// -- buttons
@ -2910,6 +3005,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:

View File

@ -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"