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:
parent
df16c4c256
commit
e6f4d2c178
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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");
|
||||
|
|
|
|||
Loading…
Reference in New Issue