2024-02-23 22:32:32 +01:00
|
|
|
// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project
|
|
|
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
|
|
|
2023-08-10 19:14:44 +02:00
|
|
|
#pragma once
|
|
|
|
|
2024-04-13 23:35:48 +02:00
|
|
|
#include "core/libraries/kernel/event_queues.h"
|
2024-04-14 16:09:51 +02:00
|
|
|
#include "core/libraries/videoout/buffer.h"
|
2023-11-06 00:11:54 +01:00
|
|
|
|
|
|
|
namespace Core::Loader {
|
|
|
|
class SymbolsResolver;
|
|
|
|
}
|
2023-08-10 19:14:44 +02:00
|
|
|
|
2024-04-14 16:09:51 +02:00
|
|
|
namespace Libraries::VideoOut {
|
2023-08-10 19:14:44 +02:00
|
|
|
|
2024-02-23 21:57:57 +01:00
|
|
|
using SceUserServiceUserId = s32; // TODO move it to proper place
|
2023-08-23 22:20:43 +02:00
|
|
|
|
|
|
|
// SceVideoOutBusType
|
2024-02-23 21:57:57 +01:00
|
|
|
constexpr int SCE_VIDEO_OUT_BUS_TYPE_MAIN = 0; // Main output
|
|
|
|
constexpr int SCE_VIDEO_OUT_BUS_TYPE_AUX_SOCIAL_SCREEN = 5; // Aux output for social
|
|
|
|
constexpr int SCE_VIDEO_OUT_BUS_TYPE_AUX_GAME_LIVE_STREAMING = 6; // Aux output for screaming
|
2023-08-22 22:59:59 +02:00
|
|
|
|
2023-08-21 13:25:11 +02:00
|
|
|
// SceVideoOutRefreshRate
|
|
|
|
constexpr int SCE_VIDEO_OUT_REFRESH_RATE_UNKNOWN = 0;
|
|
|
|
constexpr int SCE_VIDEO_OUT_REFRESH_RATE_23_98HZ = 1;
|
|
|
|
constexpr int SCE_VIDEO_OUT_REFRESH_RATE_50HZ = 2;
|
|
|
|
constexpr int SCE_VIDEO_OUT_REFRESH_RATE_59_94HZ = 3;
|
|
|
|
constexpr int SCE_VIDEO_OUT_REFRESH_RATE_119_88HZ = 13;
|
|
|
|
constexpr int SCE_VIDEO_OUT_REFRESH_RATE_89_91HZ = 35;
|
|
|
|
constexpr s64 SCE_VIDEO_OUT_REFRESH_RATE_ANY = 0xFFFFFFFFFFFFFFFFUL;
|
|
|
|
|
|
|
|
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;
|
|
|
|
|
|
|
|
constexpr int SCE_VIDEO_OUT_BUFFER_ATTRIBUTE_OPTION_NONE = 0;
|
|
|
|
constexpr int SCE_VIDEO_OUT_BUFFER_ATTRIBUTE_OPTION_VR = 7;
|
|
|
|
constexpr int SCE_VIDEO_OUT_BUFFER_ATTRIBUTE_OPTION_STRICT_COLORIMETRY = 8;
|
|
|
|
|
2024-02-23 21:57:57 +01:00
|
|
|
enum SceVideoOutEventId : s16 {
|
|
|
|
SCE_VIDEO_OUT_EVENT_FLIP = 0,
|
|
|
|
SCE_VIDEO_OUT_EVENT_VBLANK = 1,
|
|
|
|
SCE_VIDEO_OUT_EVENT_PRE_VBLANK_START = 2
|
|
|
|
};
|
2023-09-05 08:13:14 +02:00
|
|
|
|
2024-04-14 16:09:51 +02:00
|
|
|
enum AspectRatioMode : s32 {
|
|
|
|
SCE_VIDEO_OUT_ASPECT_RATIO_16_9 = 0,
|
2024-02-23 21:57:57 +01:00
|
|
|
};
|
2023-08-21 13:25:11 +02:00
|
|
|
|
2024-04-14 16:09:51 +02:00
|
|
|
struct FlipStatus {
|
2023-08-21 13:25:11 +02:00
|
|
|
u64 count = 0;
|
|
|
|
u64 processTime = 0;
|
|
|
|
u64 tsc = 0;
|
2024-04-14 16:09:51 +02:00
|
|
|
s64 flipArg = -1;
|
2023-08-21 13:25:11 +02:00
|
|
|
u64 submitTsc = 0;
|
|
|
|
u64 reserved0 = 0;
|
|
|
|
s32 gcQueueNum = 0;
|
|
|
|
s32 flipPendingNum = 0;
|
2024-04-14 16:09:51 +02:00
|
|
|
s32 currentBuffer = -1;
|
2023-08-21 13:25:11 +02:00
|
|
|
u32 reserved1 = 0;
|
|
|
|
};
|
2023-08-10 19:14:44 +02:00
|
|
|
|
2023-08-21 13:25:11 +02:00
|
|
|
struct SceVideoOutResolutionStatus {
|
|
|
|
s32 fullWidth = 1280;
|
|
|
|
s32 fullHeight = 720;
|
|
|
|
s32 paneWidth = 1280;
|
|
|
|
s32 paneHeight = 720;
|
|
|
|
u64 refreshRate = SCE_VIDEO_OUT_REFRESH_RATE_59_94HZ;
|
|
|
|
float screenSizeInInch = 50;
|
|
|
|
u16 flags = 0;
|
|
|
|
u16 reserved0 = 0;
|
|
|
|
u32 reserved1[3] = {0};
|
|
|
|
};
|
2023-08-10 19:14:44 +02:00
|
|
|
|
2023-08-21 19:44:53 +02:00
|
|
|
struct SceVideoOutVblankStatus {
|
|
|
|
u64 count = 0;
|
|
|
|
u64 processTime = 0;
|
|
|
|
u64 tsc = 0;
|
|
|
|
u64 reserved[1] = {0};
|
2024-02-23 22:32:32 +01:00
|
|
|
u8 flags = 0;
|
|
|
|
u8 pad1[7] = {};
|
2023-08-21 19:44:53 +02:00
|
|
|
};
|
|
|
|
|
2024-04-14 16:09:51 +02:00
|
|
|
void PS4_SYSV_ABI sceVideoOutSetBufferAttribute(BufferAttribute* attribute, PixelFormat pixelFormat,
|
|
|
|
u32 tilingMode, u32 aspectRatio, u32 width,
|
|
|
|
u32 height, u32 pitchInPixel);
|
|
|
|
s32 PS4_SYSV_ABI sceVideoOutAddFlipEvent(Kernel::SceKernelEqueue eq, s32 handle, void* udata);
|
2024-02-23 21:57:57 +01:00
|
|
|
s32 PS4_SYSV_ABI sceVideoOutRegisterBuffers(s32 handle, s32 startIndex, void* const* addresses,
|
2024-04-14 16:09:51 +02:00
|
|
|
s32 bufferNum, const BufferAttribute* attribute);
|
2023-08-21 13:25:11 +02:00
|
|
|
s32 PS4_SYSV_ABI sceVideoOutSetFlipRate(s32 handle, s32 rate);
|
|
|
|
s32 PS4_SYSV_ABI sceVideoOutIsFlipPending(s32 handle);
|
|
|
|
s32 PS4_SYSV_ABI sceVideoOutSubmitFlip(s32 handle, s32 bufferIndex, s32 flipMode, s64 flipArg);
|
2024-04-14 16:09:51 +02:00
|
|
|
s32 PS4_SYSV_ABI sceVideoOutGetFlipStatus(s32 handle, FlipStatus* status);
|
2023-08-21 13:25:11 +02:00
|
|
|
s32 PS4_SYSV_ABI sceVideoOutGetResolutionStatus(s32 handle, SceVideoOutResolutionStatus* status);
|
2024-02-23 21:57:57 +01:00
|
|
|
s32 PS4_SYSV_ABI sceVideoOutOpen(SceUserServiceUserId userId, s32 busType, s32 index,
|
|
|
|
const void* param);
|
2023-10-16 13:34:12 +02:00
|
|
|
s32 PS4_SYSV_ABI sceVideoOutClose(s32 handle);
|
2023-11-06 00:11:54 +01:00
|
|
|
|
2024-04-14 16:09:51 +02:00
|
|
|
void Flip(std::chrono::microseconds micros);
|
|
|
|
void Vblank();
|
|
|
|
|
2024-05-08 22:54:34 +02:00
|
|
|
// Internal system functions
|
2024-05-08 07:35:10 +02:00
|
|
|
void sceVideoOutGetBufferLabelAddress(s32 handle, uintptr_t* label_addr);
|
2024-05-10 21:48:01 +02:00
|
|
|
s32 sceVideoOutSubmitEopFlip(s32 handle, u32 buf_id, u32 mode, u32 arg, void** unk);
|
2024-05-08 07:35:10 +02:00
|
|
|
|
2024-04-14 16:09:51 +02:00
|
|
|
void RegisterLib(Core::Loader::SymbolsResolver* sym);
|
|
|
|
|
|
|
|
} // namespace Libraries::VideoOut
|