mirror of
https://github.com/hrydgard/ppsspp.git
synced 2026-10-17 08:20:30 +02:00
Reinitialize() wiped the 64 display lists but kept the queue of their ids. Whatever the old executable still had queued came back as lists with no state and a pc of 0, behind the first list of the new executable, where they blocked everything. Crazy Taxi: Fare Wars is a launcher for its two games, and stopped at a black screen that way. Fixes #19894. This removes the workaround for it, which dropped such a list but returned before currentList was cleared, and only worked as long as something else happened to clear it later. A list with a bad pc is now dropped like one that ran into an error, instead of sitting at the head of the queue for good. Also narrows what sceGeBreak(1) throws away to interrupts that have actually been raised, which is what gpu/ge/intrsuspend shows. The ones we haven't raised yet are only late because we execute lists ahead of time: a game that breaks right after its last list, and then waits for what the finish callback signals, got that callback long ago on hardware. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
65 lines
2.1 KiB
C
65 lines
2.1 KiB
C
// Copyright (c) 2012- PPSSPP Project.
|
|
|
|
// This program is free software: you can redistribute it and/or modify
|
|
// it under the terms of the GNU General Public License as published by
|
|
// the Free Software Foundation, version 2.0 or later versions.
|
|
|
|
// This program is distributed in the hope that it will be useful,
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
// GNU General Public License 2.0 for more details.
|
|
|
|
// A copy of the GPL 2.0 should have been included with the program.
|
|
// If not, see http://www.gnu.org/licenses/
|
|
|
|
// Official git repository and contact information can be found at
|
|
// https://github.com/hrydgard/ppsspp and http://www.ppsspp.org/.
|
|
|
|
#pragma once
|
|
|
|
#include "GPU/GPUDefinitions.h"
|
|
#include "Core/MemMap.h"
|
|
|
|
#define SCE_GE_LIST_COMPLETED 0
|
|
#define SCE_GE_LIST_QUEUED 1
|
|
#define SCE_GE_LIST_DRAWING 2
|
|
#define SCE_GE_LIST_STALLING 3
|
|
#define SCE_GE_LIST_PAUSED 4
|
|
|
|
typedef int SceUID;
|
|
typedef u32_le SceSize_le;
|
|
|
|
struct PspGeCallbackData
|
|
{
|
|
u32_le signal_func;
|
|
u32_le signal_arg; //ptr
|
|
u32_le finish_func; // PspGeCallback
|
|
u32_le finish_arg;
|
|
};
|
|
|
|
struct PspGeListArgs
|
|
{
|
|
SceSize_le size;
|
|
PSPPointer<u32_le> context;
|
|
u32_le numStacks;
|
|
u32_le stackAddr;
|
|
};
|
|
|
|
void Register_sceGe_user();
|
|
|
|
void __GeInit();
|
|
void __GeDoState(PointerWrap &p);
|
|
void __GeShutdown();
|
|
bool __GeTriggerSync(GPUSyncType waitType, int id, u64 atTicks);
|
|
bool __GeTriggerInterrupt(int listid, u32 pc, u64 atTicks);
|
|
// Forgets the GE interrupts that have been raised but not taken, as resetting the GE does.
|
|
// Not the ones still to be raised: those are only late because we execute lists ahead of time,
|
|
// and hardware would have delivered them long ago.
|
|
void __GeCancelRaisedInterrupts(bool interruptRunning);
|
|
void __GeWaitCurrentThread(GPUSyncType type, SceUID waitId, const char *reason);
|
|
bool __GeTriggerWait(GPUSyncType type, SceUID waitId);
|
|
|
|
// Export functions for use by Util/PPGe
|
|
u32 sceGeListEnQueue(u32 listAddress, u32 stallAddress, int callbackId, u32 optParamAddr);
|
|
u32 sceGeListEnQueueHead(u32 listAddress, u32 stallAddress, int callbackId, u32 optParamAddr);
|