fix(libSceVideoOut): ignore the reserved buffer pointers

Titles may leave the reserved pointers of a VideoOutBuffers entry uninitialized, so sceVideoOutRegisterBuffers2 no longer rejects them.
This commit is contained in:
Gjon Gojcevic 2026-10-07 19:50:12 -04:00
parent df16c4c256
commit e6f4d2c178
2 changed files with 9 additions and 1 deletions

View File

@ -88,7 +88,6 @@ int APS5_VABI sceVideoOutRegisterBuffers2(int handle, int setIndex, int bufferIn
group.occupied = true;
std::array<VideoOutBuffer, VIDEO_OUT_BUFFER_NUM_MAX> registered{};
for (int i = 0; i < bufferNum; ++i) {
if (buffers[i].reserved[0] != nullptr || buffers[i].reserved[1] != nullptr) throw std::runtime_error("VideoOut: reserved buffer pointers are set");
registered[i] = {setIndex, reinterpret_cast<uint64_t>(buffers[i].data), reinterpret_cast<uint64_t>(buffers[i].metadata)};
const auto display = DescribeVideoOutBuffer(registered[i], group);
AgcDriverCheckGuestMemory_nid_postfix(buffers[i].data, AgcDriverDisplayBufferSize_nid_postfix(display), 65536);

View File

@ -257,6 +257,15 @@ void testControls() {
}
check(sceVideoOutWaitVblank(handle) == 0, "vblank wait failed");
check(owner->GetTriggeredEvents(&event, 1) == 1 && event.udata == &settings && sceVideoOutGetEventId(&event) == VIDEO_OUT_EVENT_VBLANK, "vblank event or updated user data missing");
std::vector<std::byte> allocation(65536 + 65535);
const auto storage = alignedBuffer(allocation);
VideoOutBuffers buffer{storage.data(), nullptr, {allocation.data(), storage.data()}};
VideoOutBufferAttribute2 attribute{};
attribute.width = 64;
attribute.height = 64;
attribute.pixel_format = 0x8000000000000000ull;
check(sceVideoOutRegisterBuffers2(handle, 0, 0, &buffer, 1, &attribute, 0, nullptr) == 0, "buffers with set reserved pointers were rejected");
check(sceVideoOutUnregisterBuffers(handle, 0) == 0, "buffer unregistration failed");
sceVideoOutClose(handle);
check(owner->GetTriggeredEvents(&event, 1) == 0, "closed port retained pending events");
check(sceKernelDeleteEqueue(queue) == 0, "event queue deletion failed");