From 6399886fea5f29bf56d66ca1173b20eaebf1b292 Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Thu, 10 Aug 2023 20:14:44 +0300 Subject: [PATCH] sceVideoOutSetBufferAttribute implementation --- CMakeLists.txt | 2 + src/Core/PS4/HLE/Graphics/video_out.cpp | 50 +++++++++++++++++++++++++ src/Core/PS4/HLE/Graphics/video_out.h | 36 ++++++++++++++++++ src/Core/PS4/HLE/LibSceVideoOut.cpp | 7 +--- src/Core/PS4/HLE/LibSceVideoOut.h | 4 +- 5 files changed, 91 insertions(+), 8 deletions(-) create mode 100644 src/Core/PS4/HLE/Graphics/video_out.cpp create mode 100644 src/Core/PS4/HLE/Graphics/video_out.h diff --git a/CMakeLists.txt b/CMakeLists.txt index acbff76b..2cdaf46c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -41,6 +41,8 @@ add_executable(shadps4 src/Core/PS4/HLE/Kernel/Objects/physical_memory.cpp src/Util/string_util.cpp src/Util/string_util.cpp + src/Core/PS4/HLE/Graphics/video_out.cpp + src/Core/PS4/HLE/Graphics/video_out.h "src/Util/Singleton.h" "src/Util/Disassembler.cpp" "src/Util/Disassembler.h" "src/Core/PS4/Util/aerolib.h" "src/Core/PS4/Loader/SymbolsResolver.h" "src/Core/PS4/Loader/SymbolsResolver.cpp" "src/Core/PS4/HLE/Libs.cpp" "src/Core/PS4/HLE/Libs.h" "src/Core/PS4/HLE/LibC.cpp" "src/Core/PS4/HLE/LibC.h" "src/Lib/Timer.cpp" "src/Lib/Timer.h" "src/Core/PS4/HLE/LibKernel.cpp" "src/Core/PS4/HLE/LibKernel.h" "src/Core/PS4/HLE/LibSceVideoOut.cpp" "src/Core/PS4/HLE/LibSceVideoOut.h" "src/Core/PS4/HLE/LibSceGnmDriver.cpp" "src/Core/PS4/HLE/LibSceGnmDriver.h" "src/Core/PS4/HLE/Kernel/ThreadManagement.cpp" "src/Core/PS4/HLE/Kernel/ThreadManagement.h" "src/Core/PS4/HLE/ErrorCodes.h" "src/debug.h" "src/Core/PS4/HLE/Kernel/memory_management.cpp" "src/Core/PS4/HLE/Kernel/memory_management.h" "src/Core/PS4/GPU/gpu_memory.cpp" "src/Core/PS4/GPU/gpu_memory.h" "src/emulator.cpp" "src/emulator.h") find_package(OpenGL REQUIRED) diff --git a/src/Core/PS4/HLE/Graphics/video_out.cpp b/src/Core/PS4/HLE/Graphics/video_out.cpp new file mode 100644 index 00000000..80342de5 --- /dev/null +++ b/src/Core/PS4/HLE/Graphics/video_out.cpp @@ -0,0 +1,50 @@ +#include "video_out.h" + +#include +#include +#include + +#include +#include + +namespace HLE::Libs::Graphics::VideoOut { + +constexpr bool log_file_videoout = true; // disable it to disable logging + +std::string getPixelFormatString(s32 format) { + switch (format) { + case SCE_VIDEO_OUT_PIXEL_FORMAT_A8R8G8B8_SRGB: return "SCE_VIDEO_OUT_PIXEL_FORMAT_A8R8G8B8_SRGB"; + case SCE_VIDEO_OUT_PIXEL_FORMAT_A8B8G8R8_SRGB: return "SCE_VIDEO_OUT_PIXEL_FORMAT_A8B8G8R8_SRGB"; + case SCE_VIDEO_OUT_PIXEL_FORMAT_A2R10G10B10: return "SCE_VIDEO_OUT_PIXEL_FORMAT_A2R10G10B10"; + case SCE_VIDEO_OUT_PIXEL_FORMAT_A2R10G10B10_SRGB: return "SCE_VIDEO_OUT_PIXEL_FORMAT_A2R10G10B10_SRGB"; + case SCE_VIDEO_OUT_PIXEL_FORMAT_A2R10G10B10_BT2020_PQ: return "SCE_VIDEO_OUT_PIXEL_FORMAT_A2R10G10B10_BT2020_PQ"; + case SCE_VIDEO_OUT_PIXEL_FORMAT_A16R16G16B16_FLOAT: return "SCE_VIDEO_OUT_PIXEL_FORMAT_A16R16G16B16_FLOAT"; + case SCE_VIDEO_OUT_PIXEL_FORMAT_YCBCR420_BT709: return "SCE_VIDEO_OUT_PIXEL_FORMAT_YCBCR420_BT709"; + default: return "Unknown pixel format"; + } +} + +void PS4_SYSV_ABI sceVideoOutSetBufferAttribute(SceVideoOutBufferAttribute* attribute, u32 pixelFormat, u32 tilingMode, u32 aspectRatio, u32 width, + u32 height, u32 pitchInPixel) { + PRINT_FUNCTION_NAME(); + + auto tileMode = magic_enum::enum_cast(tilingMode); + auto aspectR = magic_enum::enum_cast(aspectRatio); + + LOG_INFO_IF(log_file_videoout, "pixelFormat = {}\n", getPixelFormatString(pixelFormat)); + LOG_INFO_IF(log_file_videoout, "tilingMode = {}\n", magic_enum::enum_name(tileMode.value())); + LOG_INFO_IF(log_file_videoout, "aspectRatio = {}\n", magic_enum::enum_name(aspectR.value())); + LOG_INFO_IF(log_file_videoout, "width = {}\n", width); + LOG_INFO_IF(log_file_videoout, "height = {}\n", height); + LOG_INFO_IF(log_file_videoout, "pitchInPixel = {}\n", pitchInPixel); + + memset(attribute, 0, sizeof(SceVideoOutBufferAttribute)); + + attribute->pixelFormat = pixelFormat; + attribute->tilingMode = tilingMode; + attribute->aspectRatio = aspectRatio; + attribute->width = width; + attribute->height = height; + attribute->pitchInPixel = pitchInPixel; +} +} // namespace HLE::Libs::Graphics::VideoOut \ No newline at end of file diff --git a/src/Core/PS4/HLE/Graphics/video_out.h b/src/Core/PS4/HLE/Graphics/video_out.h new file mode 100644 index 00000000..9b5592c4 --- /dev/null +++ b/src/Core/PS4/HLE/Graphics/video_out.h @@ -0,0 +1,36 @@ +#pragma once +#include + +#include + +namespace HLE::Libs::Graphics::VideoOut { + +struct SceVideoOutBufferAttribute { + s32 pixelFormat; + s32 tilingMode; + s32 aspectRatio; + u32 width; + u32 height; + u32 pitchInPixel; + u32 option; + u32 _reserved0; + u64 _reserved1; +}; + +constexpr int SCE_VIDEO_OUT_PIXEL_FORMAT_A8R8G8B8_SRGB = 0x80000000; +constexpr int SCE_VIDEO_OUT_PIXEL_FORMAT_A8B8G8R8_SRGB = 0x80002200; +constexpr int SCE_VIDEO_OUT_PIXEL_FORMAT_A2R10G10B10 = 0x88060000; +constexpr int SCE_VIDEO_OUT_PIXEL_FORMAT_A2R10G10B10_SRGB = 0x88000000; +constexpr int SCE_VIDEO_OUT_PIXEL_FORMAT_A2R10G10B10_BT2020_PQ = 0x88740000; +constexpr int SCE_VIDEO_OUT_PIXEL_FORMAT_A16R16G16B16_FLOAT = 0xC1060000; +constexpr int SCE_VIDEO_OUT_PIXEL_FORMAT_YCBCR420_BT709 = 0x08322200; + +enum SceVideoOutTilingMode : s32 { SCE_VIDEO_OUT_TILING_MODE_TILE = 0, SCE_VIDEO_OUT_TILING_MODE_LINEAR = 1 }; + +enum AspectRatioMode : s32 { SCE_VIDEO_OUT_ASPECT_RATIO_16_9 = 0 }; + +std::string getPixelFormatString(s32 format); + +void PS4_SYSV_ABI sceVideoOutSetBufferAttribute(SceVideoOutBufferAttribute* attribute, u32 pixelFormat, u32 tilingMode, u32 aspectRatio, u32 width, + u32 height, u32 pitchInPixel); +} // namespace HLE::Libs::Graphics::VideoOut \ No newline at end of file diff --git a/src/Core/PS4/HLE/LibSceVideoOut.cpp b/src/Core/PS4/HLE/LibSceVideoOut.cpp index 790bc3e5..53a42840 100644 --- a/src/Core/PS4/HLE/LibSceVideoOut.cpp +++ b/src/Core/PS4/HLE/LibSceVideoOut.cpp @@ -7,6 +7,7 @@ #include "Libs.h" #include "UserManagement/UsrMngCodes.h" #include "VideoOut/VideoOutCodes.h" +#include "Graphics/video_out.h" namespace HLE::Libs::LibSceVideoOut { @@ -33,10 +34,6 @@ int32_t PS4_SYSV_ABI sceVideoOutSetFlipRate(int32_t handle, int32_t rate) { BREAKPOINT(); return 0; } -void PS4_SYSV_ABI sceVideoOutSetBufferAttribute(/* SceVideoOutBufferAttribute* attribute,*/ uint32_t pixelFormat, uint32_t tilingMode, - uint32_t aspectRatio, uint32_t width, uint32_t height, uint32_t pitchInPixel) { - BREAKPOINT(); -} int32_t PS4_SYSV_ABI sceVideoOutGetResolutionStatus(int32_t handle /*, SceVideoOutResolutionStatus* status*/) { BREAKPOINT(); return 0; @@ -68,7 +65,7 @@ void LibSceVideoOut_Register(SymbolsResolver* sym) { LIB_FUNCTION("w3BY+tAEiQY", "libSceVideoOut", 1, "libSceVideoOut", 0, 0, sceVideoOutRegisterBuffers); LIB_FUNCTION("HXzjK9yI30k", "libSceVideoOut", 1, "libSceVideoOut", 0, 0, sceVideoOutAddFlipEvent); LIB_FUNCTION("CBiu4mCE1DA", "libSceVideoOut", 1, "libSceVideoOut", 0, 0, sceVideoOutSetFlipRate); - LIB_FUNCTION("i6-sR91Wt-4", "libSceVideoOut", 1, "libSceVideoOut", 0, 0, sceVideoOutSetBufferAttribute); + LIB_FUNCTION("i6-sR91Wt-4", "libSceVideoOut", 1, "libSceVideoOut", 0, 0, HLE::Libs::Graphics::VideoOut::sceVideoOutSetBufferAttribute); LIB_FUNCTION("6kPnj51T62Y", "libSceVideoOut", 1, "libSceVideoOut", 0, 0, sceVideoOutGetResolutionStatus); LIB_FUNCTION("Up36PTk687E", "libSceVideoOut", 1, "libSceVideoOut", 0, 0, sceVideoOutOpen); LIB_FUNCTION("zgXifHT9ErY", "libSceVideoOut", 1, "libSceVideoOut", 0, 0, sceVideoOutIsFlipPending); diff --git a/src/Core/PS4/HLE/LibSceVideoOut.h b/src/Core/PS4/HLE/LibSceVideoOut.h index c9563b0e..d6024e64 100644 --- a/src/Core/PS4/HLE/LibSceVideoOut.h +++ b/src/Core/PS4/HLE/LibSceVideoOut.h @@ -13,9 +13,7 @@ int32_t PS4_SYSV_ABI sceVideoOutRegisterBuffers(int32_t handle, int32_t startInd int32_t bufferNum /*,const SceVideoOutBufferAttribute* attribute*/); int32_t PS4_SYSV_ABI sceVideoOutAddFlipEvent(/*SceKernelEqueue eq,*/ int32_t handle, void* udata); int32_t PS4_SYSV_ABI sceVideoOutSetFlipRate(int32_t handle, int32_t rate); -void PS4_SYSV_ABI sceVideoOutSetBufferAttribute(/* SceVideoOutBufferAttribute* attribute,*/ uint32_t pixelFormat, uint32_t tilingMode, - uint32_t aspectRatio, - uint32_t width, uint32_t height, uint32_t pitchInPixel); + int32_t PS4_SYSV_ABI sceVideoOutGetResolutionStatus(int32_t handle /*, SceVideoOutResolutionStatus* status*/); s32 PS4_SYSV_ABI sceVideoOutOpen(SceUserServiceUserId userId, s32 busType, s32 index, const void* param); int32_t PS4_SYSV_ABI sceVideoOutIsFlipPending(int32_t handle);