From aacbc4e675f89617db419df12d556fff2a9209a5 Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Fri, 15 Sep 2023 23:13:49 +0300 Subject: [PATCH] Initial sceVideoOutRegisterBuffers function (added ErrorCodes returns) --- src/Core/PS4/HLE/ErrorCodes.h | 16 ++++++---- src/Core/PS4/HLE/Graphics/video_out.cpp | 42 +++++++++++++++++++++++-- 2 files changed, 50 insertions(+), 8 deletions(-) diff --git a/src/Core/PS4/HLE/ErrorCodes.h b/src/Core/PS4/HLE/ErrorCodes.h index 04edb64e..50014a29 100644 --- a/src/Core/PS4/HLE/ErrorCodes.h +++ b/src/Core/PS4/HLE/ErrorCodes.h @@ -9,9 +9,13 @@ constexpr int SCE_KERNEL_ERROR_EAGAIN = 0x80020023; // Memory cannot be a constexpr int SCE_KERNEL_ERROR_ENAMETOOLONG = 0x8002003f; // character strings exceeds valid size // videoOut -constexpr int SCE_VIDEO_OUT_ERROR_INVALID_VALUE = 0x80290001; // invalid argument -constexpr int SCE_VIDEO_OUT_ERROR_RESOURCE_BUSY = 0x80290009; // already opened -constexpr int SCE_VIDEO_OUT_ERROR_INVALID_INDEX = 0x8029000A; // invalid buffer index -constexpr int SCE_VIDEO_OUT_ERROR_INVALID_HANDLE = 0x8029000B; // invalid handle -constexpr int SCE_VIDEO_OUT_ERROR_INVALID_EVENT_QUEUE = 0x8029000C; // Invalid event queue -constexpr int SCE_VIDEO_OUT_ERROR_FLIP_QUEUE_FULL = 0x80290012; // flip queue is full +constexpr int SCE_VIDEO_OUT_ERROR_INVALID_VALUE = 0x80290001; // invalid argument +constexpr int SCE_VIDEO_OUT_ERROR_INVALID_ADDRESS = 0x80290002; // invalid addresses +constexpr int SCE_VIDEO_OUT_ERROR_INVALID_TILING_MODE = 0x80290007; // invalid tiling mode +constexpr int SCE_VIDEO_OUT_ERROR_INVALID_ASPECT_RATIO = 0x80290008; // invalid aspect ration +constexpr int SCE_VIDEO_OUT_ERROR_RESOURCE_BUSY = 0x80290009; // already opened +constexpr int SCE_VIDEO_OUT_ERROR_INVALID_INDEX = 0x8029000A; // invalid buffer index +constexpr int SCE_VIDEO_OUT_ERROR_INVALID_HANDLE = 0x8029000B; // invalid handle +constexpr int SCE_VIDEO_OUT_ERROR_INVALID_EVENT_QUEUE = 0x8029000C; // Invalid event queue +constexpr int SCE_VIDEO_OUT_ERROR_FLIP_QUEUE_FULL = 0x80290012; // flip queue is full +constexpr int SCE_VIDEO_OUT_ERROR_INVALID_OPTION = 0x8029001A; // Invalid buffer attribute option diff --git a/src/Core/PS4/HLE/Graphics/video_out.cpp b/src/Core/PS4/HLE/Graphics/video_out.cpp index a9356b3f..56d006ee 100644 --- a/src/Core/PS4/HLE/Graphics/video_out.cpp +++ b/src/Core/PS4/HLE/Graphics/video_out.cpp @@ -115,8 +115,46 @@ s32 PS4_SYSV_ABI sceVideoOutAddFlipEvent(LibKernel::EventQueues::SceKernelEqueue s32 PS4_SYSV_ABI sceVideoOutRegisterBuffers(s32 handle, s32 startIndex, void* const* addresses, s32 bufferNum, const SceVideoOutBufferAttribute* attribute) { - // BREAKPOINT(); - PRINT_DUMMY_FUNCTION_NAME(); + PRINT_FUNCTION_NAME(); + auto* videoOut = Singleton::Instance(); + auto* ctx = videoOut->getCtx(handle); + + if (handle == 1) { // main port + if (startIndex < 0 || startIndex > 15) { + LOG_TRACE_IF(log_file_videoout, "invalid startIndex = {}\n", startIndex); + return SCE_VIDEO_OUT_ERROR_INVALID_VALUE; + } + if (bufferNum < 1 || bufferNum > 16) { + LOG_TRACE_IF(log_file_videoout, "invalid bufferNum = {}\n", bufferNum); + return SCE_VIDEO_OUT_ERROR_INVALID_VALUE; + } + } + if (addresses == nullptr) { + LOG_TRACE_IF(log_file_videoout, "addresses are null\n"); + return SCE_VIDEO_OUT_ERROR_INVALID_ADDRESS; + } + + if (attribute == nullptr) { + LOG_TRACE_IF(log_file_videoout, "attribute is null\n"); + return SCE_VIDEO_OUT_ERROR_INVALID_OPTION; + } + if (attribute->aspectRatio != 0) { + LOG_TRACE_IF(log_file_videoout, "invalid aspect ratio = {}\n", attribute->aspectRatio); + return SCE_VIDEO_OUT_ERROR_INVALID_ASPECT_RATIO; + } + if (attribute->tilingMode != 0 || attribute->tilingMode != 1) { + LOG_TRACE_IF(log_file_videoout, "invalid tilingMode = {}\n", attribute->tilingMode); + return SCE_VIDEO_OUT_ERROR_INVALID_TILING_MODE; + } + LOG_INFO_IF(log_file_videoout, "startIndex = {}\n", startIndex); + LOG_INFO_IF(log_file_videoout, "bufferNum = {}\n", bufferNum); + LOG_INFO_IF(log_file_videoout, "pixelFormat = {}\n", log_hex_full(attribute->pixelFormat)); + LOG_INFO_IF(log_file_videoout, "tilingMode = {}\n", attribute->tilingMode); + LOG_INFO_IF(log_file_videoout, "aspectRatio = {}\n", attribute->aspectRatio); + LOG_INFO_IF(log_file_videoout, "width = {}\n", attribute->width); + LOG_INFO_IF(log_file_videoout, "height = {}\n", attribute->height); + LOG_INFO_IF(log_file_videoout, "pitchInPixel = {}\n", attribute->pitchInPixel); + LOG_INFO_IF(log_file_videoout, "option = {}\n", attribute->option); return 0; } s32 PS4_SYSV_ABI sceVideoOutSetFlipRate(s32 handle, s32 rate) {