mirror of
https://github.com/skyline-emu/skyline.git
synced 2024-11-23 05:59:17 +01:00
Fix CircularQueue and improve debug logging + exefs loading
CircularQueue was looping around too early resulting in the wrong pushbuffers being used. The debug logging is useful for interpreting the GPU method call logs. Exefs loading was changed to check if an NSO exists before trying to read it, preventing exceptions that get annoying while debugging.
This commit is contained in:
parent
c161ef0cac
commit
8bf08ed66f
@ -69,28 +69,24 @@ namespace skyline {
|
|||||||
|
|
||||||
inline void Push(const Type &item) {
|
inline void Push(const Type &item) {
|
||||||
std::unique_lock lock(productionMutex);
|
std::unique_lock lock(productionMutex);
|
||||||
auto next{end + 1};
|
end = (end == reinterpret_cast<Type *>(vector.end().base()) - 1) ? reinterpret_cast<Type *>(vector.begin().base()) : end;
|
||||||
next = (next == reinterpret_cast<Type *>(vector.end().base())) ? reinterpret_cast<Type *>(vector.begin().base()) : next;
|
if (start == end + 1) {
|
||||||
if (next == start) {
|
|
||||||
std::unique_lock consumeLock(consumptionMutex);
|
std::unique_lock consumeLock(consumptionMutex);
|
||||||
consumeCondition.wait(consumeLock, [=]() { return next != start; });
|
consumeCondition.wait(consumeLock, [=]() { return start != end + 1; });
|
||||||
}
|
}
|
||||||
*next = item;
|
*end = item;
|
||||||
end = next;
|
|
||||||
produceCondition.notify_one();
|
produceCondition.notify_one();
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void Append(span<Type> buffer) {
|
inline void Append(span<Type> buffer) {
|
||||||
std::unique_lock lock(productionMutex);
|
std::unique_lock lock(productionMutex);
|
||||||
for (auto &item : buffer) {
|
for (auto &item : buffer) {
|
||||||
auto next{end + 1};
|
end = (end == reinterpret_cast<Type *>(vector.end().base()) - 1) ? reinterpret_cast<Type *>(vector.begin().base()) : end;
|
||||||
next = (next == reinterpret_cast<Type *>(vector.end().base())) ? reinterpret_cast<Type *>(vector.begin().base()) : next;
|
if (start == end + 1) {
|
||||||
if (next == start) {
|
|
||||||
std::unique_lock consumeLock(consumptionMutex);
|
std::unique_lock consumeLock(consumptionMutex);
|
||||||
consumeCondition.wait(consumeLock, [=]() { return next != start; });
|
consumeCondition.wait(consumeLock, [=]() { return start != end + 1; });
|
||||||
}
|
}
|
||||||
*next = item;
|
*(end++) = item;
|
||||||
end = next;
|
|
||||||
}
|
}
|
||||||
produceCondition.notify_one();
|
produceCondition.notify_one();
|
||||||
}
|
}
|
||||||
@ -102,9 +98,8 @@ namespace skyline {
|
|||||||
template<typename TransformedType, typename Transformation>
|
template<typename TransformedType, typename Transformation>
|
||||||
inline void AppendTranform(span<TransformedType> buffer, Transformation transformation) {
|
inline void AppendTranform(span<TransformedType> buffer, Transformation transformation) {
|
||||||
std::unique_lock lock(productionMutex);
|
std::unique_lock lock(productionMutex);
|
||||||
auto next{end};
|
|
||||||
for (auto &item : buffer) {
|
for (auto &item : buffer) {
|
||||||
end = (end == reinterpret_cast<Type *>(vector.end().base())) ? reinterpret_cast<Type *>(vector.begin().base()) : end;
|
end = (end == reinterpret_cast<Type *>(vector.end().base()) - 1) ? reinterpret_cast<Type *>(vector.begin().base()) : end;
|
||||||
if (start == end + 1) {
|
if (start == end + 1) {
|
||||||
std::unique_lock consumeLock(consumptionMutex);
|
std::unique_lock consumeLock(consumptionMutex);
|
||||||
consumeCondition.wait(consumeLock, [=]() { return start != end + 1; });
|
consumeCondition.wait(consumeLock, [=]() { return start != end + 1; });
|
||||||
|
@ -117,6 +117,7 @@ namespace skyline::gpu::engine {
|
|||||||
shadowRegisters.mme.shadowRamControl = static_cast<Registers::MmeShadowRamControl>(params.argument);
|
shadowRegisters.mme.shadowRamControl = static_cast<Registers::MmeShadowRamControl>(params.argument);
|
||||||
break;
|
break;
|
||||||
case MAXWELL3D_OFFSET(syncpointAction):
|
case MAXWELL3D_OFFSET(syncpointAction):
|
||||||
|
state.logger->Debug("Increment syncpoint: {}", static_cast<u16>(registers.syncpointAction.id));
|
||||||
state.gpu->syncpoints.at(registers.syncpointAction.id).Increment();
|
state.gpu->syncpoints.at(registers.syncpointAction.id).Increment();
|
||||||
break;
|
break;
|
||||||
case MAXWELL3D_OFFSET(semaphore.info):
|
case MAXWELL3D_OFFSET(semaphore.info):
|
||||||
|
@ -93,6 +93,8 @@ namespace skyline::gpu::gpfifo {
|
|||||||
pushBuffers->Process([this](PushBuffer &pushBuffer) {
|
pushBuffers->Process([this](PushBuffer &pushBuffer) {
|
||||||
if (pushBuffer.segment.empty())
|
if (pushBuffer.segment.empty())
|
||||||
pushBuffer.Fetch(state.gpu->memoryManager);
|
pushBuffer.Fetch(state.gpu->memoryManager);
|
||||||
|
|
||||||
|
state.logger->Debug("Processing pushbuffer: 0x{:X}", pushBuffer.gpEntry.Address());
|
||||||
Process(pushBuffer.segment);
|
Process(pushBuffer.segment);
|
||||||
});
|
});
|
||||||
} catch (const signal::SignalException &e) {
|
} catch (const signal::SignalException &e) {
|
||||||
|
@ -67,6 +67,10 @@ namespace skyline::gpu {
|
|||||||
Sync sync : 1;
|
Sync sync : 1;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
constexpr u64 Address() {
|
||||||
|
return (static_cast<u64>(getHi) << 32) | (static_cast<u64>(get) << 2);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
static_assert(sizeof(GpEntry) == sizeof(u64));
|
static_assert(sizeof(GpEntry) == sizeof(u64));
|
||||||
|
|
||||||
@ -140,7 +144,7 @@ namespace skyline::gpu {
|
|||||||
|
|
||||||
inline void Fetch(const vmm::MemoryManager &memoryManager) {
|
inline void Fetch(const vmm::MemoryManager &memoryManager) {
|
||||||
segment.resize(gpEntry.size);
|
segment.resize(gpEntry.size);
|
||||||
memoryManager.Read<u32>(segment, (static_cast<u64>(gpEntry.getHi) << 32) | (static_cast<u64>(gpEntry.get) << 2));
|
memoryManager.Read<u32>(segment, gpEntry.Address());
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -29,9 +29,9 @@ namespace skyline::loader {
|
|||||||
state.logger->Info("Loaded nso 'rtld' at 0x{:X} (.text @ 0x{:X})", base, entry);
|
state.logger->Info("Loaded nso 'rtld' at 0x{:X} (.text @ 0x{:X})", base, entry);
|
||||||
|
|
||||||
for (const auto &nso : {"main", "subsdk0", "subsdk1", "subsdk2", "subsdk3", "subsdk4", "subsdk5", "subsdk6", "subsdk7", "sdk"}) {
|
for (const auto &nso : {"main", "subsdk0", "subsdk1", "subsdk2", "subsdk3", "subsdk4", "subsdk5", "subsdk6", "subsdk7", "sdk"}) {
|
||||||
|
if (exeFs->FileExists(nso))
|
||||||
nsoFile = exeFs->OpenFile(nso);
|
nsoFile = exeFs->OpenFile(nso);
|
||||||
|
else
|
||||||
if (nsoFile == nullptr)
|
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
loadInfo = NsoLoader::LoadNso(nsoFile, process, state, offset);
|
loadInfo = NsoLoader::LoadNso(nsoFile, process, state, offset);
|
||||||
|
@ -61,7 +61,10 @@ namespace skyline::service::hid {
|
|||||||
|
|
||||||
Result IHidServer::AcquireNpadStyleSetUpdateEventHandle(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response) {
|
Result IHidServer::AcquireNpadStyleSetUpdateEventHandle(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response) {
|
||||||
auto id{request.Pop<NpadId>()};
|
auto id{request.Pop<NpadId>()};
|
||||||
response.copyHandles.push_back(state.process->InsertItem(state.input->npad.at(id).updateEvent));
|
auto handle{state.process->InsertItem(state.input->npad.at(id).updateEvent)};
|
||||||
|
|
||||||
|
state.logger->Debug("Npad {} Style Set Update Event Handle: 0x{:X}", id, handle);
|
||||||
|
response.copyHandles.push_back(handle);
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -76,7 +76,7 @@ namespace skyline::service::nvdrv {
|
|||||||
if (event != nullptr) {
|
if (event != nullptr) {
|
||||||
auto handle{state.process->InsertItem<type::KEvent>(event)};
|
auto handle{state.process->InsertItem<type::KEvent>(event)};
|
||||||
|
|
||||||
state.logger->Debug("QueryEvent: FD: {}, Event ID: {}, Handle: {}", fd, eventId, handle);
|
state.logger->Debug("QueryEvent: FD: {}, Event ID: {}, Handle: 0x{:X}", fd, eventId, handle);
|
||||||
response.copyHandles.push_back(handle);
|
response.copyHandles.push_back(handle);
|
||||||
|
|
||||||
response.Push(device::NvStatus::Success);
|
response.Push(device::NvStatus::Success);
|
||||||
|
Loading…
Reference in New Issue
Block a user