diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 32ee69b692..84881497b9 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -38,7 +38,11 @@ include: # MacOS 64-bit - project: 'libretro-infrastructure/ci-templates' - file: '/osx-x64.yml' + file: '/osx-cmake-x86.yml' + + # MacOS arm64 + - project: 'libretro-infrastructure/ci-templates' + file: '/osx-cmake-arm64.yml' ################################## CELLULAR ################################ # Android @@ -92,7 +96,16 @@ libretro-build-osx-x64: tags: - macosx-packaging extends: - - .libretro-osx-x64-make-default + - .libretro-osx-cmake-x86_64 + - .core-defs + - .make-defs + +# MacOS 64-bit +libretro-build-osx-arm64: + tags: + - macosx-packaging + extends: + - .libretro-osx-cmake-arm64 - .core-defs - .make-defs diff --git a/.gitmodules b/.gitmodules index 26b33177e4..da3169b8eb 100644 --- a/.gitmodules +++ b/.gitmodules @@ -38,3 +38,6 @@ path = assets/debugger url = https://github.com/unknownbrackets/ppsspp-debugger.git branch = bundled +[submodule "cpu_features"] + path = ext/cpu_features + url = https://github.com/google/cpu_features.git diff --git a/CMakeLists.txt b/CMakeLists.txt index d964b68790..768c2b84b9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -256,6 +256,7 @@ include(FindThreads) if(APPLE) find_library(COCOA_LIBRARY Cocoa) + find_library(IOKIT_LIBRARY IOKit) find_library(QUARTZ_CORE_LIBRARY QuartzCore) endif() @@ -775,12 +776,13 @@ add_library(Common STATIC Common/SysError.cpp Common/TimeUtil.cpp Common/TimeUtil.h + Common/Battery/Battery.h ) include_directories(Common) setup_target_project(Common Common) -target_link_libraries(Common Ext::Snappy) +target_link_libraries(Common Ext::Snappy cpu_features) if(USING_GLES2 OR (USING_EGL AND NOT USING_FBDEV)) find_package(X11) @@ -1150,6 +1152,7 @@ elseif(IOS) ios/iCade/iCadeState.h UI/DarwinMemoryStickManager.mm UI/DarwinMemoryStickManager.h + Common/Battery/AppleBatteryClient.m ) set(nativeExtraLibs ${nativeExtraLibs} "-framework Foundation -framework MediaPlayer -framework AudioToolbox -framework CoreGraphics -framework QuartzCore -framework UIKit -framework GLKit -framework OpenAL -framework AVFoundation -framework CoreLocation -framework CoreVideo -framework CoreMedia -framework CoreServices" ) @@ -1170,6 +1173,7 @@ elseif(IOS) set_source_files_properties(ios/CameraHelper.mm PROPERTIES COMPILE_FLAGS -fobjc-arc) set_source_files_properties(ios/LocationHelper.mm PROPERTIES COMPILE_FLAGS -fobjc-arc) set_source_files_properties(UI/DarwinMemoryStickManager.mm PROPERTIES COMPILE_FLAGS -fobjc-arc) + set_source_files_properties(Common/Battery/AppleBatteryClient.m PROPERTIES COMPILE_FLAGS -fobjc-arc) set(TargetBin PPSSPP) elseif(USING_QT_UI) set(CMAKE_AUTOMOC ON) @@ -1227,9 +1231,10 @@ elseif(TARGET SDL2::SDL2) endif() set(nativeExtraLibs ${nativeExtraLibs} SDL2::SDL2) if(APPLE) - set(nativeExtra ${nativeExtra} SDL/SDLMain.h SDL/SDLMain.mm SDL/SDLCocoaMetalLayer.h SDL/SDLCocoaMetalLayer.mm UI/DarwinMemoryStickManager.mm) + set(nativeExtra ${nativeExtra} SDL/SDLMain.h SDL/SDLMain.mm SDL/SDLCocoaMetalLayer.h SDL/SDLCocoaMetalLayer.mm UI/DarwinMemoryStickManager.mm Common/Battery/AppleBatteryClient.m) set_source_files_properties(UI/DarwinMemoryStickManager.mm PROPERTIES COMPILE_FLAGS -fobjc-arc) - set(nativeExtraLibs ${nativeExtraLibs} ${COCOA_LIBRARY} ${QUARTZ_CORE_LIBRARY}) + set_source_files_properties(Common/Battery/AppleBatteryClient.m PROPERTIES COMPILE_FLAGS -fobjc-arc) + set(nativeExtraLibs ${nativeExtraLibs} ${COCOA_LIBRARY} ${QUARTZ_CORE_LIBRARY} ${IOKIT_LIBRARY}) elseif(USING_EGL) set(nativeExtraLibs ${nativeExtraLibs} pthread) endif() @@ -2378,7 +2383,7 @@ if(HEADLESS) ) endif() add_executable(PPSSPPHeadless ${HeadlessSource}) - target_link_libraries(PPSSPPHeadless ${COCOA_LIBRARY} ${QUARTZ_CORE_LIBRARY} ${LinkCommon}) + target_link_libraries(PPSSPPHeadless ${COCOA_LIBRARY} ${QUARTZ_CORE_LIBRARY} ${IOKIT_LIBRARY} ${LinkCommon}) setup_target_project(PPSSPPHeadless headless) endif() @@ -2398,7 +2403,7 @@ if(UNITTEST) Core/MIPS/ARM/ArmRegCache.cpp Core/MIPS/ARM/ArmRegCacheFPU.cpp ) - target_link_libraries(PPSSPPUnitTest ${COCOA_LIBRARY} ${QUARTZ_CORE_LIBRARY} ${LinkCommon} Common) + target_link_libraries(PPSSPPUnitTest ${COCOA_LIBRARY} ${QUARTZ_CORE_LIBRARY} ${IOKIT_LIBRARY} ${LinkCommon} Common) setup_target_project(PPSSPPUnitTest unittest) add_test(arm64_emitter PPSSPPUnitTest Arm64Emitter) add_test(arm_emitter PPSSPPUnitTest ArmEmitter) diff --git a/Common/ArmCPUDetect.cpp b/Common/ArmCPUDetect.cpp index 437bd3158e..4742e2b862 100644 --- a/Common/ArmCPUDetect.cpp +++ b/Common/ArmCPUDetect.cpp @@ -26,6 +26,20 @@ #if PPSSPP_ARCH(ARM) || PPSSPP_ARCH(ARM64) +#if PPSSPP_ARCH(ARM) +#include "ext/cpu_features/include/cpuinfo_arm.h" + +#if defined(CPU_FEATURES_OS_LINUX) || defined(CPU_FEATURES_OS_ANDROID) +#define USE_CPU_FEATURES 1 +#endif +#elif PPSSPP_ARCH(ARM64) && defined(__aarch64__) +#include "ext/cpu_features/include/cpuinfo_aarch64.h" + +#if defined(CPU_FEATURES_OS_LINUX) || defined(CPU_FEATURES_OS_ANDROID) +#define USE_CPU_FEATURES 1 +#endif +#endif + #include #include "Common/CommonTypes.h" @@ -337,31 +351,81 @@ void CPUInfo::Detect() bNEON = true; bASIMD = true; #endif + +#if PPSSPP_ARCH(ARM) && defined(USE_CPU_FEATURES) + cpu_features::ArmInfo info = cpu_features::GetArmInfo(); + bSwp = info.features.swp; + bHalf = info.features.half; + bThumb = info.features.thumb; + bFastMult = info.features.fastmult; + bEDSP = info.features.edsp; + bThumbEE = info.features.thumbee; + bNEON = info.features.neon; + bTLS = info.features.tls; + bVFP = info.features.vfp; + bVFPv3 = info.features.vfpv3; + bVFPv4 = info.features.vfpv4; + bIDIVa = info.features.idiva; + bIDIVt = info.features.idivt; +#endif +#if PPSSPP_ARCH(ARM64) && defined(USE_CPU_FEATURES) + cpu_features::Aarch64Info info = cpu_features::GetAarch64Info(); + bFP = info.features.fp; + bASIMD = info.features.asimd; + bSVE = info.features.sve; + bSVE2 = info.features.sve2; + bFRINT = info.features.frint; +#endif +} + +std::vector CPUInfo::Features() { + std::vector features; + + struct Flag { + bool &flag; + const char *str; + }; + const Flag list[] = { + { bSwp, "SWP" }, + { bHalf, "Half" }, + { bThumb, "Thumb" }, + { bFastMult, "FastMult" }, + { bEDSP, "EDSP" }, + { bThumbEE, "ThumbEE" }, + { bTLS, "TLS" }, + { bVFP, "VFP" }, + { bVFPv3, "VFPv3" }, + { bVFPv4, "VFPv4" }, + { bNEON, "NEON" }, + { bIDIVa, "IDIVa" }, + { bIDIVt, "IDIVt" }, + { bFRINT, "FRINT" }, + { bSVE, "SVE" }, + { bSVE2, "SVE2" }, + { CPU64bit, "64-bit" }, + }; + + for (auto &item : list) { + if (item.flag) { + features.push_back(item.str); + } + } + + return features; } // Turn the cpu info into a string we can show -std::string CPUInfo::Summarize() -{ +std::string CPUInfo::Summarize() { std::string sum; if (num_cores == 1) sum = StringFromFormat("%s, %d core", cpu_string, num_cores); else sum = StringFromFormat("%s, %d cores", cpu_string, num_cores); - if (bSwp) sum += ", SWP"; - if (bHalf) sum += ", Half"; - if (bThumb) sum += ", Thumb"; - if (bFastMult) sum += ", FastMult"; - if (bEDSP) sum += ", EDSP"; - if (bThumbEE) sum += ", ThumbEE"; - if (bTLS) sum += ", TLS"; - if (bVFP) sum += ", VFP"; - if (bVFPv3) sum += ", VFPv3"; - if (bVFPv4) sum += ", VFPv4"; - if (bNEON) sum += ", NEON"; - if (bIDIVa) sum += ", IDIVa"; - if (bIDIVt) sum += ", IDIVt"; - if (CPU64bit) sum += ", 64-bit"; + auto features = Features(); + for (std::string &feature : features) { + sum += ", " + feature; + } return sum; } diff --git a/Common/Battery/AppleBatteryClient.m b/Common/Battery/AppleBatteryClient.m new file mode 100644 index 0000000000..6fbb29e8d5 --- /dev/null +++ b/Common/Battery/AppleBatteryClient.m @@ -0,0 +1,96 @@ +// +// AppleBatteryClient.m +// PPSSPP +// +// Created by Serena on 24/01/2023. +// + +#include "Battery.h" +#import + +#if PPSSPP_PLATFORM(MAC) +#include +#include +#elif PPSSPP_PLATFORM(IOS) +#import +#endif + +@interface AppleBatteryClient : NSObject ++(instancetype)sharedClient; +-(void)setNeedsToUpdateLevel; +@property int batteryLevel; +@end + +void _powerSourceRunLoopCallback(void * __unused ctx) { + // IOKit has told us that battery information has changed, now update the batteryLevel var + [[AppleBatteryClient sharedClient] setNeedsToUpdateLevel]; +} + +// You may ask, +// "Why an entire class? +// Why not just call the UIDevice/IOKitPowerSource functions every time getCurrentBatteryCapacity() is called?" +// Well, calling the UIDevice/IOKitPowerSource functions very frequently (every second, it seems?) is expensive +// So, instead, I made a class with a cached batteryLevel property +// that only gets set when it needs to. +@implementation AppleBatteryClient + ++ (instancetype)sharedClient { + static AppleBatteryClient *client; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + client = [AppleBatteryClient new]; + [client initialSetup]; + [client setNeedsToUpdateLevel]; + }); + + return client; +} + +-(void)initialSetup { +#if TARGET_OS_IOS + // on iOS, this needs to be true to get the battery level + // and it needs to be set just once, so do it here + UIDevice.currentDevice.batteryMonitoringEnabled = YES; + // Register for when the battery % changes + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(setNeedsToUpdateLevel) + name:UIDeviceBatteryLevelDidChangeNotification object:nil]; + +#elif TARGET_OS_MAC + CFRunLoopSourceRef loop = IOPSNotificationCreateRunLoopSource(_powerSourceRunLoopCallback, nil); + CFRunLoopAddSource(CFRunLoopGetMain(), loop, kCFRunLoopDefaultMode); +#endif +} + +- (void)setNeedsToUpdateLevel { +#if TARGET_OS_IOS + // `-[UIDevice batteryLevel]` returns the % like '0.(actual %)' (ie, 0.28 when the battery is 28%) + // so multiply it by 100 to get a visually appropriate version + self.batteryLevel = [[UIDevice currentDevice] batteryLevel] * 100; +#elif TARGET_OS_MAC + CFTypeRef snapshot = IOPSCopyPowerSourcesInfo(); + NSArray *sourceList = (__bridge NSArray *)IOPSCopyPowerSourcesList(snapshot); + if (!sourceList) { + if (snapshot) CFRelease(snapshot); + return; + } + + for (NSDictionary *source in sourceList) { + // kIOPSCurrentCapacityKey = battery level + NSNumber *currentCapacity = [source objectForKey:@(kIOPSCurrentCapacityKey)]; + if (currentCapacity) { + // we found what we want + self.batteryLevel = currentCapacity.intValue; + break; + } + } + CFRelease(snapshot); +#endif +} + +@end + + +int getCurrentBatteryCapacity() { + return [[AppleBatteryClient sharedClient] batteryLevel]; +} diff --git a/Common/Battery/Battery.h b/Common/Battery/Battery.h new file mode 100644 index 0000000000..aa90d60f29 --- /dev/null +++ b/Common/Battery/Battery.h @@ -0,0 +1,32 @@ +// +// Battery.h +// PPSSPP +// +// Created by Serena on 24/01/2023. +// + +// NOTE: Though this is a general purpose header file, +// though the implementation right now is Darwin specific +// In case any future platform implementations are made for other platforms, +// define the function below in their own file + +#ifndef BATTERY_H +#define BATTERY_H +#include "ppsspp_config.h" +//#include + +#ifdef __cplusplus +extern "C" { +#endif + +#if PPSSPP_PLATFORM(IOS) || PPSSPP_PLATFORM(MAC) +#define CAN_DISPLAY_CURRENT_BATTERY_CAPACITY +/// Get the current battery %. +int getCurrentBatteryCapacity(); +#endif /* PPSSPP_PLATFORM(IOS) || PPSSPP_PLATFORM(MAC) */ + +#ifdef __cplusplus +} +#endif + +#endif /* BATTERY_H */ diff --git a/Common/CPUDetect.cpp b/Common/CPUDetect.cpp index ebf78012b6..aa43930ead 100644 --- a/Common/CPUDetect.cpp +++ b/Common/CPUDetect.cpp @@ -19,6 +19,12 @@ #include "ppsspp_config.h" #if PPSSPP_ARCH(X86) || PPSSPP_ARCH(AMD64) +#include "ext/cpu_features/include/cpuinfo_x86.h" + +#if defined(CPU_FEATURES_OS_FREEBSD) || defined(CPU_FEATURES_OS_LINUX) || defined(CPU_FEATURES_OS_ANDROID) || defined(CPU_FEATURES_OS_MACOS) || defined(CPU_FEATURES_OS_WINDOWS) +#define USE_CPU_FEATURES 1 +#endif + #ifdef __ANDROID__ #include #include @@ -141,6 +147,10 @@ static std::vector ParseCPUList(const std::string &filename) { // Detects the various cpu features void CPUInfo::Detect() { +#ifdef USE_CPU_FEATURES + cpu_features::X86Info info = cpu_features::GetX86Info(); +#endif + memset(this, 0, sizeof(*this)); #if PPSSPP_ARCH(X86) Mode64bit = false; @@ -185,7 +195,50 @@ void CPUInfo::Detect() { vendor = VENDOR_OTHER; // Set reasonable default brand string even if brand string not available. - strcpy(brand_string, cpu_string); +#ifdef USE_CPU_FEATURES + if (info.brand_string[0]) + strcpy(brand_string, info.brand_string); + else +#endif + strcpy(brand_string, cpu_string); + +#ifdef USE_CPU_FEATURES + switch (cpu_features::GetX86Microarchitecture(&info)) { + case cpu_features::INTEL_ATOM_BNL: + case cpu_features::INTEL_ATOM_SMT: + case cpu_features::INTEL_ATOM_GMT: + case cpu_features::INTEL_ATOM_GMT_PLUS: + case cpu_features::INTEL_ATOM_TMT: + bAtom = true; + break; + default: + bAtom = false; + break; + } + + bPOPCNT = info.features.popcnt; + bBMI1 = info.features.bmi1; + bBMI2 = info.features.bmi2; + bBMI2_fast = bBMI2 && (vendor != VENDOR_AMD || info.family >= 0x19); + bMOVBE = info.features.movbe; + bLZCNT = info.features.lzcnt; + bRTM = info.features.rtm; + + bSSE = info.features.sse; + bSSE2 = info.features.sse2; + bSSE3 = info.features.sse3; + bSSSE3 = info.features.ssse3; + bSSE4_1 = info.features.sse4_1; + bSSE4_2 = info.features.sse4_2; + bSSE4A = info.features.sse4a; + bAES = info.features.aes; + bSHA = info.features.sha; + bF16C = info.features.f16c; + bAVX = info.features.avx; + bAVX2 = info.features.avx2; + bFMA3 = info.features.fma3; + bFMA4 = info.features.fma4; +#endif // Detect family and other misc stuff. bool ht = false; @@ -193,16 +246,19 @@ void CPUInfo::Detect() { logical_cpu_count = 1; if (max_std_fn >= 1) { do_cpuid(cpu_id, 0x00000001); +#ifndef USE_CPU_FEATURES int family = ((cpu_id[0] >> 8) & 0xf) + ((cpu_id[0] >> 20) & 0xff); int model = ((cpu_id[0] >> 4) & 0xf) + ((cpu_id[0] >> 12) & 0xf0); // Detect people unfortunate enough to be running PPSSPP on an Atom if (family == 6 && (model == 0x1C || model == 0x26 || model == 0x27 || model == 0x35 || model == 0x36 || model == 0x37 || model == 0x4A || model == 0x4D || model == 0x5A || model == 0x5D)) bAtom = true; +#endif logical_cpu_count = (cpu_id[1] >> 16) & 0xFF; ht = (cpu_id[3] >> 28) & 1; +#ifndef USE_CPU_FEATURES if ((cpu_id[3] >> 25) & 1) bSSE = true; if ((cpu_id[3] >> 26) & 1) bSSE2 = true; if ((cpu_id[2]) & 1) bSSE3 = true; @@ -215,6 +271,7 @@ void CPUInfo::Detect() { bFMA3 = true; } if ((cpu_id[2] >> 25) & 1) bAES = true; +#endif if ((cpu_id[3] >> 24) & 1) { @@ -222,6 +279,7 @@ void CPUInfo::Detect() { bFXSR = true; } +#ifndef USE_CPU_FEATURES // AVX support requires 3 separate checks: // - Is the AVX bit set in CPUID? (>>28) // - Is the XSAVE bit set in CPUID? ( >>26) @@ -257,8 +315,10 @@ void CPUInfo::Detect() { } bBMI2_fast = bBMI2 && (vendor != VENDOR_AMD || family >= 0x19); +#endif } if (max_ex_fn >= 0x80000004) { +#ifndef USE_CPU_FEATURES // Extract brand string do_cpuid(cpu_id, 0x80000002); memcpy(brand_string, cpu_id, sizeof(cpu_id)); @@ -266,13 +326,16 @@ void CPUInfo::Detect() { memcpy(brand_string + 16, cpu_id, sizeof(cpu_id)); do_cpuid(cpu_id, 0x80000004); memcpy(brand_string + 32, cpu_id, sizeof(cpu_id)); +#endif } if (max_ex_fn >= 0x80000001) { // Check for more features. do_cpuid(cpu_id, 0x80000001); if (cpu_id[2] & 1) bLAHFSAHF64 = true; +#ifndef USE_CPU_FEATURES if ((cpu_id[2] >> 6) & 1) bSSE4A = true; if ((cpu_id[2] >> 16) & 1) bFMA4 = true; +#endif if ((cpu_id[2] >> 11) & 1) bXOP = true; // CmpLegacy (bit 2) is deprecated. if ((cpu_id[3] >> 29) & 1) bLongMode = true; @@ -418,34 +481,63 @@ void CPUInfo::Detect() { logical_cpu_count = 1; } -// Turn the cpu info into a string we can show -std::string CPUInfo::Summarize() -{ - std::string sum; - if (num_cores == 1) - sum = StringFromFormat("%s, %d core", cpu_string, num_cores); - else - { - sum = StringFromFormat("%s, %d cores", cpu_string, num_cores); - if (HTT) sum += StringFromFormat(" (%i logical threads per physical core)", logical_cpu_count); +std::vector CPUInfo::Features() { + std::vector features; + + struct Flag { + bool &flag; + const char *str; + }; + const Flag list[] = { + { bSSE, "SSE" }, + { bSSE2, "SSE2" }, + { bSSE3, "SSE3" }, + { bSSSE3, "SSSE3" }, + { bSSE4_1, "SSE4.1" }, + { bSSE4_2, "SSE4.2" }, + { bSSE4A, "SSE4A" }, + { HTT, "HTT" }, + { bAVX, "AVX" }, + { bAVX2, "AVX2" }, + { bFMA3, "FMA3" }, + { bFMA4, "FMA4" }, + { bAES, "AES" }, + { bSHA, "SHA" }, + { bXOP, "XOP" }, + { bRTM, "TSX" }, + { bF16C, "F16C" }, + { bBMI1, "BMI1" }, + { bBMI2, "BMI2" }, + { bPOPCNT, "POPCNT" }, + { bMOVBE, "MOVBE" }, + { bLZCNT, "LZCNT" }, + { bLongMode, "64-bit support" }, + }; + + for (auto &item : list) { + if (item.flag) { + features.push_back(item.str); + } + } + + return features; +} + +// Turn the cpu info into a string we can show +std::string CPUInfo::Summarize() { + std::string sum; + if (num_cores == 1) { + sum = StringFromFormat("%s, %d core", cpu_string, num_cores); + } else { + sum = StringFromFormat("%s, %d cores", cpu_string, num_cores); + if (HTT) + sum += StringFromFormat(" (%i logical threads per physical core)", logical_cpu_count); + } + + auto features = Features(); + for (std::string &feature : features) { + sum += ", " + feature; } - if (bSSE) sum += ", SSE"; - if (bSSE2) sum += ", SSE2"; - if (bSSE3) sum += ", SSE3"; - if (bSSSE3) sum += ", SSSE3"; - if (bSSE4_1) sum += ", SSE4.1"; - if (bSSE4_2) sum += ", SSE4.2"; - if (bSSE4A) sum += ", SSE4A"; - if (HTT) sum += ", HTT"; - if (bAVX) sum += ", AVX"; - if (bAVX2) sum += ", AVX2"; - if (bFMA3) sum += ", FMA3"; - if (bFMA4) sum += ", FMA4"; - if (bAES) sum += ", AES"; - if (bSHA) sum += ", SHA"; - if (bXOP) sum += ", XOP"; - if (bRTM) sum += ", TSX"; - if (bLongMode) sum += ", 64-bit support"; return sum; } diff --git a/Common/CPUDetect.h b/Common/CPUDetect.h index 5d3dd0f3e2..13e1170acc 100644 --- a/Common/CPUDetect.h +++ b/Common/CPUDetect.h @@ -20,6 +20,7 @@ #include "ppsspp_config.h" #include +#include enum CPUVendor { VENDOR_INTEL = 0, @@ -68,6 +69,7 @@ struct CPUInfo { bool bSSE4A; bool bAES; bool bSHA; + bool bF16C; // x86 : SIMD 256 bit bool bAVX; bool bAVX2; @@ -92,6 +94,9 @@ struct CPUInfo { // ARMv8 specific bool bFP; bool bASIMD; + bool bSVE; + bool bSVE2; + bool bFRINT; // MIPS specific bool bXBurst1; @@ -105,6 +110,7 @@ struct CPUInfo { bool RiscV_C; bool RiscV_V; bool RiscV_B; + bool RiscV_Zicsr; // Quirks struct { @@ -120,6 +126,7 @@ struct CPUInfo { explicit CPUInfo(); // Turn the cpu info into a string we can show + std::vector Features(); std::string Summarize(); private: diff --git a/Common/Common.vcxproj b/Common/Common.vcxproj index cf3502c526..c3c1ebebaf 100644 --- a/Common/Common.vcxproj +++ b/Common/Common.vcxproj @@ -1021,6 +1021,9 @@ + + {c249f016-7f82-45cf-bb6e-0642a988c4d3} + {f761046e-6c38-4428-a5f1-38391a37bb34} diff --git a/Common/FakeCPUDetect.cpp b/Common/FakeCPUDetect.cpp index 5845f29ae6..e04ed356ed 100644 --- a/Common/FakeCPUDetect.cpp +++ b/Common/FakeCPUDetect.cpp @@ -53,11 +53,20 @@ void CPUInfo::Detect() logical_cpu_count = 2; } +std::vector CPUInfo::Features() { + std::vector features; + return features; +} + // Turn the cpu info into a string we can show -std::string CPUInfo::Summarize() -{ +std::string CPUInfo::Summarize() { std::string sum; sum = StringFromFormat("%s, %i core", cpu_string, num_cores); + + auto features = Features(); + for (std::string &feature : features) { + sum += ", " + feature; + } return sum; } #endif diff --git a/Common/GPU/OpenGL/GLQueueRunner.cpp b/Common/GPU/OpenGL/GLQueueRunner.cpp index c01eb0425b..63f75af330 100644 --- a/Common/GPU/OpenGL/GLQueueRunner.cpp +++ b/Common/GPU/OpenGL/GLQueueRunner.cpp @@ -1166,17 +1166,20 @@ void GLQueueRunner::PerformRenderPass(const GLRStep &step, bool first, bool last glBindBuffer(GL_ARRAY_BUFFER, buf); curArrayBuffer = buf; } - int enable = layout->semanticsMask_ & ~attrMask; - int disable = (~layout->semanticsMask_) & attrMask; - for (int i = 0; i < 7; i++) { // SEM_MAX - if (enable & (1 << i)) { - glEnableVertexAttribArray(i); - } - if (disable & (1 << i)) { - glDisableVertexAttribArray(i); + if (attrMask != layout->semanticsMask_) { + int enable = layout->semanticsMask_ & ~attrMask; + int disable = (~layout->semanticsMask_) & attrMask; + + for (int i = 0; i < 7; i++) { // SEM_MAX + if (enable & (1 << i)) { + glEnableVertexAttribArray(i); + } + if (disable & (1 << i)) { + glDisableVertexAttribArray(i); + } } + attrMask = layout->semanticsMask_; } - attrMask = layout->semanticsMask_; for (size_t i = 0; i < layout->entries.size(); i++) { auto &entry = layout->entries[i]; glVertexAttribPointer(entry.location, entry.count, entry.type, entry.normalized, entry.stride, (const void *)(c.bindVertexBuffer.offset + entry.offset)); diff --git a/Common/GPU/OpenGL/GLQueueRunner.h b/Common/GPU/OpenGL/GLQueueRunner.h index 593e00f97b..b91648a1fa 100644 --- a/Common/GPU/OpenGL/GLQueueRunner.h +++ b/Common/GPU/OpenGL/GLQueueRunner.h @@ -2,6 +2,7 @@ #include #include +#include #include #include "Common/GPU/OpenGL/GLCommon.h" diff --git a/Common/GPU/OpenGL/GLRenderManager.cpp b/Common/GPU/OpenGL/GLRenderManager.cpp index f66b9b78fc..f0a1cce354 100644 --- a/Common/GPU/OpenGL/GLRenderManager.cpp +++ b/Common/GPU/OpenGL/GLRenderManager.cpp @@ -6,6 +6,7 @@ #include "Common/VR/PPSSPPVR.h" #include "Common/Log.h" +#include "Common/TimeUtil.h" #include "Common/MemoryUtil.h" #include "Common/Math/math_util.h" @@ -112,6 +113,8 @@ void GLDeleter::Perform(GLRenderManager *renderManager, bool skipGLCalls) { } GLRenderManager::~GLRenderManager() { + _dbg_assert_(!run_); + for (int i = 0; i < MAX_INFLIGHT_FRAMES; i++) { _assert_(frameData_[i].deleter.IsEmpty()); _assert_(frameData_[i].deleter_prev.IsEmpty()); @@ -123,7 +126,6 @@ GLRenderManager::~GLRenderManager() { void GLRenderManager::ThreadStart(Draw::DrawContext *draw) { queueRunner_.CreateDeviceObjects(); - threadFrame_ = threadInitFrame_; renderThreadId = std::this_thread::get_id(); if (newInflightFrames_ != -1) { @@ -169,24 +171,16 @@ void GLRenderManager::ThreadStart(Draw::DrawContext *draw) { void GLRenderManager::ThreadEnd() { INFO_LOG(G3D, "ThreadEnd"); - // Wait for any shutdown to complete in StopThread(). - std::unique_lock lock(mutex_); queueRunner_.DestroyDeviceObjects(); - VLOG("PULL: Quitting"); + VLOG(" PULL: Quitting"); - // Good point to run all the deleters to get rid of leftover objects. + // Good time to run all the deleters to get rid of leftover objects. for (int i = 0; i < MAX_INFLIGHT_FRAMES; i++) { // Since we're in shutdown, we should skip the GL calls on Android. frameData_[i].deleter.Perform(this, skipGLCalls_); frameData_[i].deleter_prev.Perform(this, skipGLCalls_); - for (int j = 0; j < (int)frameData_[i].steps.size(); j++) { - delete frameData_[i].steps[j]; - } - frameData_[i].steps.clear(); - frameData_[i].initSteps.clear(); } deleter_.Perform(this, skipGLCalls_); - for (int i = 0; i < (int)steps_.size(); i++) { delete steps_[i]; } @@ -194,104 +188,68 @@ void GLRenderManager::ThreadEnd() { initSteps_.clear(); } +// Unlike in Vulkan, this isn't a full independent function, instead it gets called every frame. +// +// This means that we have to block and run the render queue until we've presented one frame, +// at which point we can leave. +// +// NOTE: If run_ is true, we WILL run a task! bool GLRenderManager::ThreadFrame() { - std::unique_lock lock(mutex_); - if (!run_) + if (!run_) { return false; + } + + GLRRenderThreadTask task; // In case of syncs or other partial completion, we keep going until we complete a frame. - do { - if (nextFrame) { - threadFrame_++; - if (threadFrame_ >= inflightFrames_) - threadFrame_ = 0; - } - FrameData &frameData = frameData_[threadFrame_]; - { - std::unique_lock lock(frameData.pull_mutex); - while (!frameData.readyForRun && run_) { - VLOG("PULL: Waiting for frame[%d].readyForRun", threadFrame_); - frameData.pull_condVar.wait(lock); - } - if (!frameData.readyForRun && !run_) { - // This means we're out of frames to render and run_ is false, so bail. - return false; - } - VLOG("PULL: Setting frame[%d].readyForRun = false", threadFrame_); - frameData.readyForRun = false; - frameData.deleter_prev.Perform(this, skipGLCalls_); - frameData.deleter_prev.Take(frameData.deleter); - // Previously we had a quick exit here that avoided calling Run() if run_ was suddenly false, - // but that created a race condition where frames could end up not finished properly on resize etc. + while (true) { + // Pop a task of the queue and execute it. + // NOTE: We need to actually wait for a task, we can't just bail! - // Only increment next time if we're done. - nextFrame = frameData.type == GLRRunType::END; - _assert_(frameData.type == GLRRunType::END || frameData.type == GLRRunType::SYNC); + { + std::unique_lock lock(pushMutex_); + while (renderThreadQueue_.empty()) { + pushCondVar_.wait(lock); + } + task = renderThreadQueue_.front(); + renderThreadQueue_.pop(); } - VLOG("PULL: Running frame %d", threadFrame_); - if (firstFrame) { - INFO_LOG(G3D, "Running first frame (%d)", threadFrame_); - firstFrame = false; + + // We got a task! We can now have pushMutex_ unlocked, allowing the host to + // push more work when it feels like it, and just start working. + if (task.runType == GLRRunType::EXIT) { + // Oh, host wanted out. Let's leave, and also let's notify the host. + // This is unlike Vulkan too which can just block on the thread existing. + std::unique_lock lock(syncMutex_); + syncCondVar_.notify_one(); + syncDone_ = true; + break; } // Render the scene. - Run(threadFrame_); - - VLOG("PULL: Finished frame %d", threadFrame_); - } while (!nextFrame); + VLOG(" PULL: Frame %d RUN (%0.3f)", task.frame, time_now_d()); + if (Run(task)) { + // Swap requested, so we just bail the loop. + break; + } + }; return true; } void GLRenderManager::StopThread() { - // Since we don't control the thread directly, this will only pause the thread. - + // There's not really a lot to do here anymore. + INFO_LOG(G3D, "GLRenderManager::StopThread()"); if (run_) { run_ = false; - for (int i = 0; i < MAX_INFLIGHT_FRAMES; i++) { - auto &frameData = frameData_[i]; - { - std::unique_lock lock(frameData.push_mutex); - frameData.push_condVar.notify_all(); - } - { - std::unique_lock lock(frameData.pull_mutex); - frameData.pull_condVar.notify_all(); - } - } - // Wait until we've definitely stopped the threadframe. - std::unique_lock lock(mutex_); - - INFO_LOG(G3D, "GL submission thread paused. Frame=%d", curFrame_); - - // Eat whatever has been queued up for this frame if anything. - Wipe(); - - // Wait for any fences to finish and be resignaled, so we don't have sync issues. - // Also clean out any queued data, which might refer to things that might not be valid - // when we restart... - for (int i = 0; i < MAX_INFLIGHT_FRAMES; i++) { - auto &frameData = frameData_[i]; - std::unique_lock lock(frameData.push_mutex); - if (frameData.readyForRun || frameData.steps.size() != 0) { - Crash(); - } - frameData.readyForRun = false; - frameData.readyForSubmit = false; - for (size_t i = 0; i < frameData.steps.size(); i++) { - delete frameData.steps[i]; - } - frameData.steps.clear(); - frameData.initSteps.clear(); - - while (!frameData.readyForFence) { - VLOG("PUSH: Waiting for frame[%d].readyForFence = 1 (stop)", i); - frameData.push_condVar.wait(lock); - } - } + std::unique_lock lock(pushMutex_); + GLRRenderThreadTask exitTask{}; + exitTask.runType = GLRRunType::EXIT; + renderThreadQueue_.push(exitTask); + pushCondVar_.notify_one(); } else { - INFO_LOG(G3D, "GL submission thread was already paused."); + WARN_LOG(G3D, "GL submission thread was already paused."); } } @@ -450,60 +408,51 @@ void GLRenderManager::CopyImageToMemorySync(GLRTexture *texture, int mipLevel, i } void GLRenderManager::BeginFrame() { - VLOG("BeginFrame"); - #ifdef _DEBUG curProgram_ = nullptr; #endif int curFrame = GetCurFrame(); - FrameData &frameData = frameData_[curFrame]; - // Make sure the very last command buffer from the frame before the previous has been fully executed. + FrameData &frameData = frameData_[curFrame]; { - std::unique_lock lock(frameData.push_mutex); + VLOG("PUSH: BeginFrame (curFrame = %d, readyForFence = %d, time=%0.3f)", curFrame, (int)frameData.readyForFence, time_now_d()); + std::unique_lock lock(frameData.fenceMutex); while (!frameData.readyForFence) { - VLOG("PUSH: Waiting for frame[%d].readyForFence = 1", curFrame); - frameData.push_condVar.wait(lock); + frameData.fenceCondVar.wait(lock); } frameData.readyForFence = false; - frameData.readyForSubmit = true; } - VLOG("PUSH: Fencing %d", curFrame); - - // glFenceSync(&frameData.fence...) - - // Must be after the fence - this performs deletes. - VLOG("PUSH: BeginFrame %d", curFrame); if (!run_) { WARN_LOG(G3D, "BeginFrame while !run_!"); } - // vulkan_->BeginFrame(); - // In GL, we have to do deletes on the submission thread. - insideFrame_ = true; } void GLRenderManager::Finish() { - curRenderStep_ = nullptr; + curRenderStep_ = nullptr; // EndCurRenderStep is this simple here. + int curFrame = GetCurFrame(); FrameData &frameData = frameData_[curFrame]; - { - std::unique_lock lock(frameData.pull_mutex); - VLOG("PUSH: Frame[%d].readyForRun = true, notifying pull", curFrame); - frameData.steps = std::move(steps_); - steps_.clear(); - frameData.initSteps = std::move(initSteps_); - initSteps_.clear(); - frameData.readyForRun = true; - frameData.type = GLRRunType::END; - frameData_[curFrame_].deleter.Take(deleter_); - } - // Notify calls do not in fact need to be done with the mutex locked. - frameData.pull_condVar.notify_all(); + frameData_[curFrame].deleter.Take(deleter_); + + VLOG("PUSH: Finish, pushing task. curFrame = %d", curFrame); + GLRRenderThreadTask task; + task.frame = curFrame; + task.runType = GLRRunType::PRESENT; + + { + std::unique_lock lock(pushMutex_); + renderThreadQueue_.push(task); + renderThreadQueue_.back().initSteps = std::move(initSteps_); + renderThreadQueue_.back().steps = std::move(steps_); + initSteps_.clear(); + steps_.clear(); + pushCondVar_.notify_one(); + } curFrame_++; if (curFrame_ >= inflightFrames_) @@ -512,65 +461,19 @@ void GLRenderManager::Finish() { insideFrame_ = false; } -void GLRenderManager::BeginSubmitFrame(int frame) { - FrameData &frameData = frameData_[frame]; +// Render thread. Returns true if the caller should handle a swap. +bool GLRenderManager::Run(GLRRenderThreadTask &task) { + FrameData &frameData = frameData_[task.frame]; + if (!frameData.hasBegun) { frameData.hasBegun = true; + + frameData.deleter_prev.Perform(this, skipGLCalls_); + frameData.deleter_prev.Take(frameData.deleter); } -} -// Render thread -void GLRenderManager::Submit(int frame, bool triggerFence) { - FrameData &frameData = frameData_[frame]; - - // In GL, submission happens automatically in Run(). - - // When !triggerFence, we notify after syncing with Vulkan. - - if (triggerFence) { - VLOG("PULL: Frame %d.readyForFence = true", frame); - - std::unique_lock lock(frameData.push_mutex); - _assert_(frameData.readyForSubmit); - frameData.readyForFence = true; - frameData.readyForSubmit = false; - frameData.push_condVar.notify_all(); - } -} - -// Render thread -void GLRenderManager::EndSubmitFrame(int frame) { - FrameData &frameData = frameData_[frame]; - frameData.hasBegun = false; - - Submit(frame, true); - - if (!frameData.skipSwap) { - if (swapIntervalChanged_) { - swapIntervalChanged_ = false; - if (swapIntervalFunction_) { - swapIntervalFunction_(swapInterval_); - } - } - if (swapFunction_) { - swapFunction_(); - } - } else { - frameData.skipSwap = false; - } -} - -// Render thread -void GLRenderManager::Run(int frame) { - BeginSubmitFrame(frame); - - FrameData &frameData = frameData_[frame]; - - auto &stepsOnThread = frameData_[frame].steps; - auto &initStepsOnThread = frameData_[frame].initSteps; // queueRunner_.LogSteps(stepsOnThread); - queueRunner_.RunInitSteps(initStepsOnThread, skipGLCalls_); - initStepsOnThread.clear(); + queueRunner_.RunInitSteps(task.initSteps, skipGLCalls_); // Run this after RunInitSteps so any fresh GLRBuffers for the pushbuffers can get created. if (!skipGLCalls_) { @@ -584,13 +487,12 @@ void GLRenderManager::Run(int frame) { int passes = GetVRPassesCount(); for (int i = 0; i < passes; i++) { PreVRFrameRender(i); - queueRunner_.RunSteps(stepsOnThread, skipGLCalls_, i < passes - 1, true); + queueRunner_.RunSteps(task.steps, skipGLCalls_, i < passes - 1, true); PostVRFrameRender(); } } else { - queueRunner_.RunSteps(stepsOnThread, skipGLCalls_, false, false); + queueRunner_.RunSteps(task.steps, skipGLCalls_, false, false); } - stepsOnThread.clear(); if (!skipGLCalls_) { for (auto iter : frameData.activePushBuffers) { @@ -598,89 +500,88 @@ void GLRenderManager::Run(int frame) { } } - switch (frameData.type) { - case GLRRunType::END: - EndSubmitFrame(frame); + bool swapRequest = false; + + switch (task.runType) { + case GLRRunType::PRESENT: + if (!frameData.skipSwap) { + if (swapIntervalChanged_) { + swapIntervalChanged_ = false; + if (swapIntervalFunction_) { + swapIntervalFunction_(swapInterval_); + } + } + // This is the swapchain framebuffer flip. + if (swapFunction_) { + VLOG(" PULL: SwapFunction()"); + swapFunction_(); + if (!retainControl_) { + // get out of here. + swapRequest = true; + } + } else { + VLOG(" PULL: SwapRequested"); + swapRequest = true; + } + } else { + frameData.skipSwap = false; + } + frameData.hasBegun = false; + + VLOG(" PULL: Frame %d.readyForFence = true", task.frame); + + { + std::lock_guard lock(frameData.fenceMutex); + frameData.readyForFence = true; + frameData.fenceCondVar.notify_one(); + // At this point, we're done with this framedata (for now). + } + break; case GLRRunType::SYNC: - EndSyncFrame(frame); + frameData.hasBegun = false; + + // glFinish is not actually necessary here, and won't be unless we start using + // glBufferStorage. Then we need to use fences. + { + std::unique_lock lock(syncMutex_); + syncDone_ = true; + syncCondVar_.notify_one(); + } break; default: _assert_(false); } - - VLOG("PULL: Finished running frame %d", frame); + VLOG(" PULL: ::Run(): Done running tasks"); + return swapRequest; } void GLRenderManager::FlushSync() { - int curFrame = curFrame_; - FrameData &frameData = frameData_[curFrame]; { - std::unique_lock lock(frameData.pull_mutex); - VLOG("PUSH: Frame[%d].readyForRun = true (sync)", curFrame); - frameData.initSteps = std::move(initSteps_); - initSteps_.clear(); - frameData.steps = std::move(steps_); + VLOG("PUSH: Frame[%d].readyForRun = true (sync)", curFrame_); + + GLRRenderThreadTask task; + task.frame = curFrame_; + task.runType = GLRRunType::SYNC; + + std::unique_lock lock(pushMutex_); + renderThreadQueue_.push(task); + renderThreadQueue_.back().initSteps = std::move(initSteps_); + renderThreadQueue_.back().steps = std::move(steps_); + pushCondVar_.notify_one(); steps_.clear(); - frameData.readyForRun = true; - _assert_(frameData.readyForFence == false); - frameData.type = GLRRunType::SYNC; - frameData.pull_condVar.notify_all(); } + { - std::unique_lock lock(frameData.push_mutex); + std::unique_lock lock(syncMutex_); // Wait for the flush to be hit, since we're syncing. - while (!frameData.readyForFence) { - VLOG("PUSH: Waiting for frame[%d].readyForFence = 1 (sync)", curFrame); - frameData.push_condVar.wait(lock); - } - frameData.readyForFence = false; - frameData.readyForSubmit = true; - } -} - -// Render thread -void GLRenderManager::EndSyncFrame(int frame) { - FrameData &frameData = frameData_[frame]; - Submit(frame, false); - - // glFinish is not actually necessary here, and won't be until we start using - // glBufferStorage. Then we need to use fences. - // glFinish(); - - // At this point we can resume filling the command buffers for the current frame since - // we know the device is idle - and thus all previously enqueued command buffers have been processed. - // No need to switch to the next frame number. - - { - std::unique_lock lock(frameData.push_mutex); - frameData.readyForFence = true; - frameData.readyForSubmit = true; - frameData.push_condVar.notify_all(); - } -} - -void GLRenderManager::Wipe() { - initSteps_.clear(); - for (auto step : steps_) { - delete step; - } - steps_.clear(); -} - -void GLRenderManager::WaitUntilQueueIdle() { - // Just wait for all frames to be ready. - for (int i = 0; i < MAX_INFLIGHT_FRAMES; i++) { - FrameData &frameData = frameData_[i]; - - std::unique_lock lock(frameData.push_mutex); - // Ignore unsubmitted frames. - while (!frameData.readyForFence && frameData.readyForRun) { - VLOG("PUSH: Waiting for frame[%d].readyForFence = 1 (wait idle)", i); - frameData.push_condVar.wait(lock); + while (!syncDone_) { + VLOG("PUSH: Waiting for frame[%d].readyForFence = 1 (sync)", curFrame_); + syncCondVar_.wait(lock); } + syncDone_ = false; } } diff --git a/Common/GPU/OpenGL/GLRenderManager.h b/Common/GPU/OpenGL/GLRenderManager.h index 2a7c290f37..2d213be8b8 100644 --- a/Common/GPU/OpenGL/GLRenderManager.h +++ b/Common/GPU/OpenGL/GLRenderManager.h @@ -7,6 +7,7 @@ #include #include #include +#include #include #include "Common/GPU/OpenGL/GLCommon.h" @@ -349,11 +350,29 @@ private: GLBufferStrategy strategy_ = GLBufferStrategy::SUBDATA; }; -enum class GLRRunType { - END, - SYNC, +class GLRInputLayout { +public: + struct Entry { + int location; + int count; + GLenum type; + GLboolean normalized; + int stride; + intptr_t offset; + }; + std::vector entries; + int semanticsMask_ = 0; }; +enum class GLRRunType { + PRESENT, + SYNC, + EXIT, +}; + +class GLRenderManager; +class GLPushBuffer; + class GLDeleter { public: void Perform(GLRenderManager *renderManager, bool skipGLCalls); @@ -373,18 +392,14 @@ public: std::vector pushBuffers; }; -class GLRInputLayout { -public: - struct Entry { - int location; - int count; - GLenum type; - GLboolean normalized; - int stride; - intptr_t offset; - }; - std::vector entries; - int semanticsMask_ = 0; +// These are enqueued from the main thread, +// and the render thread pops them off +struct GLRRenderThreadTask { + std::vector steps; + std::vector initSteps; + + int frame; + GLRRunType runType; }; // Note: The GLRenderManager is created and destroyed on the render thread, and the latter @@ -395,9 +410,15 @@ public: GLRenderManager() {} ~GLRenderManager(); + void SetInvalidationCallback(InvalidationCallback callback) { invalidationCallback_ = callback; } + + void ThreadStart(Draw::DrawContext *draw); + void ThreadEnd(); + bool ThreadFrame(); // Returns true if it did anything. False means the queue was empty. + void SetErrorCallback(ErrorCallbackFn callback, void *userdata) { queueRunner_.SetErrorCallback(callback, userdata); } @@ -406,27 +427,17 @@ public: caps_ = caps; } - void ThreadStart(Draw::DrawContext *draw); - void ThreadEnd(); - bool ThreadFrame(); // Returns false to request exiting the loop. - // Makes sure that the GPU has caught up enough that we can start writing buffers of this frame again. void BeginFrame(); // Can run on a different thread! - void Finish(); - void Run(int frame); - - // Zaps queued up commands. Use if you know there's a risk you've queued up stuff that has already been deleted. Can happen during in-game shutdown. - void Wipe(); - - // Wait until no frames are pending. Use during shutdown before freeing pointers. - void WaitUntilQueueIdle(); + void Finish(); + bool Run(GLRRenderThreadTask &task); // Creation commands. These were not needed in Vulkan since there we can do that on the main thread. // We pass in width/height here even though it's not strictly needed until we support glTextureStorage // and then we'll also need formats and stuff. GLRTexture *CreateTexture(GLenum target, int width, int height, int depth, int numMips) { - GLRInitStep step{ GLRInitStepType::CREATE_TEXTURE }; + GLRInitStep step { GLRInitStepType::CREATE_TEXTURE }; step.create_texture.texture = new GLRTexture(caps_, width, height, depth, numMips); step.create_texture.texture->target = target; initSteps_.push_back(step); @@ -981,8 +992,9 @@ public: _dbg_assert_(foundCount == 1); } - void SetSwapFunction(std::function swapFunction) { + void SetSwapFunction(std::function swapFunction, bool retainControl) { swapFunction_ = swapFunction; + retainControl_ = retainControl; } void SetSwapIntervalFunction(std::function swapIntervalFunction) { @@ -1014,13 +1026,8 @@ public: } private: - void BeginSubmitFrame(int frame); - void EndSubmitFrame(int frame); - void Submit(int frame, bool triggerFence); - // Bad for performance but sometimes necessary for synchronous CPU readbacks (screenshots and whatnot). void FlushSync(); - void EndSyncFrame(int frame); // When using legacy functionality for push buffers (glBufferData), we need to flush them // before actually making the glDraw* calls. It's best if the render manager handles that. @@ -1030,26 +1037,14 @@ private: // Per-frame data, round-robin so we can overlap submission with execution of the previous frame. struct FrameData { - std::mutex push_mutex; - std::condition_variable push_condVar; - - std::mutex pull_mutex; - std::condition_variable pull_condVar; - - bool readyForFence = true; - bool readyForRun = false; - bool readyForSubmit = false; - bool skipSwap = false; - GLRRunType type = GLRRunType::END; - // GLuint fence; For future AZDO stuff? - std::vector steps; - std::vector initSteps; + std::mutex fenceMutex; + std::condition_variable fenceCondVar; + bool readyForFence = true; // Swapchain. bool hasBegun = false; - uint32_t curSwapchainImage = -1; GLDeleter deleter; GLDeleter deleter_prev; @@ -1067,16 +1062,23 @@ private: // Execution time state bool run_ = true; + // Thread is managed elsewhere, and should call ThreadFrame. - std::mutex mutex_; - int threadInitFrame_ = 0; GLQueueRunner queueRunner_; - // Thread state - int threadFrame_ = -1; + // For pushing data on the queue. + std::mutex pushMutex_; + std::condition_variable pushCondVar_; - bool nextFrame = false; - bool firstFrame = true; + std::queue renderThreadQueue_; + + // For readbacks and other reasons we need to sync with the render thread. + std::mutex syncMutex_; + std::condition_variable syncCondVar_; + + bool firstFrame_ = true; + bool vrRenderStarted_ = false; + bool syncDone_ = false; GLDeleter deleter_; bool skipGLCalls_ = false; @@ -1085,6 +1087,7 @@ private: std::function swapFunction_; std::function swapIntervalFunction_; + bool retainControl_ = false; GLBufferStrategy bufferStrategy_ = GLBufferStrategy::SUBDATA; int inflightFrames_ = MAX_INFLIGHT_FRAMES; diff --git a/Common/GPU/OpenGL/thin3d_gl.cpp b/Common/GPU/OpenGL/thin3d_gl.cpp index a251db1e0c..480f0cc3bb 100644 --- a/Common/GPU/OpenGL/thin3d_gl.cpp +++ b/Common/GPU/OpenGL/thin3d_gl.cpp @@ -212,7 +212,6 @@ GLuint ShaderStageToOpenGL(ShaderStage stage) { class OpenGLShaderModule : public ShaderModule { public: OpenGLShaderModule(GLRenderManager *render, ShaderStage stage, const std::string &tag) : render_(render), stage_(stage), tag_(tag) { - DEBUG_LOG(G3D, "Shader module created (%p)", this); glstage_ = ShaderStageToOpenGL(stage); } diff --git a/Common/GPU/Vulkan/VulkanRenderManager.cpp b/Common/GPU/Vulkan/VulkanRenderManager.cpp index 63cf2e109a..2863dff087 100644 --- a/Common/GPU/Vulkan/VulkanRenderManager.cpp +++ b/Common/GPU/Vulkan/VulkanRenderManager.cpp @@ -1197,11 +1197,11 @@ void VulkanRenderManager::Finish() { int curFrame = vulkan_->GetCurFrame(); FrameData &frameData = frameData_[curFrame]; + VLOG("PUSH: Frame[%d]", curFrame); + VKRRenderThreadTask task; + task.frame = curFrame; + task.runType = VKRRunType::PRESENT; { - VLOG("PUSH: Frame[%d]", curFrame); - VKRRenderThreadTask task; - task.frame = curFrame; - task.runType = VKRRunType::PRESENT; std::unique_lock lock(pushMutex_); renderThreadQueue_.push(task); renderThreadQueue_.back().steps = std::move(steps_); @@ -1327,7 +1327,7 @@ void VulkanRenderManager::FlushSync() { std::unique_lock lock(syncMutex_); // Wait for the flush to be hit, since we're syncing. while (!frameData.syncDone) { - VLOG("PUSH: Waiting for frame[%d].readyForFence = 1 (sync)", curFrame); + VLOG("PUSH: Waiting for frame[%d].syncDone = 1 (sync)", curFrame); syncCondVar_.wait(lock); } frameData.syncDone = false; diff --git a/Common/GPU/Vulkan/thin3d_vulkan.cpp b/Common/GPU/Vulkan/thin3d_vulkan.cpp index bba23a25e4..7046121f20 100644 --- a/Common/GPU/Vulkan/thin3d_vulkan.cpp +++ b/Common/GPU/Vulkan/thin3d_vulkan.cpp @@ -198,7 +198,6 @@ public: const std::string &GetSource() const { return source_; } ~VKShaderModule() { if (module_) { - DEBUG_LOG(G3D, "Queueing %s (shmodule %p) for release", tag_.c_str(), module_); VkShaderModule shaderModule = module_->BlockUntilReady(); vulkan_->Delete().QueueDeleteShaderModule(shaderModule); vulkan_->Delete().QueueCallback([](VulkanContext *context, void *m) { @@ -213,7 +212,7 @@ public: } private: - VulkanContext *vulkan_; + VulkanContext *vulkan_ = nullptr; Promise *module_ = nullptr; VkShaderStageFlagBits vkstage_; bool ok_ = false; @@ -268,7 +267,6 @@ public: vkrDesc = new VKRGraphicsPipelineDesc(); } ~VKPipeline() { - DEBUG_LOG(G3D, "Queueing %s (pipeline) for release", tag_.c_str()); if (pipeline) { pipeline->QueueForDeletion(vulkan_); } diff --git a/Common/Input/InputState.cpp b/Common/Input/InputState.cpp index 06f31807ec..743da0f454 100644 --- a/Common/Input/InputState.cpp +++ b/Common/Input/InputState.cpp @@ -23,6 +23,7 @@ const char *GetDeviceName(int deviceId) { case DEVICE_ID_XINPUT_3: return "x360_4"; case DEVICE_ID_ACCELEROMETER: return "accelerometer"; case DEVICE_ID_MOUSE: return "mouse"; + case DEVICE_ID_XR_HMD: return "xr_hmd"; case DEVICE_ID_XR_CONTROLLER_LEFT: return "xr_l"; case DEVICE_ID_XR_CONTROLLER_RIGHT: return "xr_r"; default: diff --git a/Common/Input/InputState.h b/Common/Input/InputState.h index f5d43e209d..cc27b8dfe8 100644 --- a/Common/Input/InputState.h +++ b/Common/Input/InputState.h @@ -31,6 +31,7 @@ enum { DEVICE_ID_XINPUT_2 = 22, DEVICE_ID_XINPUT_3 = 23, DEVICE_ID_ACCELEROMETER = 30, + DEVICE_ID_XR_HMD = 39, DEVICE_ID_XR_CONTROLLER_LEFT = 40, DEVICE_ID_XR_CONTROLLER_RIGHT = 41, DEVICE_ID_TOUCH = 42, diff --git a/Common/Input/KeyCodes.h b/Common/Input/KeyCodes.h index 7fa13de58b..e7ebdee2a2 100644 --- a/Common/Input/KeyCodes.h +++ b/Common/Input/KeyCodes.h @@ -263,13 +263,19 @@ typedef enum _keycode_t { NKCODE_EXT_MOUSEWHEEL_UP = 1008, NKCODE_EXT_MOUSEWHEEL_DOWN = 1009, - // Virtual reality controller motion + // Virtual reality motion NKCODE_EXT_MOTION_UP = 1101, NKCODE_EXT_MOTION_DOWN = 1102, NKCODE_EXT_MOTION_LEFT = 1103, NKCODE_EXT_MOTION_RIGHT = 1104, NKCODE_EXT_MOTION_FORWARD = 1105, + // Virtual reality rotation + NKCODE_EXT_ROTATION_UP = 1111, + NKCODE_EXT_ROTATION_DOWN = 1112, + NKCODE_EXT_ROTATION_LEFT = 1113, + NKCODE_EXT_ROTATION_RIGHT = 1114, + NKCODE_MAX } keycode_t; diff --git a/Common/MipsCPUDetect.cpp b/Common/MipsCPUDetect.cpp index 1fd93e29b1..c569d15d94 100644 --- a/Common/MipsCPUDetect.cpp +++ b/Common/MipsCPUDetect.cpp @@ -197,6 +197,28 @@ void CPUInfo::Detect() #endif } +std::vector CPUInfo::Features() { + std::vector features; + + struct Flag { + bool &flag; + const char *str; + }; + const Flag list[] = { + { bXBurst1, "XBurst1" }, + { bXBurst2, "XBurst2" }, + { CPU64bit, "64-bit" }, + }; + + for (auto &item : list) { + if (item.flag) { + features.push_back(item.str); + } + } + + return features; +} + // Turn the cpu info into a string we can show std::string CPUInfo::Summarize() { @@ -205,10 +227,11 @@ std::string CPUInfo::Summarize() sum = StringFromFormat("%s, %i core", cpu_string, num_cores); else sum = StringFromFormat("%s, %i cores", cpu_string, num_cores); - if (bXBurst1) sum += ", XBurst1"; - if (bXBurst2) sum += ", XBurst2"; - if (CPU64bit) sum += ", 64-bit"; + auto features = Features(); + for (std::string &feature : features) { + sum += ", " + feature; + } return sum; } diff --git a/Common/Net/HTTPHeaders.h b/Common/Net/HTTPHeaders.h index 5900b01874..b91b376411 100644 --- a/Common/Net/HTTPHeaders.h +++ b/Common/Net/HTTPHeaders.h @@ -18,11 +18,12 @@ public: // Public variables since it doesn't make sense // to bother with accessors for all these. int status = 100; - // Intentional misspelling. - char *referer = nullptr; + + char *referer = nullptr; // Intentional misspelling. char *user_agent = nullptr; char *resource = nullptr; char *params = nullptr; + int content_length = -1; std::unordered_map other; enum RequestType { diff --git a/Common/Net/HTTPServer.cpp b/Common/Net/HTTPServer.cpp index e56a5b9a6a..e1fa53bc6e 100644 --- a/Common/Net/HTTPServer.cpp +++ b/Common/Net/HTTPServer.cpp @@ -81,7 +81,7 @@ Request::~Request() { } delete in_; if (!out_->Empty()) { - ERROR_LOG(IO, "Output not empty - connection abort?"); + ERROR_LOG(IO, "Output not empty - connection abort? (%s)", this->header_.resource); } delete out_; } diff --git a/Common/Net/NetBuffer.cpp b/Common/Net/NetBuffer.cpp index 4309f18d05..17a5aae916 100644 --- a/Common/Net/NetBuffer.cpp +++ b/Common/Net/NetBuffer.cpp @@ -37,8 +37,9 @@ bool Buffer::FlushSocket(uintptr_t sock, double timeout, bool *cancelled) { } } int sent = send(sock, &data_[pos], (int)(end - pos), MSG_NOSIGNAL); + // TODO: Do we need some retry logic here, instead of just giving up? if (sent < 0) { - ERROR_LOG(IO, "FlushSocket failed"); + ERROR_LOG(IO, "FlushSocket failed to send: %d", errno); return false; } pos += sent; diff --git a/Common/RiscVCPUDetect.cpp b/Common/RiscVCPUDetect.cpp index 912c4f3e49..dfcaf74618 100644 --- a/Common/RiscVCPUDetect.cpp +++ b/Common/RiscVCPUDetect.cpp @@ -18,6 +18,12 @@ #include "ppsspp_config.h" #if PPSSPP_ARCH(RISCV64) +#include "ext/cpu_features/include/cpuinfo_riscv.h" + +#if defined(CPU_FEATURES_OS_LINUX) +#define USE_CPU_FEATURES 1 +#endif + #include #include #include @@ -174,20 +180,63 @@ void CPUInfo::Detect() RiscV_C = ExtensionSupported(hwcap, 'C'); RiscV_V = ExtensionSupported(hwcap, 'V'); RiscV_B = ExtensionSupported(hwcap, 'B'); + // Let's assume for now... + RiscV_Zicsr = RiscV_M && RiscV_A && RiscV_F && RiscV_D; + +#ifdef USE_CPU_FEATURES + cpu_features::RiscvInfo info = cpu_features::GetRiscvInfo(); + CPU64bit = info.features.RV64I; + RiscV_M = info.features.M; + RiscV_A = info.features.A; + RiscV_F = info.features.F; + RiscV_D = info.features.D; + RiscV_C = info.features.C; + RiscV_Zicsr = info.features.Zicsr; + + truncate_cpy(brand_string, info.uarch); +#endif +} + +std::vector CPUInfo::Features() { + std::vector features; + + struct Flag { + bool &flag; + const char *str; + }; + const Flag list[] = { + { RiscV_M, "Muldiv" }, + { RiscV_A, "Atomic" }, + { RiscV_F, "Float" }, + { RiscV_D, "Double" }, + { RiscV_C, "Compressed" }, + { RiscV_V, "Vector" }, + { RiscV_B, "Bitmanip" }, + { RiscV_Zicsr, "Zicsr" }, + { CPU64bit, "64-bit" }, + }; + + for (auto &item : list) { + if (item.flag) { + features.push_back(item.str); + } + } + + return features; } // Turn the cpu info into a string we can show -std::string CPUInfo::Summarize() -{ +std::string CPUInfo::Summarize() { std::string sum; if (num_cores == 1) sum = StringFromFormat("%s, %i core", cpu_string, num_cores); else sum = StringFromFormat("%s, %i cores", cpu_string, num_cores); - if (CPU64bit) sum += ", 64-bit"; - - //TODO: parse "isa : rv64imafdc" from /proc/cpuinfo + auto features = Features(); + for (std::string &feature : features) { + sum += ", " + feature; + } return sum; } diff --git a/Common/RiscVEmitter.cpp b/Common/RiscVEmitter.cpp index 611c969889..bbac844fdc 100644 --- a/Common/RiscVEmitter.cpp +++ b/Common/RiscVEmitter.cpp @@ -50,8 +50,7 @@ static inline bool SupportsAtomic() { } static inline bool SupportsZicsr() { - // TODO - return false; + return cpu_info.RiscV_Zicsr; } static inline bool SupportsVector() { @@ -63,6 +62,11 @@ static inline bool SupportsBitmanip(char zbx) { return cpu_info.RiscV_B; } +static inline bool SupportsFloatHalf(bool allowMin = false) { + // TODO + return false; +} + enum class Opcode32 { // Note: invalid, just used for FixupBranch. ZERO = 0b0000000, @@ -227,6 +231,7 @@ enum class Funct3 { enum class Funct2 { S = 0b00, D = 0b01, + H = 0b10, Q = 0b11, C_SRLI = 0b00, @@ -875,10 +880,13 @@ static inline u16 EncodeCJ(Opcode16 op, s32 simm12, Funct3 funct3) { return (u16)op | (imm11_4_9_8_10_6_7_3_2_1_5 << 2) | ((u16)funct3 << 13); } -static inline Funct3 BitsToFunct3(int bits, bool useFloat = false) { +static inline Funct3 BitsToFunct3(int bits, bool useFloat = false, bool allowHalfMin = false) { int bitsSupported = useFloat ? FloatBitsSupported() : BitsSupported(); _assert_msg_(bitsSupported >= bits, "Cannot use funct3 width %d, only have %d", bits, bitsSupported); switch (bits) { + case 16: + _assert_msg_(SupportsFloatHalf(allowHalfMin), "Cannot use width 16 without Zfh/Zfhmin"); + return Funct3::LS_H; case 32: return Funct3::LS_W; case 64: @@ -889,9 +897,12 @@ static inline Funct3 BitsToFunct3(int bits, bool useFloat = false) { } } -static inline Funct2 BitsToFunct2(int bits) { +static inline Funct2 BitsToFunct2(int bits, bool allowHalfMin = false) { _assert_msg_(FloatBitsSupported() >= bits, "Cannot use funct2 width %d, only have %d", bits, FloatBitsSupported()); switch (bits) { + case 16: + _assert_msg_(SupportsFloatHalf(allowHalfMin), "Cannot use width 16 without Zfh/Zfhmin"); + return Funct2::H; case 32: return Funct2::S; case 64: @@ -916,6 +927,9 @@ static inline int FConvToFloatBits(FConv c) { return 32; case FConv::D: return 64; + case FConv::H: + _assert_msg_(SupportsFloatHalf(true), "Cannot use width 16 without Zfh/Zfhmin"); + return 16; case FConv::Q: return 128; } @@ -926,6 +940,7 @@ static inline int FConvToIntegerBits(FConv c) { switch (c) { case FConv::S: case FConv::D: + case FConv::H: case FConv::Q: break; @@ -1976,7 +1991,7 @@ void RiscVEmitter::FL(int bits, RiscVReg rd, RiscVReg rs1, s32 simm12) { } } - Write32(EncodeI(Opcode32::LOAD_FP, rd, BitsToFunct3(bits, true), rs1, simm12)); + Write32(EncodeI(Opcode32::LOAD_FP, rd, BitsToFunct3(bits, true, true), rs1, simm12)); } void RiscVEmitter::FS(int bits, RiscVReg rs2, RiscVReg rs1, s32 simm12) { @@ -2000,7 +2015,7 @@ void RiscVEmitter::FS(int bits, RiscVReg rs2, RiscVReg rs1, s32 simm12) { } } - Write32(EncodeS(Opcode32::STORE_FP, BitsToFunct3(bits, true), rs1, rs2, simm12)); + Write32(EncodeS(Opcode32::STORE_FP, BitsToFunct3(bits, true, true), rs1, rs2, simm12)); } void RiscVEmitter::FMADD(int bits, RiscVReg rd, RiscVReg rs1, RiscVReg rs2, RiscVReg rs3, Round rm) { @@ -2069,8 +2084,8 @@ void RiscVEmitter::FCVT(FConv to, FConv from, RiscVReg rd, RiscVReg rs1, Round r if (integerBits == 0) { // Convert between float widths. - Funct2 fromFmt = BitsToFunct2(FConvToFloatBits(from)); - Funct2 toFmt = BitsToFunct2(FConvToFloatBits(to)); + Funct2 fromFmt = BitsToFunct2(FConvToFloatBits(from), true); + Funct2 toFmt = BitsToFunct2(FConvToFloatBits(to), true); if (FConvToFloatBits(to) > FConvToFloatBits(from)) { _assert_msg_(rm == Round::DYNAMIC || rm == Round::NEAREST_EVEN, "Invalid rounding mode for widening FCVT"); rm = Round::NEAREST_EVEN; @@ -2090,6 +2105,7 @@ void RiscVEmitter::FMV(FMv to, FMv from, RiscVReg rd, RiscVReg rs1) { switch (to == FMv::X ? from : to) { case FMv::D: bits = 64; break; case FMv::W: bits = 32; break; + case FMv::H: bits = 16; break; case FMv::X: bits = 0; break; } @@ -2099,7 +2115,7 @@ void RiscVEmitter::FMV(FMv to, FMv from, RiscVReg rd, RiscVReg rs1) { _assert_msg_(from == FMv::X ? IsGPR(rs1) : IsFPR(rs1), "%s rs1 of wrong type", __func__); Funct5 funct5 = to == FMv::X ? Funct5::FMV_TOX : Funct5::FMV_FROMX; - Write32(EncodeR(Opcode32::OP_FP, rd, Funct3::FMV, rs1, F0, BitsToFunct2(bits), funct5)); + Write32(EncodeR(Opcode32::OP_FP, rd, Funct3::FMV, rs1, F0, BitsToFunct2(bits, true), funct5)); } void RiscVEmitter::FEQ(int bits, RiscVReg rd, RiscVReg rs1, RiscVReg rs2) { diff --git a/Common/RiscVEmitter.h b/Common/RiscVEmitter.h index bcdd2e9107..5e9b0b9f16 100644 --- a/Common/RiscVEmitter.h +++ b/Common/RiscVEmitter.h @@ -90,11 +90,13 @@ enum class FConv { S = 0x1000, D = 0x1001, + H = 0x1002, Q = 0x1003, }; enum class FMv { X, + H, W, D, }; diff --git a/Common/Thread/ThreadManager.cpp b/Common/Thread/ThreadManager.cpp index 8e7669f888..9e87c1cfd6 100644 --- a/Common/Thread/ThreadManager.cpp +++ b/Common/Thread/ThreadManager.cpp @@ -217,6 +217,16 @@ void ThreadManager::Init(int numRealCores, int numLogicalCoresPerCpu) { } void ThreadManager::EnqueueTask(Task *task) { + if (task->Type() == TaskType::DEDICATED_THREAD) { + std::thread th([=](Task *task) { + SetCurrentThreadName("DedicatedThreadTask"); + task->Run(); + task->Release(); + }, task); + th.detach(); + return; + } + _assert_msg_(IsInitialized(), "ThreadManager not initialized"); int minThread; @@ -270,6 +280,8 @@ void ThreadManager::EnqueueTask(Task *task) { } void ThreadManager::EnqueueTaskOnThread(int threadNum, Task *task) { + _assert_msg_(task->Type() != TaskType::DEDICATED_THREAD, "Dedicated thread tasks can't be put on specific threads"); + _assert_msg_(threadNum >= 0 && threadNum < (int)global_->threads_.size(), "Bad threadnum or not initialized"); ThreadContext *thread = global_->threads_[threadNum]; diff --git a/Common/Thread/ThreadManager.h b/Common/Thread/ThreadManager.h index 69716bd94a..45d1974871 100644 --- a/Common/Thread/ThreadManager.h +++ b/Common/Thread/ThreadManager.h @@ -8,6 +8,7 @@ enum class TaskType { CPU_COMPUTE, IO_BLOCKING, + DEDICATED_THREAD, // These can never get stuck in queue behind others, but are more expensive to launch. Cannot use I/O. }; // Implement this to make something that you can run on the thread manager. diff --git a/Common/UI/Context.cpp b/Common/UI/Context.cpp index f6effabb32..70202f44a3 100644 --- a/Common/UI/Context.cpp +++ b/Common/UI/Context.cpp @@ -172,7 +172,7 @@ void UIContext::ActivateTopScissor() { int h = std::max(0.0f, ceilf(scale_y * bounds.h)); if (x < 0 || y < 0 || x + w > pixel_xres || y + h > pixel_yres) { // This won't actually report outside a game, but we can try. - ERROR_LOG(G3D, "UI scissor out of bounds in %sScreen: %d,%d-%d,%d / %d,%d", screenTag_ ? screenTag_ : "N/A", x, y, w, h, pixel_xres, pixel_yres); + DEBUG_LOG(G3D, "UI scissor out of bounds in %sScreen: %d,%d-%d,%d / %d,%d", screenTag_ ? screenTag_ : "N/A", x, y, w, h, pixel_xres, pixel_yres); if (x < 0) { w += x; x = 0; } if (y < 0) { h += y; y = 0; } if (x >= pixel_xres) { x = pixel_xres - 1; } diff --git a/Common/UI/PopupScreens.cpp b/Common/UI/PopupScreens.cpp index 1c5bed19c4..a15832fc79 100644 --- a/Common/UI/PopupScreens.cpp +++ b/Common/UI/PopupScreens.cpp @@ -343,7 +343,6 @@ void SliderFloatPopupScreen::CreatePopupContents(UI::ViewGroup *parent) { edit_->SetTextColor(dc.theme->itemStyle.fgColor); edit_->SetTextAlign(FLAG_DYNAMIC_ASCII); edit_->OnTextChange.Handle(this, &SliderFloatPopupScreen::OnTextChange); - changing_ = false; lin->Add(edit_); if (!units_.empty()) lin->Add(new TextView(units_, new LinearLayoutParams(10.0f)))->SetTextColor(dc.theme->itemStyle.fgColor); diff --git a/Common/UI/PopupScreens.h b/Common/UI/PopupScreens.h index 403b3955bf..e6b306c626 100644 --- a/Common/UI/PopupScreens.h +++ b/Common/UI/PopupScreens.h @@ -99,7 +99,7 @@ private: class SliderFloatPopupScreen : public PopupScreen { public: SliderFloatPopupScreen(float *value, float minValue, float maxValue, const std::string &title, float step = 1.0f, const std::string &units = "", bool liveUpdate = false) - : PopupScreen(title, "OK", "Cancel"), units_(units), value_(value), originalValue_(*value), minValue_(minValue), maxValue_(maxValue), step_(step), changing_(false), liveUpdate_(liveUpdate) {} + : PopupScreen(title, "OK", "Cancel"), units_(units), value_(value), originalValue_(*value), minValue_(minValue), maxValue_(maxValue), step_(step), liveUpdate_(liveUpdate) {} void CreatePopupContents(UI::ViewGroup *parent) override; const char *tag() const override { return "SliderFloatPopup"; } @@ -114,14 +114,14 @@ private: void OnCompleted(DialogResult result) override; UI::SliderFloat *slider_ = nullptr; UI::TextEdit *edit_ = nullptr; - std::string units_ = nullptr; - float sliderValue_; - float originalValue_; + std::string units_; + float sliderValue_ = 0.0f; + float originalValue_ = 0.0f; float *value_; float minValue_; float maxValue_; float step_; - bool changing_; + bool changing_ = false; bool liveUpdate_; }; @@ -361,7 +361,7 @@ private: std::string placeHolder_; std::string defaultText_; int maxLen_; - bool restoreFocus_; + bool restoreFocus_ = false; }; class ChoiceWithValueDisplay : public AbstractChoiceWithValueDisplay { diff --git a/Common/UI/Screen.cpp b/Common/UI/Screen.cpp index d06a26cd13..59ea6a320b 100644 --- a/Common/UI/Screen.cpp +++ b/Common/UI/Screen.cpp @@ -202,7 +202,9 @@ void ScreenManager::sendMessage(const char *msg, const char *value) { if (!strcmp(msg, "recreateviews")) RecreateAllViews(); if (!strcmp(msg, "lost_focus")) { - TouchInput input; + TouchInput input{}; + input.x = -50000.0f; + input.y = -50000.0f; input.flags = TOUCH_RELEASE_ALL; input.timestamp = time_now_d(); input.id = 0; @@ -238,7 +240,9 @@ void ScreenManager::push(Screen *screen, int layerFlags) { // Release touches and unfocus. UI::SetFocusedView(nullptr); - TouchInput input; + TouchInput input{}; + input.x = -50000.0f; + input.y = -50000.0f; input.flags = TOUCH_RELEASE_ALL; input.timestamp = time_now_d(); input.id = 0; diff --git a/Common/UI/UIScreen.cpp b/Common/UI/UIScreen.cpp index 887e71ff49..643ab6a3c4 100644 --- a/Common/UI/UIScreen.cpp +++ b/Common/UI/UIScreen.cpp @@ -217,14 +217,13 @@ UI::EventReturn UIScreen::OnCancel(UI::EventParams &e) { } PopupScreen::PopupScreen(std::string title, std::string button1, std::string button2) - : box_(0), defaultButton_(nullptr), title_(title) { + : title_(title) { auto di = GetI18NCategory("Dialog"); if (!button1.empty()) button1_ = di->T(button1.c_str()); if (!button2.empty()) button2_ = di->T(button2.c_str()); - - alpha_ = 0.0f; + alpha_ = 0.0f; // inherited } void PopupScreen::touch(const TouchInput &touch) { diff --git a/Common/UI/UIScreen.h b/Common/UI/UIScreen.h index a868485e65..0500c5f66f 100644 --- a/Common/UI/UIScreen.h +++ b/Common/UI/UIScreen.h @@ -97,8 +97,8 @@ protected: void update() override; private: - UI::LinearLayout *box_; - UI::Button *defaultButton_; + UI::LinearLayout *box_ = nullptr; + UI::Button *defaultButton_ = nullptr; std::string title_; std::string button1_; std::string button2_; @@ -110,7 +110,7 @@ private: int frames_ = 0; int finishFrame_ = -1; - DialogResult finishResult_; + DialogResult finishResult_ = DR_CANCEL; bool hasPopupOrigin_ = false; Point popupOrigin_; float offsetY_ = 0.0f; diff --git a/Common/UI/View.cpp b/Common/UI/View.cpp index 7a2bb50c7e..bef6320156 100644 --- a/Common/UI/View.cpp +++ b/Common/UI/View.cpp @@ -998,7 +998,8 @@ void TextView::GetContentDimensionsBySpec(const UIContext &dc, MeasureSpec horiz bounds.w -= bulletOffset; } dc.MeasureTextRect(small_ ? dc.theme->uiFontSmall : dc.theme->uiFont, 1.0f, 1.0f, text_.c_str(), (int)text_.length(), bounds, &w, &h, textAlign_); - + w += pad_ * 2.0f; + h += pad_ * 2.0f; if (bullet_) { w += bulletOffset; } @@ -1044,9 +1045,9 @@ void TextView::Draw(UIContext &dc) { if (shadow_) { uint32_t shadowColor = 0x80000000; - dc.DrawTextRect(text_.c_str(), textBounds.Offset(1.0f, 1.0f), shadowColor, textAlign_); + dc.DrawTextRect(text_.c_str(), textBounds.Offset(1.0f + pad_, 1.0f + pad_), shadowColor, textAlign_); } - dc.DrawTextRect(text_.c_str(), textBounds, textColor, textAlign_); + dc.DrawTextRect(text_.c_str(), textBounds.Offset(pad_, pad_), textColor, textAlign_); if (small_) { // If we changed font style, reset it. dc.SetFontStyle(dc.theme->uiFont); diff --git a/Common/UI/View.h b/Common/UI/View.h index 67be5bc385..c50a335151 100644 --- a/Common/UI/View.h +++ b/Common/UI/View.h @@ -870,6 +870,8 @@ public: BitCheckBox(uint32_t *bitfield, uint32_t bit, const std::string &text, const std::string &smallText = "", LayoutParams *layoutParams = nullptr) : CheckBox(nullptr, text, smallText, layoutParams), bitfield_(bitfield), bit_(bit) { } + + BitCheckBox(int *bitfield, int bit, const std::string &text, const std::string &smallText = "", LayoutParams *layoutParams = nullptr) : BitCheckBox((uint32_t *)bitfield, (uint32_t)bit, text, smallText, layoutParams) {} void Toggle() override; bool Toggled() const override; @@ -932,6 +934,7 @@ public: void SetFocusable(bool focusable) { focusable_ = focusable; } void SetClip(bool clip) { clip_ = clip; } void SetBullet(bool bullet) { bullet_ = bullet; } + void SetPadding(float pad) { pad_ = pad; } bool CanBeFocused() const override { return focusable_; } @@ -945,6 +948,7 @@ private: bool focusable_; bool clip_; bool bullet_ = false; + float pad_ = 0.0f; }; class TextEdit : public View { diff --git a/Common/VR/PPSSPPVR.cpp b/Common/VR/PPSSPPVR.cpp index 88ec3d0326..f3ede39317 100644 --- a/Common/VR/PPSSPPVR.cpp +++ b/Common/VR/PPSSPPVR.cpp @@ -103,6 +103,10 @@ static std::vector controllerMapping[2] = { rightControllerMapping }; static bool controllerMotion[2][5] = {}; +static bool hmdMotion[4] = {}; +static float hmdMotionLast[2] = {}; +static float hmdMotionDiff[2] = {}; +static float hmdMotionDiffLast[2] = {}; static int mouseController = 1; static bool mousePressed = false; @@ -309,6 +313,70 @@ void UpdateVRInput(bool haptics, float dp_xscale, float dp_yscale) { } } + // Head control + if (g_Config.iHeadRotation) { + float pitch = -VR_GetHMDAngles().x; + float yaw = -VR_GetHMDAngles().y; + bool disable = pspKeys[CTRL_SCREEN] || appMode == VR_MENU_MODE; + bool isVR = !IsFlatVRScene(); + + // calculate delta angles of the rotation + if (isVR) { + float f = g_Config.bHeadRotationSmoothing ? 0.5f : 1.0f; + float deltaPitch = pitch - hmdMotionLast[0]; + float deltaYaw = yaw - hmdMotionLast[1]; + while (deltaYaw >= 180) deltaYaw -= 360; + while (deltaYaw < -180) deltaYaw += 360; + hmdMotionLast[0] = pitch; + hmdMotionLast[1] = yaw; + hmdMotionDiffLast[0] = hmdMotionDiffLast[0] * (1-f) + hmdMotionDiff[0] * f; + hmdMotionDiffLast[1] = hmdMotionDiffLast[1] * (1-f) + hmdMotionDiff[1] * f; + hmdMotionDiff[0] += deltaPitch; + hmdMotionDiff[1] += deltaYaw; + pitch = hmdMotionDiff[0]; + yaw = hmdMotionDiff[1]; + } + + bool activate; + float limit = isVR ? g_Config.fHeadRotationScale : 20; + keyInput.deviceId = DEVICE_ID_XR_HMD; + + // vertical rotations + if (g_Config.iHeadRotation == 2) { + //up + activate = !disable && pitch > limit; + keyInput.flags = activate ? KEY_DOWN : KEY_UP; + keyInput.keyCode = NKCODE_EXT_ROTATION_UP; + if (hmdMotion[0] != activate) NativeKey(keyInput); + if (isVR && activate) hmdMotionDiff[0] -= limit; + hmdMotion[0] = activate; + + //down + activate = !disable && pitch < -limit; + keyInput.flags = activate ? KEY_DOWN : KEY_UP; + keyInput.keyCode = NKCODE_EXT_ROTATION_DOWN; + if (hmdMotion[1] != activate) NativeKey(keyInput); + if (isVR && activate) hmdMotionDiff[0] += limit; + hmdMotion[1] = activate; + } + + //left + activate = !disable && yaw < -limit; + keyInput.flags = activate ? KEY_DOWN : KEY_UP; + keyInput.keyCode = NKCODE_EXT_ROTATION_LEFT; + if (hmdMotion[2] != activate) NativeKey(keyInput); + if (isVR && activate) hmdMotionDiff[1] += limit; + hmdMotion[2] = activate; + + //right + activate = !disable && yaw > limit; + keyInput.flags = activate ? KEY_DOWN : KEY_UP; + keyInput.keyCode = NKCODE_EXT_ROTATION_RIGHT; + if (hmdMotion[3] != activate) NativeKey(keyInput); + if (isVR && activate) hmdMotionDiff[1] -= limit; + hmdMotion[3] = activate; + } + // Camera adjust if (pspKeys[VIRTKEY_VR_CAMERA_ADJUST]) { for (auto& device : pspAxis) { @@ -606,11 +674,20 @@ bool StartVRRender() { invView = XrPosef_Inverse(invView); } - // create updated quaternion + // decompose rotation XrVector3f rotation = XrQuaternionf_ToEulerAngles(invView.orientation); - XrQuaternionf pitch = XrQuaternionf_CreateFromVectorAngle({1, 0, 0}, mx * ToRadians(rotation.x)); - XrQuaternionf yaw = XrQuaternionf_CreateFromVectorAngle({0, 1, 0}, my * ToRadians(rotation.y)); - XrQuaternionf roll = XrQuaternionf_CreateFromVectorAngle({0, 0, 1}, mz * ToRadians(rotation.z)); + float mPitch = mx * ToRadians(rotation.x); + float mYaw = my * ToRadians(rotation.y); + float mRoll = mz * ToRadians(rotation.z); + + // use in-game camera interpolated rotation + if (g_Config.iHeadRotation >= 2) mPitch = -mx * ToRadians(hmdMotionDiffLast[0]); // vertical + if (g_Config.iHeadRotation >= 1) mYaw = -my * ToRadians(hmdMotionDiffLast[1]); // horizontal + + // create updated quaternion + XrQuaternionf pitch = XrQuaternionf_CreateFromVectorAngle({1, 0, 0}, mPitch); + XrQuaternionf yaw = XrQuaternionf_CreateFromVectorAngle({0, 1, 0}, mYaw); + XrQuaternionf roll = XrQuaternionf_CreateFromVectorAngle({0, 0, 1}, mRoll); invView.orientation = XrQuaternionf_Multiply(roll, XrQuaternionf_Multiply(pitch, yaw)); float M[16]; diff --git a/Common/VR/VRRenderer.cpp b/Common/VR/VRRenderer.cpp index 5de7cb4055..7db2073244 100644 --- a/Common/VR/VRRenderer.cpp +++ b/Common/VR/VRRenderer.cpp @@ -465,3 +465,7 @@ void* VR_BindFramebuffer(engine_t *engine) { XrView VR_GetView(int eye) { return projections[eye]; } + +XrVector3f VR_GetHMDAngles() { + return hmdorientation; +} diff --git a/Common/VR/VRRenderer.h b/Common/VR/VRRenderer.h index 78de6a5ccf..8ed7869656 100644 --- a/Common/VR/VRRenderer.h +++ b/Common/VR/VRRenderer.h @@ -48,3 +48,4 @@ void VR_SetConfigFloat( VRConfigFloat config, float value ); void* VR_BindFramebuffer(engine_t *engine); XrView VR_GetView(int eye); +XrVector3f VR_GetHMDAngles(); diff --git a/Core/Config.cpp b/Core/Config.cpp index d4360b4c51..fcba7c9666 100644 --- a/Core/Config.cpp +++ b/Core/Config.cpp @@ -842,7 +842,7 @@ static ConfigSetting graphicsSettings[] = { ConfigSetting("CardboardScreenSize", &g_Config.iCardboardScreenSize, 50, true, true), ConfigSetting("CardboardXShift", &g_Config.iCardboardXShift, 0, true, true), ConfigSetting("CardboardYShift", &g_Config.iCardboardYShift, 0, true, true), - ConfigSetting("ShowFPSCounter", &g_Config.iShowFPSCounter, 0, true, true), + ConfigSetting("iShowStatusFlags", &g_Config.iShowStatusFlags, 0, true, true), ReportedConfigSetting("GraphicsBackend", &g_Config.iGPUBackend, &DefaultGPUBackend, &GPUBackendTranslator::To, &GPUBackendTranslator::From, true, false), ConfigSetting("FailedGraphicsBackends", &g_Config.sFailedGPUBackends, ""), ConfigSetting("DisabledGraphicsBackends", &g_Config.sDisabledGPUBackends, ""), @@ -1197,6 +1197,9 @@ static ConfigSetting vrSettings[] = { ConfigSetting("VRFieldOfView", &g_Config.fFieldOfViewPercentage, 100.0f), ConfigSetting("VRHeadUpDisplayScale", &g_Config.fHeadUpDisplayScale, 0.3f), ConfigSetting("VRMotionLength", &g_Config.fMotionLength, 0.5f), + ConfigSetting("VRHeadRotationScale", &g_Config.fHeadRotationScale, 5.0f), + ConfigSetting("VRHeadRotationSmoothing", &g_Config.bHeadRotationSmoothing, false), + ConfigSetting("VRHeadRotation", &g_Config.iHeadRotation, 0), ConfigSetting(false), }; @@ -1761,7 +1764,10 @@ void Config::CleanRecent() { } } - INFO_LOG(SYSTEM, "CleanRecent took %0.2f", time_now_d() - startTime); + double recentTime = time_now_d() - startTime; + if (recentTime > 0.1) { + INFO_LOG(SYSTEM, "CleanRecent took %0.2f", recentTime); + } recentIsos = cleanedRecent; }); } @@ -1809,17 +1815,31 @@ const Path Config::FindConfigFile(const std::string &baseFilename) { return filename; } -void Config::RestoreDefaults() { +void Config::RestoreDefaults(RestoreSettingsBits whatToRestore) { if (bGameSpecific) { deleteGameConfig(gameId_); createGameConfig(gameId_); + Load(); } else { - if (File::Exists(iniFilename_)) - File::Delete(iniFilename_); - ClearRecentIsos(); - currentDirectory = defaultCurrentDirectory; + if (whatToRestore & RestoreSettingsBits::SETTINGS) { + if (File::Exists(iniFilename_)) + File::Delete(iniFilename_); + } + + if (whatToRestore & RestoreSettingsBits::CONTROLS) { + if (File::Exists(controllerIniFilename_)) + File::Delete(controllerIniFilename_); + } + + if (whatToRestore & RestoreSettingsBits::RECENT) { + ClearRecentIsos(); + currentDirectory = defaultCurrentDirectory; + } + + if (whatToRestore & (RestoreSettingsBits::SETTINGS | RestoreSettingsBits::CONTROLS)) { + Load(); + } } - Load(); } bool Config::hasGameConfig(const std::string &pGameId) { diff --git a/Core/Config.h b/Core/Config.h index a6b8a04d91..c6f0f1673e 100644 --- a/Core/Config.h +++ b/Core/Config.h @@ -270,7 +270,7 @@ public: // UI bool bShowDebuggerOnLoad; - int iShowFPSCounter; + int iShowStatusFlags; bool bShowRegionOnGameIcon; bool bShowIDOnGameIcon; float fGameGridScale; @@ -475,6 +475,9 @@ public: float fFieldOfViewPercentage; float fHeadUpDisplayScale; float fMotionLength; + float fHeadRotationScale; + bool bHeadRotationSmoothing; + int iHeadRotation; // Debugger int iDisasmWindowX; @@ -523,7 +526,7 @@ public: void Load(const char *iniFileName = nullptr, const char *controllerIniFilename = nullptr); bool Save(const char *saveReason); void Reload(); - void RestoreDefaults(); + void RestoreDefaults(RestoreSettingsBits whatToRestore); //per game config managment, should maybe be in it's own class void changeGameSpecific(const std::string &gameId = "", const std::string &title = ""); diff --git a/Core/ConfigValues.h b/Core/ConfigValues.h index f8e88be931..f793e7ad07 100644 --- a/Core/ConfigValues.h +++ b/Core/ConfigValues.h @@ -22,6 +22,7 @@ #ifndef _MSC_VER #include #endif +#include "Common/Common.h" #include "Common/CommonFuncs.h" const int PSP_MODEL_FAT = 0; @@ -65,6 +66,13 @@ enum class GPUBackend { VULKAN = 3, }; +enum class RestoreSettingsBits : int { + SETTINGS = 1, + CONTROLS = 2, + RECENT = 4, +}; +ENUM_CLASS_BITOPS(RestoreSettingsBits); + inline std::string GPUBackendToString(GPUBackend backend) { switch (backend) { case GPUBackend::OPENGL: @@ -129,3 +137,10 @@ enum class AnalogFpsMode { MAPPED_DIRECTION = 1, MAPPED_DIR_TO_OPPOSITE_DIR = 2, }; + +// for Config.iShowStatusFlags +enum class ShowStatusFlags { + FPS_COUNTER = 1 << 1, + SPEED_COUNTER = 1 << 2, + BATTERY_PERCENT = 1 << 3, +}; diff --git a/Core/Core.cpp b/Core/Core.cpp index d71887acea..611dad8457 100644 --- a/Core/Core.cpp +++ b/Core/Core.cpp @@ -199,7 +199,6 @@ bool UpdateScreenScale(int width, int height) { dp_yres = new_dp_yres; pixel_xres = width; pixel_yres = height; - INFO_LOG(G3D, "pixel_res: %dx%d. Calling NativeResized()", pixel_xres, pixel_yres); NativeResized(); return true; } @@ -328,14 +327,14 @@ void Core_ProcessStepping() { // Many platforms, like Android, do not call this function but handle things on their own. // Instead they simply call NativeRender and NativeUpdate directly. -void Core_Run(GraphicsContext *ctx) { +bool Core_Run(GraphicsContext *ctx) { host->UpdateDisassembly(); while (true) { if (GetUIState() != UISTATE_INGAME) { Core_StateProcessed(); if (GetUIState() == UISTATE_EXIT) { UpdateRunLoop(); - return; + return false; } Core_RunLoop(ctx); continue; @@ -348,7 +347,7 @@ void Core_Run(GraphicsContext *ctx) { Core_RunLoop(ctx); if (coreState == CORE_POWERDOWN) { Core_StateProcessed(); - return; + return true; } break; @@ -359,10 +358,10 @@ void Core_Run(GraphicsContext *ctx) { // Exit loop!! Core_StateProcessed(); - return; + return true; case CORE_NEXTFRAME: - return; + return true; } } } diff --git a/Core/Core.h b/Core/Core.h index 6fb372311c..333dbd1b4a 100644 --- a/Core/Core.h +++ b/Core/Core.h @@ -27,8 +27,10 @@ class GraphicsContext; // called from emu thread void UpdateRunLoop(); -void Core_Run(GraphicsContext *ctx); +// Returns false when an UI exit state is detected. +bool Core_Run(GraphicsContext *ctx); void Core_Stop(); + // For platforms that don't call Core_Run void Core_SetGraphicsContext(GraphicsContext *ctx); diff --git a/Core/CoreTiming.cpp b/Core/CoreTiming.cpp index 4b25032325..d91a55ab79 100644 --- a/Core/CoreTiming.cpp +++ b/Core/CoreTiming.cpp @@ -233,16 +233,14 @@ void Shutdown() ClearPendingEvents(); UnregisterAllEvents(); - while(eventPool) - { + while (eventPool) { Event *ev = eventPool; eventPool = ev->next; delete ev; } std::lock_guard lk(externalEventLock); - while(eventTsPool) - { + while (eventTsPool) { Event *ev = eventTsPool; eventTsPool = ev->next; delete ev; @@ -251,7 +249,12 @@ void Shutdown() u64 GetTicks() { - return (u64)globalTimer + slicelength - currentMIPS->downcount; + if (currentMIPS) { + return (u64)globalTimer + slicelength - currentMIPS->downcount; + } else { + // Reporting can actually end up here during weird task switching sequences on Android + return false; + } } u64 GetIdleTicks() diff --git a/Core/HLE/sceFont.cpp b/Core/HLE/sceFont.cpp index 873eeb2994..d0b23ece26 100644 --- a/Core/HLE/sceFont.cpp +++ b/Core/HLE/sceFont.cpp @@ -1168,6 +1168,7 @@ static int sceFontFindOptimumFont(u32 libHandle, u32 fontStylePtr, u32 errorCode } auto requestedStyle = PSPPointer::Create(fontStylePtr); + DEBUG_LOG(SCEFONT, "requestedStyle fontAttributes %i,fontCountry %i,fontExpire %i,fontFamily %i,fontFileName %s,fontH %f,fontHRes %f,fontLanguage %i,fontName %s,fontRegion %i,fontStyle %i,fontStyleSub %i,fontV %f,fontVRes %f,fontWeight %f", requestedStyle->fontAttributes, requestedStyle->fontCountry, requestedStyle->fontExpire, requestedStyle->fontFamily, requestedStyle->fontFileName, requestedStyle->fontH, requestedStyle->fontHRes, requestedStyle->fontLanguage, requestedStyle->fontName, requestedStyle->fontRegion, requestedStyle->fontStyle, requestedStyle->fontStyleSub, requestedStyle->fontV, requestedStyle->fontVRes, requestedStyle->fontWeight); // Find the first nearest match for H/V, OR the last exact match for others. float hRes = requestedStyle->fontHRes > 0.0f ? (float)requestedStyle->fontHRes : fontLib->FontHRes(); @@ -1235,6 +1236,7 @@ static int sceFontFindFont(u32 libHandle, u32 fontStylePtr, u32 errorCodePtr) { DEBUG_LOG(SCEFONT, "sceFontFindFont(%x, %x, %x)", libHandle, fontStylePtr, errorCodePtr); auto requestedStyle = PSPPointer::Create(fontStylePtr); + DEBUG_LOG(SCEFONT, "requestedStyle fontAttributes %i,fontCountry %i,fontExpire %i,fontFamily %i,fontFileName %s,fontH %f,fontHRes %f,fontLanguage %i,fontName %s,fontRegion %i,fontStyle %i,fontStyleSub %i,fontV %f,fontVRes %f,fontWeight %f", requestedStyle->fontAttributes, requestedStyle->fontCountry, requestedStyle->fontExpire, requestedStyle->fontFamily, requestedStyle->fontFileName, requestedStyle->fontH, requestedStyle->fontHRes, requestedStyle->fontLanguage, requestedStyle->fontName, requestedStyle->fontRegion, requestedStyle->fontStyle, requestedStyle->fontStyleSub, requestedStyle->fontV, requestedStyle->fontVRes, requestedStyle->fontWeight); // Find the closest exact match for the fields specified. float hRes = requestedStyle->fontHRes > 0.0f ? (float)requestedStyle->fontHRes : fontLib->FontHRes(); diff --git a/Core/KeyMap.cpp b/Core/KeyMap.cpp index a853b69dfa..6b072fadb3 100644 --- a/Core/KeyMap.cpp +++ b/Core/KeyMap.cpp @@ -310,6 +310,10 @@ static const KeyMap_IntStrPair key_names[] = { {NKCODE_EXT_MOTION_LEFT, "MotionLeft"}, {NKCODE_EXT_MOTION_RIGHT, "MotionRight"}, {NKCODE_EXT_MOTION_FORWARD, "MotionFwd"}, + {NKCODE_EXT_ROTATION_UP, "RotationUp"}, + {NKCODE_EXT_ROTATION_DOWN, "RotationDown"}, + {NKCODE_EXT_ROTATION_LEFT, "RotationLeft"}, + {NKCODE_EXT_ROTATION_RIGHT, "RotationRight"}, {NKCODE_START_QUESTION, "¿"}, {NKCODE_LEFTBRACE, "{"}, diff --git a/GPU/Common/FramebufferManagerCommon.cpp b/GPU/Common/FramebufferManagerCommon.cpp index 0a145b6781..de73d52e29 100644 --- a/GPU/Common/FramebufferManagerCommon.cpp +++ b/GPU/Common/FramebufferManagerCommon.cpp @@ -2446,7 +2446,7 @@ void FramebufferManagerCommon::NotifyRenderResized(int msaaLevel) { #ifdef _WIN32 // Seems related - if you're ok with numbers all the time, show some more :) - if (g_Config.iShowFPSCounter != 0) { + if (g_Config.iShowStatusFlags != 0) { ShowScreenResolution(); } #endif diff --git a/GPU/Common/GPUStateUtils.cpp b/GPU/Common/GPUStateUtils.cpp index f902330528..ef6fdc9e25 100644 --- a/GPU/Common/GPUStateUtils.cpp +++ b/GPU/Common/GPUStateUtils.cpp @@ -521,7 +521,7 @@ float ToScaledDepthFromIntegerScale(float z) { const float depthSliceFactor = DepthSliceFactor(); if (gstate_c.Use(GPU_SCALE_DEPTH_FROM_24BIT_TO_16BIT)) { const double doffset = 0.5 * (depthSliceFactor - 1.0) * (1.0 / depthSliceFactor); - // Use one bit for each value, rather than 1.0 / (25535.0 * 256.0). + // Use one bit for each value, rather than 1.0 / (65535.0 * 256.0). return (float)((double)z * (1.0 / 16777215.0) + doffset); } else { const float offset = 0.5f * (depthSliceFactor - 1.0f) * (1.0f / depthSliceFactor); @@ -730,6 +730,12 @@ void ConvertViewportAndScissor(bool useBufferedRendering, float renderWidth, flo if (maxz == 65535) { maxz += fullDepthRange; } + } else if (maxz == 65535) { + // This means clamp isn't enabled, but we still want to allow values up to 65535.99. + // If DepthSliceFactor() is 1.0, though, this would make out.depthRangeMax exceed 1. + // Since that would clamp, it would make Z=1234 not match between draws when maxz changes. + if (DepthSliceFactor() > 1.0f) + maxz = 65535.99f; } // Okay. So, in our shader, -1 will map to minz, and +1 will map to maxz. float halfActualZRange = (maxz - minz) * (1.0f / 2.0f); @@ -748,6 +754,7 @@ void ConvertViewportAndScissor(bool useBufferedRendering, float renderWidth, flo } // OpenGL will clamp these for us anyway, and Direct3D will error if not clamped. + // Of course, if this happens we've skewed out.depthScale/out.zOffset and may get z-fighting. out.depthRangeMin = std::max(out.depthRangeMin, 0.0f); out.depthRangeMax = std::min(out.depthRangeMax, 1.0f); } diff --git a/GPU/GLES/GPU_GLES.cpp b/GPU/GLES/GPU_GLES.cpp index a41dc68ee4..034e8bd660 100644 --- a/GPU/GLES/GPU_GLES.cpp +++ b/GPU/GLES/GPU_GLES.cpp @@ -128,11 +128,6 @@ GPU_GLES::GPU_GLES(GraphicsContext *gfxCtx, Draw::DrawContext *draw) } GPU_GLES::~GPU_GLES() { - if (draw_) { - GLRenderManager *render = (GLRenderManager *)draw_->GetNativeObject(Draw::NativeObject::RENDER_MANAGER); - render->Wipe(); - } - // If we're here during app shutdown (exiting the Windows app in-game, for example) // everything should already be cleared since DeviceLost has been run. diff --git a/GPU/Vulkan/ShaderManagerVulkan.cpp b/GPU/Vulkan/ShaderManagerVulkan.cpp index 6b823a2cc0..11514fcff3 100644 --- a/GPU/Vulkan/ShaderManagerVulkan.cpp +++ b/GPU/Vulkan/ShaderManagerVulkan.cpp @@ -98,12 +98,17 @@ static Promise *CompileShaderModuleAsync(VulkanContext *vulkan, #if defined(_DEBUG) // Don't parallelize in debug mode, pathological behavior due to mutex locks in allocator which is HEAVILY used by glslang. - return Promise::AlreadyDone(compile()); + bool singleThreaded = true; #else - return Promise::Spawn(&g_threadManager, compile, TaskType::CPU_COMPUTE); + bool singleThreaded = false; #endif -} + if (singleThreaded) { + return Promise::AlreadyDone(compile()); + } else { + return Promise::Spawn(&g_threadManager, compile, TaskType::CPU_COMPUTE); + } +} VulkanFragmentShader::VulkanFragmentShader(VulkanContext *vulkan, FShaderID id, FragmentShaderFlags flags, const char *code) : vulkan_(vulkan), id_(id), flags_(flags) { diff --git a/Qt/QtMain.h b/Qt/QtMain.h index afb97149f4..0177ca9292 100644 --- a/Qt/QtMain.h +++ b/Qt/QtMain.h @@ -90,7 +90,6 @@ public: } void StopThread() override { - renderManager_->WaitUntilQueueIdle(); renderManager_->StopThread(); } diff --git a/Qt/mainwindow.cpp b/Qt/mainwindow.cpp index 26707a76e2..3ab5f4ac37 100644 --- a/Qt/mainwindow.cpp +++ b/Qt/mainwindow.cpp @@ -423,7 +423,7 @@ void MainWindow::forumAct() void MainWindow::goldAct() { - QDesktopServices::openUrl(QUrl("https://central.ppsspp.org/buygold")); + QDesktopServices::openUrl(QUrl("https://www.ppsspp.org/buygold")); } void MainWindow::gitAct() @@ -655,8 +655,6 @@ void MainWindow::createMenus() ->addEventChecked(&g_Config.bHardwareTransform); gameSettingsMenu->add(new MenuAction(this, SLOT(vertexCacheAct()), QT_TR_NOOP("&Vertex cache"))) ->addEventChecked(&g_Config.bVertexCache); - gameSettingsMenu->add(new MenuAction(this, SLOT(showFPSAct()), QT_TR_NOOP("&Show FPS counter"))) - ->addEventChecked(&g_Config.iShowFPSCounter); gameSettingsMenu->addSeparator(); gameSettingsMenu->add(new MenuAction(this, SLOT(audioAct()), QT_TR_NOOP("Enable s&ound"))) ->addEventChecked(&g_Config.bEnableSound); diff --git a/Qt/mainwindow.h b/Qt/mainwindow.h index 705a3dd004..709e903e46 100644 --- a/Qt/mainwindow.h +++ b/Qt/mainwindow.h @@ -184,7 +184,6 @@ private slots: g_Config.bShowDebugStats = !g_Config.bShowDebugStats; NativeMessageReceived("clear jit", ""); } - void showFPSAct() { g_Config.iShowFPSCounter = g_Config.iShowFPSCounter ? 0 : 3; } // 3 = both speed and FPS // Help void websiteAct(); diff --git a/SDL/SDLGLGraphicsContext.cpp b/SDL/SDLGLGraphicsContext.cpp index 945c9a950e..62fba14b81 100644 --- a/SDL/SDLGLGraphicsContext.cpp +++ b/SDL/SDLGLGraphicsContext.cpp @@ -429,7 +429,7 @@ int SDLGLGraphicsContext::Init(SDL_Window *&window, int x, int y, int mode, std: #else SDL_GL_SwapWindow(window_); #endif - }); + }, false); renderManager_->SetSwapIntervalFunction([&](int interval) { INFO_LOG(G3D, "SDL SwapInterval: %d", interval); diff --git a/SDL/SDLGLGraphicsContext.h b/SDL/SDLGLGraphicsContext.h index 1910ce8f56..7982a3fa49 100644 --- a/SDL/SDLGLGraphicsContext.h +++ b/SDL/SDLGLGraphicsContext.h @@ -42,7 +42,6 @@ public: } void StopThread() override { - renderManager_->WaitUntilQueueIdle(); renderManager_->StopThread(); } diff --git a/SDL/SDLMain.cpp b/SDL/SDLMain.cpp index 376bf89427..211314d016 100644 --- a/SDL/SDLMain.cpp +++ b/SDL/SDLMain.cpp @@ -1011,7 +1011,7 @@ int main(int argc, char *argv[]) { case SDL_BUTTON_LEFT: { mouseDown = true; - TouchInput input; + TouchInput input{}; input.x = mx; input.y = my; input.flags = TOUCH_DOWN | TOUCH_MOUSE; @@ -1065,7 +1065,7 @@ int main(int argc, char *argv[]) { } case SDL_MOUSEMOTION: if (mouseDown) { - TouchInput input; + TouchInput input{}; input.x = mx; input.y = my; input.flags = TOUCH_MOVE | TOUCH_MOUSE; @@ -1080,7 +1080,7 @@ int main(int argc, char *argv[]) { case SDL_BUTTON_LEFT: { mouseDown = false; - TouchInput input; + TouchInput input{}; input.x = mx; input.y = my; input.flags = TOUCH_UP | TOUCH_MOUSE; diff --git a/UI/ControlMappingScreen.cpp b/UI/ControlMappingScreen.cpp index 3b2d4d16f1..db5926de42 100644 --- a/UI/ControlMappingScreen.cpp +++ b/UI/ControlMappingScreen.cpp @@ -970,6 +970,12 @@ public: if (img_.isValid()) { scales[0] *= scaleX_; scales[1] *= scaleY_; + if (timeLastPressed_ >= 0.0) { + double sincePress = time_now_d() - timeLastPressed_; + if (sincePress < 1.0) { + c = colorBlend(c, dc.theme->itemDownStyle.background.color, (float)sincePress); + } + } dc.Draw()->DrawImageRotatedStretch(img_, bounds_.Offset(offsetX_, offsetY_), scales, angle_, c); } } @@ -1010,6 +1016,10 @@ public: return button_; } + void NotifyPressed() { + timeLastPressed_ = time_now_d(); + } + private: int button_; ImageID img_; @@ -1021,6 +1031,7 @@ private: float offsetY_ = 0.0f; bool flipHBG_ = false; int *selectedButton_ = nullptr; + double timeLastPressed_ = -1.0; }; class MockPSP : public UI::AnchorLayout { @@ -1030,8 +1041,11 @@ public: MockPSP(UI::LayoutParams *layoutParams = nullptr); void SelectButton(int btn); void FocusButton(int btn); + void NotifyPressed(int btn); float GetPopupOffset(); + bool SubviewFocused(View *view) override; + UI::Event ButtonClick; private: @@ -1042,6 +1056,7 @@ private: UI::EventReturn OnSelectButton(UI::EventParams &e); std::unordered_map buttons_; + UI::TextView *labelView_ = nullptr; int selectedButton_ = 0; }; @@ -1070,6 +1085,10 @@ MockPSP::MockPSP(UI::LayoutParams *layoutParams) : AnchorLayout(layoutParams) { AddButton(CTRL_CIRCLE, ImageID("I_CIRCLE"), ImageID("I_ROUND_LINE"), 0.0f, LayoutSize(23.0f, 23.0f, 446.0f, 74.0f))->SetScale(0.7f); AddButton(CTRL_CROSS, ImageID("I_CROSS"), ImageID("I_ROUND_LINE"), 0.0f, LayoutSize(23.0f, 23.0f, 419.0f, 102.0f))->SetScale(0.7f); AddButton(CTRL_SQUARE, ImageID("I_SQUARE"), ImageID("I_ROUND_LINE"), 0.0f, LayoutSize(23.0f, 23.0f, 392.0f, 74.0f))->SetScale(0.7f); + + labelView_ = Add(new UI::TextView("")); + labelView_->SetShadow(true); + labelView_->SetVisibility(UI::V_GONE); } void MockPSP::SelectButton(int btn) { @@ -1077,9 +1096,31 @@ void MockPSP::SelectButton(int btn) { } void MockPSP::FocusButton(int btn) { - MockButton *view = buttons_[selectedButton_]; - if (view) + MockButton *view = buttons_[btn]; + if (view) { view->SetFocus(); + } else { + labelView_->SetVisibility(UI::V_GONE); + } +} + +void MockPSP::NotifyPressed(int btn) { + MockButton *view = buttons_[btn]; + if (view) + view->NotifyPressed(); +} + +bool MockPSP::SubviewFocused(View *view) { + for (auto it : buttons_) { + if (view == it.second) { + labelView_->SetVisibility(UI::V_VISIBLE); + labelView_->SetText(KeyMap::GetPspButtonName(it.first)); + + const Bounds &pos = view->GetBounds().Offset(-GetBounds().x, -GetBounds().y); + labelView_->ReplaceLayoutParams(new UI::AnchorLayoutParams(pos.centerX(), pos.y2() + 5, UI::NONE, UI::NONE)); + } + } + return AnchorLayout::SubviewFocused(view); } float MockPSP::GetPopupOffset() { @@ -1162,6 +1203,50 @@ void VisualMappingScreen::CreateViews() { root_->Add(rightColumn); } +bool VisualMappingScreen::key(const KeyInput &key) { + if (key.flags & KEY_DOWN) { + std::vector pspKeys; + KeyMap::KeyToPspButton(key.deviceId, key.keyCode, &pspKeys); + for (int pspKey : pspKeys) { + switch (pspKey) { + case VIRTKEY_AXIS_X_MIN: + case VIRTKEY_AXIS_Y_MIN: + case VIRTKEY_AXIS_X_MAX: + case VIRTKEY_AXIS_Y_MAX: + psp_->NotifyPressed(VIRTKEY_AXIS_Y_MAX); + break; + default: + psp_->NotifyPressed(pspKey); + break; + } + } + } + return UIDialogScreenWithGameBackground::key(key); +} + +void VisualMappingScreen::axis(const AxisInput &axis) { + std::vector results; + if (axis.value >= g_Config.fAnalogDeadzone * 0.7f) + KeyMap::AxisToPspButton(axis.deviceId, axis.axisId, 1, &results); + if (axis.value <= g_Config.fAnalogDeadzone * -0.7f) + KeyMap::AxisToPspButton(axis.deviceId, axis.axisId, -1, &results); + + for (int result : results) { + switch (result) { + case VIRTKEY_AXIS_X_MIN: + case VIRTKEY_AXIS_Y_MIN: + case VIRTKEY_AXIS_X_MAX: + case VIRTKEY_AXIS_Y_MAX: + psp_->NotifyPressed(VIRTKEY_AXIS_Y_MAX); + break; + default: + psp_->NotifyPressed(result); + break; + } + } + UIDialogScreenWithGameBackground::axis(axis); +} + void VisualMappingScreen::resized() { UIDialogScreenWithGameBackground::resized(); RecreateViews(); diff --git a/UI/ControlMappingScreen.h b/UI/ControlMappingScreen.h index a54a53afe3..569ea9721c 100644 --- a/UI/ControlMappingScreen.h +++ b/UI/ControlMappingScreen.h @@ -177,6 +177,9 @@ public: const char *tag() const override { return "VisualMapping"; } + bool key(const KeyInput &key) override; + void axis(const AxisInput &axis) override; + protected: void CreateViews() override; diff --git a/UI/DevScreens.cpp b/UI/DevScreens.cpp index e54c1a76f6..d9fc09d7de 100644 --- a/UI/DevScreens.cpp +++ b/UI/DevScreens.cpp @@ -704,10 +704,9 @@ void SystemInfoScreen::CreateViews() { tabHolder->AddTab(si->T("CPU Extensions"), cpuExtensionsScroll); cpuExtensions->Add(new ItemHeader(si->T("CPU Extensions"))); - std::vector exts; - SplitString(cpu_info.Summarize(), ',', exts); - for (size_t i = 2; i < exts.size(); i++) { - cpuExtensions->Add(new TextView(exts[i], new LayoutParams(FILL_PARENT, WRAP_CONTENT)))->SetFocusable(true); + std::vector exts = cpu_info.Features(); + for (std::string &ext : exts) { + cpuExtensions->Add(new TextView(ext, new LayoutParams(FILL_PARENT, WRAP_CONTENT)))->SetFocusable(true); } ViewGroup *driverBugsScroll = new ScrollView(ORIENT_VERTICAL, new LinearLayoutParams(FILL_PARENT, FILL_PARENT)); diff --git a/UI/EmuScreen.cpp b/UI/EmuScreen.cpp index 4ffb74ce38..fbc6a7bfb3 100644 --- a/UI/EmuScreen.cpp +++ b/UI/EmuScreen.cpp @@ -25,6 +25,7 @@ using namespace std::placeholders; #include "Common/Render/TextureAtlas.h" #include "Common/GPU/OpenGL/GLFeatures.h" #include "Common/Render/Text/draw_text.h" +#include "Common/Battery/Battery.h" #include "Common/UI/Root.h" #include "Common/UI/UI.h" @@ -1308,23 +1309,30 @@ static void DrawFPS(UIContext *ctx, const Bounds &bounds) { FontID ubuntu24("UBUNTU24"); float vps, fps, actual_fps; __DisplayGetFPS(&vps, &fps, &actual_fps); - char fpsbuf[256]; - switch (g_Config.iShowFPSCounter) { - case 1: - snprintf(fpsbuf, sizeof(fpsbuf), "Speed: %0.1f%%", vps / (59.94f / 100.0f)); break; - case 2: - snprintf(fpsbuf, sizeof(fpsbuf), "FPS: %0.1f", actual_fps); break; - case 3: - snprintf(fpsbuf, sizeof(fpsbuf), "%0.0f/%0.0f (%0.1f%%)", actual_fps, fps, vps / (59.94f / 100.0f)); break; - default: - return; + + char fpsbuf[256]{}; + if (g_Config.iShowStatusFlags == ((int)ShowStatusFlags::FPS_COUNTER | (int)ShowStatusFlags::SPEED_COUNTER)) { + snprintf(fpsbuf, sizeof(fpsbuf), "%0.0f/%0.0f (%0.1f%%)", actual_fps, fps, vps / (59.94f / 100.0f)); + } else { + if (g_Config.iShowStatusFlags & (int)ShowStatusFlags::FPS_COUNTER) { + snprintf(fpsbuf, sizeof(fpsbuf), "FPS: %0.1f", actual_fps); + } + if (g_Config.iShowStatusFlags & (int)ShowStatusFlags::SPEED_COUNTER) { + snprintf(fpsbuf, sizeof(fpsbuf), "%s Speed: %0.1f%%", fpsbuf, vps / (59.94f / 100.0f)); + } } + +#ifdef CAN_DISPLAY_CURRENT_BATTERY_CAPACITY + if (g_Config.iShowStatusFlags & (int)ShowStatusFlags::BATTERY_PERCENT) { + snprintf(fpsbuf, sizeof(fpsbuf), "%s Battery: %d%%", fpsbuf, getCurrentBatteryCapacity()); + } +#endif ctx->Flush(); ctx->BindFontTexture(); ctx->Draw()->SetFontScale(0.7f, 0.7f); - ctx->Draw()->DrawText(ubuntu24, fpsbuf, bounds.x2() - 8, 12, 0xc0000000, ALIGN_TOPRIGHT | FLAG_DYNAMIC_ASCII); - ctx->Draw()->DrawText(ubuntu24, fpsbuf, bounds.x2() - 10, 10, 0xFF3fFF3f, ALIGN_TOPRIGHT | FLAG_DYNAMIC_ASCII); + ctx->Draw()->DrawText(ubuntu24, fpsbuf, bounds.x2() - 8, 20, 0xc0000000, ALIGN_TOPRIGHT | FLAG_DYNAMIC_ASCII); + ctx->Draw()->DrawText(ubuntu24, fpsbuf, bounds.x2() - 10, 19, 0xFF3fFF3f, ALIGN_TOPRIGHT | FLAG_DYNAMIC_ASCII); ctx->Draw()->SetFontScale(1.0f, 1.0f); ctx->Flush(); ctx->RebindTexture(); @@ -1504,7 +1512,7 @@ bool EmuScreen::hasVisibleUI() { // Regular but uncommon UI. if (saveStatePreview_->GetVisibility() != UI::V_GONE || loadingSpinner_->GetVisibility() == UI::V_VISIBLE) return true; - if (!osm.IsEmpty() || g_Config.bShowTouchControls || g_Config.iShowFPSCounter != 0) + if (!osm.IsEmpty() || g_Config.bShowTouchControls || g_Config.iShowStatusFlags != 0) return true; if (g_Config.bEnableCardboardVR || g_Config.bEnableNetworkChat) return true; @@ -1551,7 +1559,7 @@ void EmuScreen::renderUI() { DrawAudioDebugStats(ctx, ctx->GetLayoutBounds()); } - if (g_Config.iShowFPSCounter && !invalid_) { + if (g_Config.iShowStatusFlags && !invalid_) { DrawFPS(ctx, ctx->GetLayoutBounds()); } diff --git a/UI/GameSettingsScreen.cpp b/UI/GameSettingsScreen.cpp index 96ef0caa74..9c6a74bcd9 100644 --- a/UI/GameSettingsScreen.cpp +++ b/UI/GameSettingsScreen.cpp @@ -31,6 +31,7 @@ #include "Common/System/Display.h" // Only to check screen aspect ratio with pixel_yres/pixel_xres #include "Common/System/System.h" +#include "Common/Battery/Battery.h" #include "Common/System/NativeApp.h" #include "Common/Data/Color/RGBAUtil.h" #include "Common/Math/curves.h" @@ -211,22 +212,8 @@ void GameSettingsScreen::CreateViews() { // Scrolling action menu to the right. using namespace UI; - auto di = GetI18NCategory("Dialog"); - auto gr = GetI18NCategory("Graphics"); - auto co = GetI18NCategory("Controls"); - auto a = GetI18NCategory("Audio"); - auto sa = GetI18NCategory("Savedata"); - auto se = GetI18NCategory("Search"); - auto sy = GetI18NCategory("System"); - auto n = GetI18NCategory("Networking"); auto ms = GetI18NCategory("MainSettings"); - auto dev = GetI18NCategory("Developer"); - auto ri = GetI18NCategory("RemoteISO"); - auto ps = GetI18NCategory("PostShaders"); - auto th = GetI18NCategory("Themes"); - auto vr = GetI18NCategory("VR"); - - int deviceType = System_GetPropertyInt(SYSPROP_DEVICE_TYPE); + auto di = GetI18NCategory("Dialog"); root_ = new AnchorLayout(new LayoutParams(FILL_PARENT, FILL_PARENT)); @@ -259,10 +246,59 @@ void GameSettingsScreen::CreateViews() { settingInfo_->Show(oldSettingInfo_, nullptr); } - // TODO: These currently point to global settings, not game specific ones. - - // Graphics LinearLayout *graphicsSettings = AddTab("GameSettingsGraphics", ms->T("Graphics")); + CreateGraphicsSettings(graphicsSettings); + + LinearLayout *controlsSettings = AddTab("GameSettingsControls", ms->T("Controls")); + CreateControlsSettings(controlsSettings); + + LinearLayout *audioSettings = AddTab("GameSettingsAudio", ms->T("Audio")); + CreateAudioSettings(audioSettings); + + LinearLayout *networkingSettings = AddTab("GameSettingsNetworking", ms->T("Networking")); + CreateNetworkingSettings(networkingSettings); + + LinearLayout *tools = AddTab("GameSettingsTools", ms->T("Tools")); + CreateToolsSettings(tools); + + LinearLayout *systemSettings = AddTab("GameSettingsSystem", ms->T("System")); + systemSettings->SetSpacing(0); + CreateSystemSettings(systemSettings); + + int deviceType = System_GetPropertyInt(SYSPROP_DEVICE_TYPE); + if (deviceType == DEVICE_TYPE_VR) { + LinearLayout *vrSettings = AddTab("GameSettingsVR", ms->T("VR")); + CreateVRSettings(vrSettings); + } + +#if !defined(MOBILE_DEVICE) || PPSSPP_PLATFORM(ANDROID) + // Hide search if screen is too small. + if (dp_xres < dp_yres || dp_yres >= 500) { + auto se = GetI18NCategory("Search"); + // Search + LinearLayout *searchSettings = AddTab("GameSettingsSearch", ms->T("Search"), true); + + searchSettings->Add(new ItemHeader(se->T("Find settings"))); + if (System_GetPropertyBool(SYSPROP_HAS_KEYBOARD)) { + searchSettings->Add(new ChoiceWithValueDisplay(&searchFilter_, se->T("Filter"), (const char *)nullptr))->OnClick.Handle(this, &GameSettingsScreen::OnChangeSearchFilter); + } else { + searchSettings->Add(new PopupTextInputChoice(&searchFilter_, se->T("Filter"), "", 64, screenManager()))->OnChange.Handle(this, &GameSettingsScreen::OnChangeSearchFilter); + } + clearSearchChoice_ = searchSettings->Add(new Choice(se->T("Clear filter"))); + clearSearchChoice_->OnClick.Handle(this, &GameSettingsScreen::OnClearSearchFilter); + noSearchResults_ = searchSettings->Add(new TextView(se->T("No settings matched '%1'"), new LinearLayoutParams(Margins(20, 5)))); + + ApplySearchFilter(); + } +#endif +} + +// Graphics +void GameSettingsScreen::CreateGraphicsSettings(UI::ViewGroup *graphicsSettings) { + auto gr = GetI18NCategory("Graphics"); + auto vr = GetI18NCategory("VR"); + + using namespace UI; graphicsSettings->Add(new ItemHeader(gr->T("Rendering Mode"))); @@ -307,6 +343,8 @@ void GameSettingsScreen::CreateViews() { return !g_Config.bSoftwareRendering && !g_Config.bSkipBufferEffects; }); + int deviceType = System_GetPropertyInt(SYSPROP_DEVICE_TYPE); + if (deviceType != DEVICE_TYPE_VR) { CheckBox *softwareGPU = graphicsSettings->Add(new CheckBox(&g_Config.bSoftwareRendering, gr->T("Software Rendering", "Software Rendering (slow)"))); softwareGPU->SetEnabled(!PSP_IsInited()); @@ -563,12 +601,20 @@ void GameSettingsScreen::CreateViews() { }); graphicsSettings->Add(new ItemHeader(gr->T("Overlay Information"))); - static const char *fpsChoices[] = { "None", "Speed", "FPS", "Both" }; - graphicsSettings->Add(new PopupMultiChoice(&g_Config.iShowFPSCounter, gr->T("Show FPS Counter"), fpsChoices, 0, ARRAY_SIZE(fpsChoices), gr->GetName(), screenManager())); - graphicsSettings->Add(new CheckBox(&g_Config.bShowDebugStats, gr->T("Show Debug Statistics")))->OnClick.Handle(this, &GameSettingsScreen::OnJitAffectingSetting); + graphicsSettings->Add(new BitCheckBox(&g_Config.iShowStatusFlags, (int)ShowStatusFlags::FPS_COUNTER, gr->T("Show FPS Counter"))); + graphicsSettings->Add(new BitCheckBox(&g_Config.iShowStatusFlags, (int)ShowStatusFlags::SPEED_COUNTER, gr->T("Show Speed"))); +#ifdef CAN_DISPLAY_CURRENT_BATTERY_CAPACITY + graphicsSettings->Add(new BitCheckBox(&g_Config.iShowStatusFlags, (int)ShowStatusFlags::BATTERY_PERCENT, gr->T("Show Battery %"))); +#endif - // Audio - LinearLayout *audioSettings = AddTab("GameSettingsAudio", ms->T("Audio")); + graphicsSettings->Add(new CheckBox(&g_Config.bShowDebugStats, gr->T("Show Debug Statistics")))->OnClick.Handle(this, &GameSettingsScreen::OnJitAffectingSetting); +} + +void GameSettingsScreen::CreateAudioSettings(UI::ViewGroup *audioSettings) { + using namespace UI; + + auto a = GetI18NCategory("Audio"); + auto ms = GetI18NCategory("MainSettings"); audioSettings->Add(new ItemHeader(ms->T("Audio"))); audioSettings->Add(new CheckBox(&g_Config.bEnableSound, a->T("Enable Sound"))); @@ -626,9 +672,15 @@ void GameSettingsScreen::CreateViews() { PopupMultiChoiceDynamic *MicChoice = audioSettings->Add(new PopupMultiChoiceDynamic(&g_Config.sMicDevice, a->T("Microphone Device"), micList, nullptr, screenManager())); MicChoice->OnChoice.Handle(this, &GameSettingsScreen::OnMicDeviceChange); } +} - // Control - LinearLayout *controlsSettings = AddTab("GameSettingsControls", ms->T("Controls")); +void GameSettingsScreen::CreateControlsSettings(UI::ViewGroup *controlsSettings) { + using namespace UI; + + auto co = GetI18NCategory("Controls"); + auto ms = GetI18NCategory("MainSettings"); + + int deviceType = System_GetPropertyInt(SYSPROP_DEVICE_TYPE); controlsSettings->Add(new ItemHeader(ms->T("Controls"))); controlsSettings->Add(new Choice(co->T("Control Mapping")))->OnClick.Handle(this, &GameSettingsScreen::OnControlMapping); @@ -718,7 +770,7 @@ void GameSettingsScreen::CreateViews() { controlsSettings->Add(new ItemHeader(co->T("Mouse", "Mouse settings"))); CheckBox *mouseControl = controlsSettings->Add(new CheckBox(&g_Config.bMouseControl, co->T("Use Mouse Control"))); mouseControl->OnClick.Add([=](EventParams &e) { - if(g_Config.bMouseControl) + if (g_Config.bMouseControl) settingInfo_->Show(co->T("MouseControl Tip", "You can now map mouse in control mapping screen by pressing the 'M' icon."), e.v); return UI::EVENT_CONTINUE; }); @@ -727,8 +779,13 @@ void GameSettingsScreen::CreateViews() { controlsSettings->Add(new PopupSliderChoiceFloat(&g_Config.fMouseSmoothing, 0.0f, 0.95f, co->T("Mouse smoothing"), 0.05f, screenManager(), "x"))->SetEnabledPtr(&g_Config.bMouseControl); #endif } +} - LinearLayout *networkingSettings = AddTab("GameSettingsNetworking", ms->T("Networking")); +void GameSettingsScreen::CreateNetworkingSettings(UI::ViewGroup *networkingSettings) { + using namespace UI; + + auto n = GetI18NCategory("Networking"); + auto ms = GetI18NCategory("MainSettings"); networkingSettings->Add(new ItemHeader(ms->T("Networking"))); @@ -813,8 +870,16 @@ void GameSettingsScreen::CreateViews() { networkingSettings->Add(new PopupSliderChoice(&g_Config.iPortOffset, 0, 60000, n->T("Port offset", "Port offset (0 = PSP compatibility)"), 100, screenManager())); networkingSettings->Add(new PopupSliderChoice(&g_Config.iMinTimeout, 0, 15000, n->T("Minimum Timeout", "Minimum Timeout (override in ms, 0 = default)"), 50, screenManager())); networkingSettings->Add(new CheckBox(&g_Config.bForcedFirstConnect, n->T("Forced First Connect", "Forced First Connect (faster Connect)"))); +} - LinearLayout *tools = AddTab("GameSettingsTools", ms->T("Tools")); +void GameSettingsScreen::CreateToolsSettings(UI::ViewGroup *tools) { + using namespace UI; + + auto sa = GetI18NCategory("Savedata"); + auto sy = GetI18NCategory("System"); + auto ms = GetI18NCategory("MainSettings"); + auto dev = GetI18NCategory("Developer"); + auto ri = GetI18NCategory("RemoteISO"); tools->Add(new ItemHeader(ms->T("Tools"))); // These were moved here so use the wrong translation objects, to avoid having to change all inis... This isn't a sustainable situation :P @@ -822,9 +887,14 @@ void GameSettingsScreen::CreateViews() { tools->Add(new Choice(dev->T("System Information")))->OnClick.Handle(this, &GameSettingsScreen::OnSysInfo); tools->Add(new Choice(sy->T("Developer Tools")))->OnClick.Handle(this, &GameSettingsScreen::OnDeveloperTools); tools->Add(new Choice(ri->T("Remote disc streaming")))->OnClick.Handle(this, &GameSettingsScreen::OnRemoteISO); +} - // System - LinearLayout *systemSettings = AddTab("GameSettingsSystem", ms->T("System")); +void GameSettingsScreen::CreateSystemSettings(UI::ViewGroup *systemSettings) { + using namespace UI; + + auto sy = GetI18NCategory("System"); + auto vr = GetI18NCategory("VR"); + auto th = GetI18NCategory("Themes"); systemSettings->Add(new ItemHeader(sy->T("UI"))); @@ -870,10 +940,11 @@ void GameSettingsScreen::CreateViews() { PopupMultiChoiceDynamic *theme = systemSettings->Add(new PopupMultiChoiceDynamic(&g_Config.sThemeName, sy->T("Theme"), GetThemeInfoNames(), th->GetName(), screenManager())); theme->OnChoice.Add([=](EventParams &e) { UpdateTheme(screenManager()->getUIContext()); - return UI::EVENT_CONTINUE; }); + Draw::DrawContext *draw = screenManager()->getDrawContext(); + if (!draw->GetBugs().Has(Draw::Bugs::RASPBERRY_SHADER_COMP_HANG)) { // We use shaders without tint capability on hardware with this driver bug. PopupSliderChoiceFloat *tint = new PopupSliderChoiceFloat(&g_Config.fUITint, 0.0, 1.0, sy->T("Color Tint"), 0.01f, screenManager()); @@ -991,6 +1062,8 @@ void GameSettingsScreen::CreateViews() { #if PPSSPP_PLATFORM(ANDROID) if (System_GetPropertyInt(SYSPROP_DEVICE_TYPE) == DEVICE_TYPE_MOBILE) { + auto co = GetI18NCategory("Controls"); + static const char *screenRotation[] = { "Auto", "Landscape", "Portrait", "Landscape Reversed", "Portrait Reversed", "Landscape Auto" }; PopupMultiChoice *rot = systemSettings->Add(new PopupMultiChoice(&g_Config.iScreenRotation, co->T("Screen Rotation"), screenRotation, 0, ARRAY_SIZE(screenRotation), co->GetName(), screenManager())); rot->OnChoice.Handle(this, &GameSettingsScreen::OnScreenRotation); @@ -1000,7 +1073,6 @@ void GameSettingsScreen::CreateViews() { } } #endif - systemSettings->Add(new CheckBox(&g_Config.bCheckForNewVersion, sy->T("VersionCheck", "Check for new versions of PPSSPP"))); systemSettings->Add(new Choice(sy->T("Restore Default Settings")))->OnClick.Handle(this, &GameSettingsScreen::OnRestoreDefaultSettings); systemSettings->Add(new CheckBox(&g_Config.bEnableStateUndo, sy->T("Savestate slot backups"))); @@ -1010,6 +1082,7 @@ void GameSettingsScreen::CreateViews() { systemSettings->Add(new CheckBox(&g_Config.bBypassOSKWithKeyboard, sy->T("Use system native keyboard"))); systemSettings->Add(new CheckBox(&g_Config.bCacheFullIsoInRam, sy->T("Cache ISO in RAM", "Cache full ISO in RAM")))->SetEnabled(!PSP_IsInited()); + systemSettings->Add(new CheckBox(&g_Config.bCheckForNewVersion, sy->T("VersionCheck", "Check for new versions of PPSSPP"))); systemSettings->Add(new ItemHeader(sy->T("Cheats", "Cheats"))); CheckBox *enableCheats = systemSettings->Add(new CheckBox(&g_Config.bEnableCheats, sy->T("Enable Cheats"))); @@ -1017,10 +1090,9 @@ void GameSettingsScreen::CreateViews() { enableReportsCheckbox_->SetEnabled(Reporting::IsSupported()); return UI::EVENT_CONTINUE; }); - systemSettings->SetSpacing(0); systemSettings->Add(new ItemHeader(sy->T("PSP Settings"))); - static const char *models[] = {"PSP-1000", "PSP-2000/3000"}; + static const char *models[] = { "PSP-1000", "PSP-2000/3000" }; systemSettings->Add(new PopupMultiChoice(&g_Config.iPSPModel, sy->T("PSP Model"), models, 0, ARRAY_SIZE(models), sy->GetName(), screenManager()))->SetEnabled(!PSP_IsInited()); // TODO: Come up with a way to display a keyboard for mobile users, // so until then, this is Windows/Desktop only. @@ -1043,52 +1115,41 @@ void GameSettingsScreen::CreateViews() { systemSettings->Add(new CheckBox(&g_Config.bSaveLoadResetsAVdumping, sy->T("Reset Recording on Save/Load State"))); #endif systemSettings->Add(new CheckBox(&g_Config.bDayLightSavings, sy->T("Day Light Saving"))); - static const char *dateFormat[] = { "YYYYMMDD", "MMDDYYYY", "DDMMYYYY"}; + static const char *dateFormat[] = { "YYYYMMDD", "MMDDYYYY", "DDMMYYYY" }; systemSettings->Add(new PopupMultiChoice(&g_Config.iDateFormat, sy->T("Date Format"), dateFormat, 0, 3, sy->GetName(), screenManager())); static const char *timeFormat[] = { "24HR", "12HR" }; systemSettings->Add(new PopupMultiChoice(&g_Config.iTimeFormat, sy->T("Time Format"), timeFormat, 0, 2, sy->GetName(), screenManager())); static const char *buttonPref[] = { "Use O to confirm", "Use X to confirm" }; systemSettings->Add(new PopupMultiChoice(&g_Config.iButtonPreference, sy->T("Confirmation Button"), buttonPref, 0, 2, sy->GetName(), screenManager())); +} -#if !defined(MOBILE_DEVICE) || PPSSPP_PLATFORM(ANDROID) - // Hide search if screen is too small. - if (dp_xres < dp_yres || dp_yres >= 500) { - // Search - LinearLayout *searchSettings = AddTab("GameSettingsSearch", ms->T("Search"), true); +void GameSettingsScreen::CreateVRSettings(UI::ViewGroup *vrSettings) { + using namespace UI; - searchSettings->Add(new ItemHeader(se->T("Find settings"))); - if (System_GetPropertyBool(SYSPROP_HAS_KEYBOARD)) { - searchSettings->Add(new ChoiceWithValueDisplay(&searchFilter_, se->T("Filter"), (const char *)nullptr))->OnClick.Handle(this, &GameSettingsScreen::OnChangeSearchFilter); - } else { - searchSettings->Add(new PopupTextInputChoice(&searchFilter_, se->T("Filter"), "", 64, screenManager()))->OnChange.Handle(this, &GameSettingsScreen::OnChangeSearchFilter); - } - clearSearchChoice_ = searchSettings->Add(new Choice(se->T("Clear filter"))); - clearSearchChoice_->OnClick.Handle(this, &GameSettingsScreen::OnClearSearchFilter); - noSearchResults_ = searchSettings->Add(new TextView(se->T("No settings matched '%1'"), new LinearLayoutParams(Margins(20, 5)))); + auto vr = GetI18NCategory("VR"); - ApplySearchFilter(); - } -#endif + vrSettings->Add(new ItemHeader(vr->T("Virtual reality"))); + vrSettings->Add(new CheckBox(&g_Config.bEnableVR, vr->T("Virtual reality"))); + CheckBox *vr6DoF = vrSettings->Add(new CheckBox(&g_Config.bEnable6DoF, vr->T("6DoF movement"))); + vr6DoF->SetEnabledPtr(&g_Config.bEnableVR); + vrSettings->Add(new CheckBox(&g_Config.bEnableStereo, vr->T("Stereoscopic vision (Experimental)"))); + vrSettings->Add(new CheckBox(&g_Config.bForce72Hz, vr->T("Force 72Hz update"))); - if (deviceType == DEVICE_TYPE_VR) { - LinearLayout *vrSettings = AddTab("GameSettingsVR", ms->T("VR")); - vrSettings->Add(new ItemHeader(vr->T("Virtual reality"))); - vrSettings->Add(new CheckBox(&g_Config.bEnableVR, vr->T("Virtual reality"))); - CheckBox *vr6DoF = vrSettings->Add(new CheckBox(&g_Config.bEnable6DoF, vr->T("6DoF movement"))); - vr6DoF->SetEnabledPtr(&g_Config.bEnableVR); - vrSettings->Add(new CheckBox(&g_Config.bEnableStereo, vr->T("Stereoscopic vision (Experimental)"))); - vrSettings->Add(new CheckBox(&g_Config.bForce72Hz, vr->T("Force 72Hz update"))); + vrSettings->Add(new ItemHeader(vr->T("VR camera"))); + vrSettings->Add(new PopupSliderChoiceFloat(&g_Config.fCanvasDistance, 1.0f, 15.0f, vr->T("Distance to 2D menus and scenes"), 1.0f, screenManager(), "")); + vrSettings->Add(new PopupSliderChoiceFloat(&g_Config.fFieldOfViewPercentage, 100.0f, 200.0f, vr->T("Field of view scale"), 10.0f, screenManager(), vr->T("% of native FoV"))); + vrSettings->Add(new PopupSliderChoiceFloat(&g_Config.fHeadUpDisplayScale, 0.0f, 1.5f, vr->T("Heads-up display scale"), 0.1f, screenManager(), "")); - vrSettings->Add(new ItemHeader(vr->T("VR camera"))); - vrSettings->Add(new PopupSliderChoiceFloat(&g_Config.fCanvasDistance, 1.0f, 15.0f, vr->T("Distance to 2D menus and scenes"), 1.0f, screenManager(), "")); - vrSettings->Add(new PopupSliderChoiceFloat(&g_Config.fFieldOfViewPercentage, 100.0f, 200.0f, vr->T("Field of view scale"), 10.0f, screenManager(), vr->T("% of native FoV"))); - vrSettings->Add(new PopupSliderChoiceFloat(&g_Config.fHeadUpDisplayScale, 0.0f, 1.5f, vr->T("Heads-up display scale"), 0.1f, screenManager(), "")); - - vrSettings->Add(new ItemHeader(vr->T("VR controllers"))); - vrSettings->Add(new CheckBox(&g_Config.bEnableMotions, vr->T("Map controller movements to keys"))); - PopupSliderChoiceFloat *vrMotions = vrSettings->Add(new PopupSliderChoiceFloat(&g_Config.fMotionLength, 0.3f, 1.0f, vr->T("Motion needed to generate action"), 0.1f, screenManager(), vr->T("m"))); - vrMotions->SetEnabledPtr(&g_Config.bEnableMotions); - } + vrSettings->Add(new ItemHeader(vr->T("Experts only"))); + static const char *vrHeadRotations[] = { vr->T("Disabled"), vr->T("Horizontal only"), vr->T("Horizontal and vertical") }; + vrSettings->Add(new PopupMultiChoice(&g_Config.iHeadRotation, vr->T("Map HMD rotations on keys instead of VR camera"), vrHeadRotations, 0, ARRAY_SIZE(vrHeadRotations), vr->GetName(), screenManager())); + PopupSliderChoiceFloat *vrHeadRotationScale = vrSettings->Add(new PopupSliderChoiceFloat(&g_Config.fHeadRotationScale, 0.1f, 10.0f, vr->T("Game camera rotation step per frame"), 0.1f, screenManager(), "°")); + vrHeadRotationScale->SetEnabledFunc([&] { return g_Config.iHeadRotation > 0; }); + CheckBox *vrHeadRotationSmoothing = vrSettings->Add(new CheckBox(&g_Config.bHeadRotationSmoothing, vr->T("Game camera uses rotation smoothing"))); + vrHeadRotationSmoothing->SetEnabledFunc([&] { return g_Config.iHeadRotation > 0; }); + vrSettings->Add(new CheckBox(&g_Config.bEnableMotions, vr->T("Map controller movements to keys"))); + PopupSliderChoiceFloat *vrMotions = vrSettings->Add(new PopupSliderChoiceFloat(&g_Config.fMotionLength, 0.3f, 1.0f, vr->T("Motion needed to generate action"), 0.1f, screenManager(), vr->T("m"))); + vrMotions->SetEnabledPtr(&g_Config.bEnableMotions); } UI::LinearLayout *GameSettingsScreen::AddTab(const char *tag, const std::string &title, bool isSearch) { @@ -1834,27 +1895,24 @@ void DeveloperToolsScreen::onFinish(DialogResult result) { } void GameSettingsScreen::CallbackRestoreDefaults(bool yes) { - if (yes) - g_Config.RestoreDefaults(); + if (yes) { + g_Config.RestoreDefaults(RestoreSettingsBits::SETTINGS); + } host->UpdateUI(); } UI::EventReturn GameSettingsScreen::OnRestoreDefaultSettings(UI::EventParams &e) { auto dev = GetI18NCategory("Developer"); auto di = GetI18NCategory("Dialog"); - if (g_Config.bGameSpecific) - { + auto sy = GetI18NCategory("System"); + if (g_Config.bGameSpecific) { screenManager()->push( new PromptScreen(gamePath_, dev->T("RestoreGameDefaultSettings", "Are you sure you want to restore the game-specific settings back to the ppsspp defaults?\n"), di->T("OK"), di->T("Cancel"), std::bind(&GameSettingsScreen::CallbackRestoreDefaults, this, std::placeholders::_1))); + } else { + const char *title = sy->T("Restore Default Settings"); + screenManager()->push(new RestoreSettingsScreen(title)); } - else - { - screenManager()->push( - new PromptScreen(gamePath_, dev->T("RestoreDefaultSettings", "Are you sure you want to restore all settings(except control mapping)\nback to their defaults?\nYou can't undo this.\nPlease restart PPSSPP after restoring settings."), di->T("OK"), di->T("Cancel"), - std::bind(&GameSettingsScreen::CallbackRestoreDefaults, this, std::placeholders::_1))); - } - return UI::EVENT_DONE; } @@ -2196,3 +2254,32 @@ void GestureMappingScreen::CreateViews() { vert->Add(new ItemHeader(co->T("Double tap"))); vert->Add(new PopupMultiChoice(&g_Config.iDoubleTapGesture, mc->T("Double tap button"), gestureButton, 0, ARRAY_SIZE(gestureButton), mc->GetName(), screenManager()))->SetEnabledPtr(&g_Config.bGestureControlEnabled); } + +RestoreSettingsScreen::RestoreSettingsScreen(const char *title) + : PopupScreen(title, "OK", "Cancel") {} + +void RestoreSettingsScreen::CreatePopupContents(UI::ViewGroup *parent) { + using namespace UI; + // Carefully re-use various translations. + auto ga = GetI18NCategory("Game"); + auto ms = GetI18NCategory("MainSettings"); + auto mm = GetI18NCategory("MainMenu"); + auto dev = GetI18NCategory("Developer"); + + const char *text = dev->T( + "RestoreDefaultSettings", + "Restore these settings back to their defaults?\nYou can't undo this.\nPlease restart PPSSPP after restoring settings."); + + TextView *textView = parent->Add(new TextView(text, FLAG_WRAP_TEXT, false)); + textView->SetPadding(10.0f); + + parent->Add(new BitCheckBox(&restoreFlags_, (int)RestoreSettingsBits::SETTINGS, ga->T("Game Settings"))); + parent->Add(new BitCheckBox(&restoreFlags_, (int)RestoreSettingsBits::CONTROLS, ga->T("Controls"))); + parent->Add(new BitCheckBox(&restoreFlags_, (int)RestoreSettingsBits::RECENT, mm->T("Recent"))); +} + +void RestoreSettingsScreen::OnCompleted(DialogResult result) { + if (result == DialogResult::DR_OK) { + g_Config.RestoreDefaults((RestoreSettingsBits)restoreFlags_); + } +} diff --git a/UI/GameSettingsScreen.h b/UI/GameSettingsScreen.h index 91d146bcd1..8471af21d3 100644 --- a/UI/GameSettingsScreen.h +++ b/UI/GameSettingsScreen.h @@ -21,7 +21,9 @@ #include #include #include + #include "Common/UI/UIScreen.h" +#include "Core/ConfigValues.h" #include "UI/MiscScreens.h" // Per-game settings screen - enables you to configure graphic options, control options, etc @@ -45,31 +47,39 @@ protected: void RecreateViews() override; private: + void CreateGraphicsSettings(UI::ViewGroup *graphicsSettings); + void CreateControlsSettings(UI::ViewGroup *tools); + void CreateAudioSettings(UI::ViewGroup *audioSettings); + void CreateNetworkingSettings(UI::ViewGroup *networkingSettings); + void CreateToolsSettings(UI::ViewGroup *tools); + void CreateSystemSettings(UI::ViewGroup *systemSettings); + void CreateVRSettings(UI::ViewGroup *vrSettings); + UI::LinearLayout *AddTab(const char *tag, const std::string &title, bool isSearch = false); void ApplySearchFilter(); void TriggerRestart(const char *why); std::string gameID_; - UI::CheckBox *enableReportsCheckbox_; - UI::Choice *layoutEditorChoice_; - UI::Choice *displayEditor_; + UI::CheckBox *enableReportsCheckbox_ = nullptr; + UI::Choice *layoutEditorChoice_ = nullptr; + UI::Choice *displayEditor_ = nullptr; UI::Choice *backgroundChoice_ = nullptr; - UI::PopupMultiChoice *resolutionChoice_; - UI::CheckBox *frameSkipAuto_; - SettingInfoMessage *settingInfo_; - UI::Choice *clearSearchChoice_; - UI::TextView *noSearchResults_; + UI::PopupMultiChoice *resolutionChoice_ = nullptr; + UI::CheckBox *frameSkipAuto_ = nullptr; + SettingInfoMessage *settingInfo_ = nullptr; + UI::Choice *clearSearchChoice_ = nullptr; + UI::TextView *noSearchResults_ = nullptr; #ifdef _WIN32 - UI::CheckBox *SavePathInMyDocumentChoice; - UI::CheckBox *SavePathInOtherChoice; + UI::CheckBox *SavePathInMyDocumentChoice = nullptr; + UI::CheckBox *SavePathInOtherChoice = nullptr; // Used to enable/disable the above two options. - bool installed_; - bool otherinstalled_; + bool installed_ = false; + bool otherinstalled_ = false; #endif std::string memstickDisplay_; - UI::TabHolder *tabHolder_; + UI::TabHolder *tabHolder_ = nullptr; std::vector settingTabContents_; std::vector settingTabFilterNotices_; @@ -125,18 +135,18 @@ private: UI::EventReturn OnClearSearchFilter(UI::EventParams &e); // Temporaries to convert setting types, cache enabled, etc. - int iAlternateSpeedPercent1_; - int iAlternateSpeedPercent2_; - int iAlternateSpeedPercentAnalog_; - int prevInflightFrames_; + int iAlternateSpeedPercent1_ = 0; + int iAlternateSpeedPercent2_ = 0; + int iAlternateSpeedPercentAnalog_ = 0; + int prevInflightFrames_ = -1; bool enableReports_ = false; bool enableReportsSet_ = false; bool analogSpeedMapped_ = false; std::string searchFilter_; - //edit the game-specific settings and restore the global settings after exiting - bool editThenRestore_; + // edit the game-specific settings and restore the global settings after exiting + bool editThenRestore_ = false; // Android-only std::string pendingMemstickFolder_; @@ -205,6 +215,7 @@ protected: private: void ResolverThread(); void SendEditKey(int keyCode, int flags = 0); + UI::EventReturn OnNumberClick(UI::EventParams &e); UI::EventReturn OnPointClick(UI::EventParams &e); UI::EventReturn OnDeleteClick(UI::EventParams &e); @@ -244,3 +255,14 @@ public: const char *tag() const override { return "GestureMapping"; } }; + +class RestoreSettingsScreen : public PopupScreen { +public: + RestoreSettingsScreen(const char *title); + void CreatePopupContents(UI::ViewGroup *parent) override; + + const char *tag() const override { return "RestoreSettingsScreen"; } +private: + void OnCompleted(DialogResult result) override; + int restoreFlags_ = (int)(RestoreSettingsBits::SETTINGS); // RestoreSettingsBits enum +}; diff --git a/UI/GamepadEmu.h b/UI/GamepadEmu.h index 9ec5d96556..96211f5a58 100644 --- a/UI/GamepadEmu.h +++ b/UI/GamepadEmu.h @@ -319,6 +319,10 @@ namespace CustomKey { #ifndef MOBILE_DEVICE { ImageID::invalid(), VIRTKEY_RECORD }, #endif + { ImageID::invalid(), VIRTKEY_AXIS_X_MIN }, + { ImageID::invalid(), VIRTKEY_AXIS_Y_MIN }, + { ImageID::invalid(), VIRTKEY_AXIS_X_MAX }, + { ImageID::invalid(), VIRTKEY_AXIS_Y_MAX }, }; static_assert(ARRAY_SIZE(comboKeyList) <= 64, "Too many key for a uint64_t bit mask"); }; @@ -357,5 +361,9 @@ namespace GestureKey { #ifndef MOBILE_DEVICE VIRTKEY_RECORD, #endif + VIRTKEY_AXIS_X_MIN, + VIRTKEY_AXIS_Y_MIN, + VIRTKEY_AXIS_X_MAX, + VIRTKEY_AXIS_Y_MAX, }; } diff --git a/UI/MainScreen.cpp b/UI/MainScreen.cpp index 4d4cdfb6f3..3a9bfa515d 100644 --- a/UI/MainScreen.cpp +++ b/UI/MainScreen.cpp @@ -1024,10 +1024,10 @@ void MainScreen::CreateViews() { scrollHomebrew->SetTag("MainScreenHomebrew"); GameBrowser *tabAllGames = new GameBrowser(Path(g_Config.currentDirectory), BrowseFlags::STANDARD, &g_Config.bGridView2, screenManager(), - mm->T("How to get games"), "https://www.ppsspp.org/getgames.html", + mm->T("How to get games"), "https://www.ppsspp.org/getgames", new LinearLayoutParams(FILL_PARENT, FILL_PARENT)); GameBrowser *tabHomebrew = new GameBrowser(GetSysDirectory(DIRECTORY_GAME), BrowseFlags::HOMEBREW_STORE, &g_Config.bGridView3, screenManager(), - mm->T("How to get homebrew & demos", "How to get homebrew && demos"), "https://www.ppsspp.org/gethomebrew.html", + mm->T("How to get homebrew & demos", "How to get homebrew && demos"), "https://www.ppsspp.org/gethomebrew", new LinearLayoutParams(FILL_PARENT, FILL_PARENT)); scrollAllGames_->Add(tabAllGames); @@ -1221,7 +1221,7 @@ UI::EventReturn MainScreen::OnDownloadUpgrade(UI::EventParams &e) { LaunchBrowser("market://details?id=org.ppsspp.ppsspp"); } #elif PPSSPP_PLATFORM(WINDOWS) - LaunchBrowser("https://www.ppsspp.org/downloads.html"); + LaunchBrowser("https://www.ppsspp.org/download"); #else // Go directly to ppsspp.org and let the user sort it out // (for details and in case downloads doesn't have their platform.) @@ -1406,7 +1406,7 @@ UI::EventReturn MainScreen::OnSupport(UI::EventParams &e) { #ifdef __ANDROID__ LaunchBrowser("market://details?id=org.ppsspp.ppssppgold"); #else - LaunchBrowser("https://central.ppsspp.org/buygold"); + LaunchBrowser("https://www.ppsspp.org/buygold"); #endif return UI::EVENT_DONE; } diff --git a/UI/MemStickScreen.cpp b/UI/MemStickScreen.cpp index 374c4683a0..53030fd9d0 100644 --- a/UI/MemStickScreen.cpp +++ b/UI/MemStickScreen.cpp @@ -302,6 +302,8 @@ void MemStickScreen::CreateViews() { } UI::EventReturn MemStickScreen::OnHelp(UI::EventParams ¶ms) { + // I'm letting the old redirect handle this one, as the target is within /docs on the website, + // and that structure may change a bit. LaunchBrowser("https://www.ppsspp.org/guide_storage.html"); return UI::EVENT_DONE; diff --git a/UI/MiscScreens.cpp b/UI/MiscScreens.cpp index 492c6e88e2..c1bb989b01 100644 --- a/UI/MiscScreens.cpp +++ b/UI/MiscScreens.cpp @@ -842,7 +842,7 @@ UI::EventReturn CreditsScreen::OnSupport(UI::EventParams &e) { #ifdef __ANDROID__ LaunchBrowser("market://details?id=org.ppsspp.ppssppgold"); #else - LaunchBrowser("https://central.ppsspp.org/buygold"); + LaunchBrowser("https://www.ppsspp.org/buygold"); #endif return UI::EVENT_DONE; } @@ -862,7 +862,7 @@ UI::EventReturn CreditsScreen::OnPPSSPPOrg(UI::EventParams &e) { } UI::EventReturn CreditsScreen::OnPrivacy(UI::EventParams &e) { - LaunchBrowser("https://www.ppsspp.org/privacy.html"); + LaunchBrowser("https://www.ppsspp.org/privacy"); return UI::EVENT_DONE; } diff --git a/UI/NativeApp.cpp b/UI/NativeApp.cpp index 24fa1d028c..c65074adf5 100644 --- a/UI/NativeApp.cpp +++ b/UI/NativeApp.cpp @@ -1479,7 +1479,7 @@ void NativeInputBoxReceived(std::function cb, b void NativeResized() { // NativeResized can come from any thread so we just set a flag, then process it later. - INFO_LOG(G3D, "NativeResized - setting flag"); + VERBOSE_LOG(G3D, "NativeResized - setting flag"); resized = true; } diff --git a/UWP/CommonUWP/CommonUWP.vcxproj b/UWP/CommonUWP/CommonUWP.vcxproj index 7836bc30ce..99e542cc99 100644 --- a/UWP/CommonUWP/CommonUWP.vcxproj +++ b/UWP/CommonUWP/CommonUWP.vcxproj @@ -662,6 +662,11 @@ + + + {c249f016-7f82-45cf-bb6e-0642a988c4d3} + + diff --git a/UWP/PPSSPP_UWP.sln b/UWP/PPSSPP_UWP.sln index 42c7eddb2e..8fe54683af 100644 --- a/UWP/PPSSPP_UWP.sln +++ b/UWP/PPSSPP_UWP.sln @@ -32,6 +32,8 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libzstd_UWP", "libzstd_UWP\ EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "miniupnpc_UWP", "miniupnpc_UWP\miniupnpc_UWP.vcxproj", "{D31FD4F0-53EB-477C-9DC7-149796F628E2}" EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "cpu_features_UWP", "cpu_features_UWP\cpu_features_UWP.vcxproj", "{C249F016-7F82-45CF-BB6E-0642A988C4D3}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|ARM = Debug|ARM @@ -372,6 +374,30 @@ Global {D31FD4F0-53EB-477C-9DC7-149796F628E2}.UWP Gold|Win32.Build.0 = UWP Gold|Win32 {D31FD4F0-53EB-477C-9DC7-149796F628E2}.UWP Gold|x64.ActiveCfg = UWP Gold|x64 {D31FD4F0-53EB-477C-9DC7-149796F628E2}.UWP Gold|x64.Build.0 = UWP Gold|x64 + {C249F016-7F82-45CF-BB6E-0642A988C4D3}.Debug|ARM.ActiveCfg = Debug|ARM + {C249F016-7F82-45CF-BB6E-0642A988C4D3}.Debug|ARM.Build.0 = Debug|ARM + {C249F016-7F82-45CF-BB6E-0642A988C4D3}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {C249F016-7F82-45CF-BB6E-0642A988C4D3}.Debug|ARM64.Build.0 = Debug|ARM64 + {C249F016-7F82-45CF-BB6E-0642A988C4D3}.Debug|Win32.ActiveCfg = Debug|Win32 + {C249F016-7F82-45CF-BB6E-0642A988C4D3}.Debug|Win32.Build.0 = Debug|Win32 + {C249F016-7F82-45CF-BB6E-0642A988C4D3}.Debug|x64.ActiveCfg = Debug|x64 + {C249F016-7F82-45CF-BB6E-0642A988C4D3}.Debug|x64.Build.0 = Debug|x64 + {C249F016-7F82-45CF-BB6E-0642A988C4D3}.Release|ARM.ActiveCfg = Release|ARM + {C249F016-7F82-45CF-BB6E-0642A988C4D3}.Release|ARM.Build.0 = Release|ARM + {C249F016-7F82-45CF-BB6E-0642A988C4D3}.Release|ARM64.ActiveCfg = Release|ARM64 + {C249F016-7F82-45CF-BB6E-0642A988C4D3}.Release|ARM64.Build.0 = Release|ARM64 + {C249F016-7F82-45CF-BB6E-0642A988C4D3}.Release|Win32.ActiveCfg = Release|Win32 + {C249F016-7F82-45CF-BB6E-0642A988C4D3}.Release|Win32.Build.0 = Release|Win32 + {C249F016-7F82-45CF-BB6E-0642A988C4D3}.Release|x64.ActiveCfg = Release|x64 + {C249F016-7F82-45CF-BB6E-0642A988C4D3}.Release|x64.Build.0 = Release|x64 + {C249F016-7F82-45CF-BB6E-0642A988C4D3}.UWP Gold|ARM.ActiveCfg = UWP Gold|ARM + {C249F016-7F82-45CF-BB6E-0642A988C4D3}.UWP Gold|ARM.Build.0 = UWP Gold|ARM + {C249F016-7F82-45CF-BB6E-0642A988C4D3}.UWP Gold|ARM64.ActiveCfg = UWP Gold|ARM64 + {C249F016-7F82-45CF-BB6E-0642A988C4D3}.UWP Gold|ARM64.Build.0 = UWP Gold|ARM64 + {C249F016-7F82-45CF-BB6E-0642A988C4D3}.UWP Gold|Win32.ActiveCfg = UWP Gold|Win32 + {C249F016-7F82-45CF-BB6E-0642A988C4D3}.UWP Gold|Win32.Build.0 = UWP Gold|Win32 + {C249F016-7F82-45CF-BB6E-0642A988C4D3}.UWP Gold|x64.ActiveCfg = UWP Gold|x64 + {C249F016-7F82-45CF-BB6E-0642A988C4D3}.UWP Gold|x64.Build.0 = UWP Gold|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/UWP/cpu_features_UWP/cpu_features_UWP.vcxproj b/UWP/cpu_features_UWP/cpu_features_UWP.vcxproj new file mode 100644 index 0000000000..f4d225d3b3 --- /dev/null +++ b/UWP/cpu_features_UWP/cpu_features_UWP.vcxproj @@ -0,0 +1,442 @@ + + + + + Debug + ARM + + + Debug + ARM64 + + + Debug + Win32 + + + Debug + x64 + + + Release + ARM + + + Release + ARM64 + + + Release + Win32 + + + Release + x64 + + + UWP Gold + ARM + + + UWP Gold + ARM64 + + + UWP Gold + Win32 + + + UWP Gold + x64 + + + + {C249F016-7F82-45CF-BB6E-0642A988C4D3} + StaticLibrary + cpufeatures + en-US + 14.0 + true + Windows Store + 10.0.15063.0 + 10.0 + 10.0.17763.0 + + + + StaticLibrary + true + + + StaticLibrary + true + + + StaticLibrary + true + + + StaticLibrary + true + + + StaticLibrary + false + true + + + StaticLibrary + false + true + + + StaticLibrary + false + false + + + StaticLibrary + false + false + + + StaticLibrary + false + false + + + StaticLibrary + false + false + + + StaticLibrary + false + true + + + StaticLibrary + false + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + + Use + false + true + pch.h + ../../ext/cpu_features/include + STACK_LINE_READER_BUFFER_SIZE=1024;%(PreprocessorDefinitions) + + + Console + false + false + + + + + Use + false + true + pch.h + ../../ext/cpu_features/include + STACK_LINE_READER_BUFFER_SIZE=1024;%(PreprocessorDefinitions) + + + Console + false + false + + + + + Use + false + true + pch.h + ../../ext/cpu_features/include + STACK_LINE_READER_BUFFER_SIZE=1024;%(PreprocessorDefinitions) + + + Console + false + false + + + + + Use + false + true + pch.h + ../../ext/cpu_features/include + STACK_LINE_READER_BUFFER_SIZE=1024;%(PreprocessorDefinitions) + + + Console + false + false + + + + + Use + false + true + pch.h + ../../ext/cpu_features/include + STACK_LINE_READER_BUFFER_SIZE=1024;%(PreprocessorDefinitions) + + + Console + false + false + + + + + Use + false + true + pch.h + ../../ext/cpu_features/include + STACK_LINE_READER_BUFFER_SIZE=1024;%(PreprocessorDefinitions) + + + Console + false + false + + + + + Use + false + true + pch.h + ../../ext/cpu_features/include + STACK_LINE_READER_BUFFER_SIZE=1024;%(PreprocessorDefinitions) + + + Console + false + false + + + + + Use + false + true + pch.h + ../../ext/cpu_features/include + STACK_LINE_READER_BUFFER_SIZE=1024;%(PreprocessorDefinitions) + + + Console + false + false + + + + + Use + false + true + pch.h + ../../ext/cpu_features/include + STACK_LINE_READER_BUFFER_SIZE=1024;%(PreprocessorDefinitions) + + + Console + false + false + + + + + Use + false + true + pch.h + ../../ext/cpu_features/include + STACK_LINE_READER_BUFFER_SIZE=1024;%(PreprocessorDefinitions) + + + Console + false + false + + + + + Use + false + true + pch.h + ../../ext/cpu_features/include + STACK_LINE_READER_BUFFER_SIZE=1024;%(PreprocessorDefinitions) + + + Console + false + false + + + + + Use + false + true + pch.h + ../../ext/cpu_features/include + STACK_LINE_READER_BUFFER_SIZE=1024;%(PreprocessorDefinitions) + + + Console + false + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Create + Create + Create + Create + Create + Create + Create + Create + Create + Create + Create + Create + + + + + + diff --git a/UWP/cpu_features_UWP/cpu_features_UWP.vcxproj.filters b/UWP/cpu_features_UWP/cpu_features_UWP.vcxproj.filters new file mode 100644 index 0000000000..0fad65bc31 --- /dev/null +++ b/UWP/cpu_features_UWP/cpu_features_UWP.vcxproj.filters @@ -0,0 +1,133 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;hm;inl;inc;ipp;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + {530543f7-fdda-43c7-8982-427e4d69e74d} + + + + + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files\internal + + + Header Files\internal + + + Header Files\internal + + + Header Files\internal + + + Header Files\internal + + + Header Files\internal + + + + + Resource Files + + + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + diff --git a/UWP/cpu_features_UWP/pch.c b/UWP/cpu_features_UWP/pch.c new file mode 100644 index 0000000000..bcb5590be1 --- /dev/null +++ b/UWP/cpu_features_UWP/pch.c @@ -0,0 +1 @@ +#include "pch.h" diff --git a/UWP/cpu_features_UWP/pch.h b/UWP/cpu_features_UWP/pch.h new file mode 100644 index 0000000000..be721813fc --- /dev/null +++ b/UWP/cpu_features_UWP/pch.h @@ -0,0 +1,4 @@ +#pragma once + +#include "targetver.h" + diff --git a/UWP/cpu_features_UWP/targetver.h b/UWP/cpu_features_UWP/targetver.h new file mode 100644 index 0000000000..a66ecb00f1 --- /dev/null +++ b/UWP/cpu_features_UWP/targetver.h @@ -0,0 +1,8 @@ +#pragma once + +// Including SDKDDKVer.h defines the highest available Windows platform. + +// If you wish to build your application for a previous Windows platform, include WinSDKVer.h and +// set the _WIN32_WINNT macro to the platform you wish to support before including SDKDDKVer.h. + +#include diff --git a/Windows/.gitignore b/Windows/.gitignore index 1deb2dc13c..653ef6879e 100644 --- a/Windows/.gitignore +++ b/Windows/.gitignore @@ -1,2 +1,3 @@ *.VC.VC.opendb *.VC.db +enc_temp_folder diff --git a/Windows/Debugger/Debugger_Disasm.cpp b/Windows/Debugger/Debugger_Disasm.cpp index 00a7b1ed51..584533703d 100644 --- a/Windows/Debugger/Debugger_Disasm.cpp +++ b/Windows/Debugger/Debugger_Disasm.cpp @@ -1,5 +1,3 @@ -// NOTE: Apologies for the quality of this code, this is really from pre-opensource Dolphin - that is, 2003. - #include "Core/Config.h" #include "Core/MemMap.h" #include "Windows/resource.h" @@ -13,6 +11,7 @@ #include "Windows/Debugger/Debugger_Disasm.h" #include "Windows/Debugger/Debugger_VFPUDlg.h" #include "Windows/Debugger/DebuggerShared.h" +// #include "Windows/W32Util/DarkMode.h" #include "Windows/main.h" #include "Windows/Debugger/CtrlRegisterList.h" @@ -350,10 +349,8 @@ BOOL CDisasm::DlgProc(UINT message, WPARAM wParam, LPARAM lParam) switch(message) { case WM_INITDIALOG: - { - return TRUE; - } - break; + // DarkModeInitDialog(m_hDlg); + return TRUE; case WM_NOTIFY: switch (wParam) @@ -692,7 +689,7 @@ BOOL CDisasm::DlgProc(UINT message, WPARAM wParam, LPARAM lParam) } break; } - return FALSE; + return 0; // DarkModeDlgProc(m_hDlg, message, wParam, lParam); } void CDisasm::updateThreadLabel(bool clear) diff --git a/Windows/Debugger/Debugger_Disasm.h b/Windows/Debugger/Debugger_Disasm.h index 73367f02f4..e186e3e238 100644 --- a/Windows/Debugger/Debugger_Disasm.h +++ b/Windows/Debugger/Debugger_Disasm.h @@ -1,5 +1,3 @@ -// NOTE: Apologies for the quality of this code, this is really from pre-opensource Dolphin - that is, 2003. - #pragma once #include "Windows/W32Util/DialogManager.h" diff --git a/Windows/EmuThread.cpp b/Windows/EmuThread.cpp index 823208c851..c28b59279e 100644 --- a/Windows/EmuThread.cpp +++ b/Windows/EmuThread.cpp @@ -82,7 +82,9 @@ static void EmuThreadFunc(GraphicsContext *graphicsContext) { // This way they can load a new game. if (!Core_IsActive()) UpdateUIState(UISTATE_MENU); - Core_Run(g_graphicsContext); + if (!Core_Run(g_graphicsContext)) { + emuThreadState = (int)EmuThreadState::QUIT_REQUESTED; + } } emuThreadState = (int)EmuThreadState::STOPPED; @@ -99,12 +101,14 @@ static void EmuThreadStart(GraphicsContext *graphicsContext) { } static void EmuThreadStop() { - emuThreadState = (int)EmuThreadState::QUIT_REQUESTED; + if (emuThreadState != (int)EmuThreadState::QUIT_REQUESTED && + emuThreadState != (int)EmuThreadState::STOPPED) { + emuThreadState = (int)EmuThreadState::QUIT_REQUESTED; + } } static void EmuThreadJoin() { emuThread.join(); - emuThread = std::thread(); INFO_LOG(SYSTEM, "EmuThreadJoin - joined"); } diff --git a/Windows/GPU/WindowsGLContext.cpp b/Windows/GPU/WindowsGLContext.cpp index 05afc4d1f5..02cce76040 100644 --- a/Windows/GPU/WindowsGLContext.cpp +++ b/Windows/GPU/WindowsGLContext.cpp @@ -432,7 +432,7 @@ bool WindowsGLContext::InitFromRenderThread(std::string *error_message) { renderManager_ = (GLRenderManager *)draw_->GetNativeObject(Draw::NativeObject::RENDER_MANAGER); renderManager_->SetInflightFrames(g_Config.iInflightFrames); SetGPUBackend(GPUBackend::OPENGL); - renderManager_->SetSwapFunction([&]() {::SwapBuffers(hDC); }); + renderManager_->SetSwapFunction([&]() {::SwapBuffers(hDC); }, true); if (wglSwapIntervalEXT) { // glew loads wglSwapIntervalEXT if available renderManager_->SetSwapIntervalFunction([&](int interval) { @@ -500,6 +500,5 @@ void WindowsGLContext::ThreadEnd() { } void WindowsGLContext::StopThread() { - renderManager_->WaitUntilQueueIdle(); renderManager_->StopThread(); } diff --git a/Windows/MainWindow.cpp b/Windows/MainWindow.cpp index 65e6e5385e..7bb751f0fb 100644 --- a/Windows/MainWindow.cpp +++ b/Windows/MainWindow.cpp @@ -56,6 +56,8 @@ #include "Windows/GPU/WindowsGLContext.h" #include "Windows/GEDebugger/GEDebugger.h" #endif +#include "Windows/W32Util/DarkMode.h" +#include "Windows/W32Util/UAHMenuBar.h" #include "Windows/Debugger/Debugger_Disasm.h" #include "Windows/Debugger/Debugger_MemoryDlg.h" @@ -177,7 +179,7 @@ namespace MainWindow WNDCLASSEX wcdisp; memset(&wcdisp, 0, sizeof(wcdisp)); - // Display Window + // Display Window (contained in main window) wcdisp.cbSize = sizeof(WNDCLASSEX); wcdisp.style = CS_HREDRAW | CS_VREDRAW; wcdisp.lpfnWndProc = (WNDPROC)DisplayProc; @@ -728,13 +730,52 @@ namespace MainWindow return 0; } + RECT MapRectFromClientToWndCoords(HWND hwnd, const RECT & r) + { + RECT wnd_coords = r; + + // map to screen + MapWindowPoints(hwnd, NULL, reinterpret_cast(&wnd_coords), 2); + + RECT scr_coords; + GetWindowRect(hwnd, &scr_coords); + + // map to window coords by substracting the window coord origin in + // screen coords. + OffsetRect(&wnd_coords, -scr_coords.left, -scr_coords.top); + + return wnd_coords; + } + + RECT GetNonclientMenuBorderRect(HWND hwnd) + { + RECT r; + GetClientRect(hwnd, &r); + r = MapRectFromClientToWndCoords(hwnd, r); + int y = r.top - 1; + return { + r.left, + y, + r.right, + y + 1 + }; + } + LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { + LRESULT darkResult = 0; + if (UAHDarkModeWndProc(hWnd, message, wParam, lParam, &darkResult)) { + return darkResult; + } + switch (message) { case WM_CREATE: if (!DoesVersionMatchWindows(6, 0, 0, 0, true)) { // Remove the D3D11 choice on versions below XP RemoveMenu(GetMenu(hWnd), ID_OPTIONS_DIRECT3D11, MF_BYCOMMAND); } + if (g_darkModeSupported) { + SendMessageW(hWnd, WM_THEMECHANGED, 0, 0); + } break; case WM_USER_GET_BASE_POINTER: @@ -749,6 +790,26 @@ namespace MainWindow } break; + // Hack to kill the white line underneath the menubar. + // From https://stackoverflow.com/questions/57177310/how-to-paint-over-white-line-between-menu-bar-and-client-area-of-window + case WM_NCPAINT: + case WM_NCACTIVATE: + { + if (!IsDarkModeEnabled() || IsIconic(hWnd)) { + return DefWindowProc(hWnd, message, wParam, lParam); + } + + auto result = DefWindowProc(hWnd, message, wParam, lParam); + // Paint over the line with pure black. Could also try to figure out the dark theme color. + HDC hdc = GetWindowDC(hWnd); + RECT r = GetNonclientMenuBorderRect(hWnd); + HBRUSH red = CreateSolidBrush(RGB(0, 0, 0)); + FillRect(hdc, &r, red); + DeleteObject(red); + ReleaseDC(hWnd, hdc); + return result; + } + case WM_GETMINMAXINFO: { MINMAXINFO *minmax = reinterpret_cast(lParam); @@ -804,7 +865,7 @@ namespace MainWindow case WM_ERASEBKGND: // This window is always covered by DisplayWindow. No reason to erase. - return 1; + return 0; case WM_MOVE: SavePosition(); @@ -1048,6 +1109,23 @@ namespace MainWindow } return DefWindowProc(hWnd, message, wParam, lParam); } + break; + case WM_SETTINGCHANGE: + { + if (g_darkModeSupported && IsColorSchemeChangeMessage(lParam)) + SendMessageW(hWnd, WM_THEMECHANGED, 0, 0); + } + return DefWindowProc(hWnd, message, wParam, lParam); + + case WM_THEMECHANGED: + { + if (g_darkModeSupported) + { + _AllowDarkModeForWindow(hWnd, g_darkModeEnabled); + RefreshTitleBarThemeColor(hWnd); + } + return DefWindowProc(hWnd, message, wParam, lParam); + } default: return DefWindowProc(hWnd, message, wParam, lParam); diff --git a/Windows/MainWindowMenu.cpp b/Windows/MainWindowMenu.cpp index 25af2cd08e..ee15fab63b 100644 --- a/Windows/MainWindowMenu.cpp +++ b/Windows/MainWindowMenu.cpp @@ -44,6 +44,7 @@ #include "Windows/W32Util/Misc.h" #include "Windows/InputBox.h" #include "Windows/main.h" +#include "Windows/W32Util/DarkMode.h" #include "Core/HLE/sceUmd.h" #include "Core/SaveState.h" @@ -65,7 +66,7 @@ namespace MainWindow { static bool menuShaderInfoLoaded = false; std::vector menuShaderInfo; - LRESULT CALLBACK About(HWND, UINT, WPARAM, LPARAM); + LRESULT CALLBACK AboutDlgProc(HWND, UINT, WPARAM, LPARAM); void SetIngameMenuItemStates(HMENU menu, const GlobalUIState state) { UINT menuEnable = state == UISTATE_INGAME || state == UISTATE_EXCEPTION ? MF_ENABLED : MF_GRAYED; @@ -278,7 +279,6 @@ namespace MainWindow { TranslateMenuItem(menu, ID_TEXTURESCALING_DEPOSTERIZE); TranslateMenuItem(menu, ID_OPTIONS_HARDWARETRANSFORM); TranslateMenuItem(menu, ID_OPTIONS_VERTEXCACHE); - TranslateMenuItem(menu, ID_OPTIONS_SHOWFPS); TranslateMenuItem(menu, ID_EMULATION_SOUND); TranslateMenuItem(menu, ID_EMULATION_CHEATS, g_Config.bSystemControls ? L"\tCtrl+T" : L""); TranslateMenuItem(menu, ID_EMULATION_CHAT, g_Config.bSystemControls ? L"\tCtrl+C" : L""); @@ -882,11 +882,6 @@ namespace MainWindow { case ID_OPTIONS_VERTEXCACHE: g_Config.bVertexCache = !g_Config.bVertexCache; break; - - case ID_OPTIONS_SHOWFPS: - g_Config.iShowFPSCounter = g_Config.iShowFPSCounter ? 0 : 3; // 3 = both speed and FPS - break; - case ID_OPTIONS_TEXTUREFILTERING_AUTO: setTexFiltering(TEX_FILTER_AUTO); break; case ID_OPTIONS_NEARESTFILTERING: setTexFiltering(TEX_FILTER_FORCE_NEAREST); break; case ID_OPTIONS_LINEARFILTERING: setTexFiltering(TEX_FILTER_FORCE_LINEAR); break; @@ -925,7 +920,7 @@ namespace MainWindow { break; case ID_HELP_BUYGOLD: - ShellExecute(NULL, L"open", L"https://central.ppsspp.org/buygold", NULL, NULL, SW_SHOWNORMAL); + ShellExecute(NULL, L"open", L"https://www.ppsspp.org/buygold", NULL, NULL, SW_SHOWNORMAL); break; case ID_HELP_OPENFORUM: @@ -942,7 +937,7 @@ namespace MainWindow { case ID_HELP_ABOUT: DialogManager::EnableAll(FALSE); - DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About); + DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)AboutDlgProc); DialogManager::EnableAll(TRUE); break; @@ -984,7 +979,6 @@ namespace MainWindow { CHECKITEM(ID_OPTIONS_HARDWARETRANSFORM, g_Config.bHardwareTransform); CHECKITEM(ID_DEBUG_BREAKONLOAD, !g_Config.bAutoRun); CHECKITEM(ID_OPTIONS_VERTEXCACHE, g_Config.bVertexCache); - CHECKITEM(ID_OPTIONS_SHOWFPS, g_Config.iShowFPSCounter); CHECKITEM(ID_OPTIONS_FRAMESKIP_AUTO, g_Config.bAutoFrameSkip); CHECKITEM(ID_OPTIONS_FRAMESKIP, g_Config.iFrameSkip != FRAMESKIP_OFF); CHECKITEM(ID_OPTIONS_FRAMESKIPTYPE_COUNT, g_Config.iFrameSkipType == FRAMESKIPTYPE_COUNT); @@ -1274,24 +1268,31 @@ namespace MainWindow { } // Message handler for about box. - LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { + LRESULT CALLBACK AboutDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { - case WM_INITDIALOG: - { - W32Util::CenterWindow(hDlg); - HWND versionBox = GetDlgItem(hDlg, IDC_VERSION); - std::string windowText = System_GetPropertyBool(SYSPROP_APP_GOLD) ? "PPSSPP Gold " : "PPSSPP "; - windowText.append(PPSSPP_GIT_VERSION); - SetWindowText(versionBox, ConvertUTF8ToWString(windowText).c_str()); - } - return TRUE; - - case WM_COMMAND: - if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) { - EndDialog(hDlg, LOWORD(wParam)); + case WM_INITDIALOG: + { + W32Util::CenterWindow(hDlg); + HWND versionBox = GetDlgItem(hDlg, IDC_VERSION); + std::string windowText = System_GetPropertyBool(SYSPROP_APP_GOLD) ? "PPSSPP Gold " : "PPSSPP "; + windowText.append(PPSSPP_GIT_VERSION); + SetWindowText(versionBox, ConvertUTF8ToWString(windowText).c_str()); + DarkModeInitDialog(hDlg); return TRUE; } - break; + + case WM_COMMAND: + { + if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) { + EndDialog(hDlg, LOWORD(wParam)); + return TRUE; + } + break; + return FALSE; + } + + default: + return DarkModeDlgProc(hDlg, message, wParam, lParam); } return FALSE; } diff --git a/Windows/PPSSPP.sln b/Windows/PPSSPP.sln index d2b028722c..877e13aff7 100644 --- a/Windows/PPSSPP.sln +++ b/Windows/PPSSPP.sln @@ -87,6 +87,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tools", "Tools", "{999C12EA EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libzstd", "..\ext\libzstd.vcxproj", "{8BFD8150-94D5-4BF9-8A50-7BD9929A0850}" EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "cpu_features", "..\ext\cpu_features.vcxproj", "{C249F016-7F82-45CF-BB6E-0642A988C4D3}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|ARM = Debug|ARM @@ -357,6 +359,22 @@ Global {8BFD8150-94D5-4BF9-8A50-7BD9929A0850}.Release|Win32.Build.0 = Release|Win32 {8BFD8150-94D5-4BF9-8A50-7BD9929A0850}.Release|x64.ActiveCfg = Release|x64 {8BFD8150-94D5-4BF9-8A50-7BD9929A0850}.Release|x64.Build.0 = Release|x64 + {C249F016-7F82-45CF-BB6E-0642A988C4D3}.Debug|ARM.ActiveCfg = Debug|ARM + {C249F016-7F82-45CF-BB6E-0642A988C4D3}.Debug|ARM.Build.0 = Debug|ARM + {C249F016-7F82-45CF-BB6E-0642A988C4D3}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {C249F016-7F82-45CF-BB6E-0642A988C4D3}.Debug|ARM64.Build.0 = Debug|ARM64 + {C249F016-7F82-45CF-BB6E-0642A988C4D3}.Debug|Win32.ActiveCfg = Debug|Win32 + {C249F016-7F82-45CF-BB6E-0642A988C4D3}.Debug|Win32.Build.0 = Debug|Win32 + {C249F016-7F82-45CF-BB6E-0642A988C4D3}.Debug|x64.ActiveCfg = Debug|x64 + {C249F016-7F82-45CF-BB6E-0642A988C4D3}.Debug|x64.Build.0 = Debug|x64 + {C249F016-7F82-45CF-BB6E-0642A988C4D3}.Release|ARM.ActiveCfg = Release|ARM + {C249F016-7F82-45CF-BB6E-0642A988C4D3}.Release|ARM.Build.0 = Release|ARM + {C249F016-7F82-45CF-BB6E-0642A988C4D3}.Release|ARM64.ActiveCfg = Release|ARM64 + {C249F016-7F82-45CF-BB6E-0642A988C4D3}.Release|ARM64.Build.0 = Release|ARM64 + {C249F016-7F82-45CF-BB6E-0642A988C4D3}.Release|Win32.ActiveCfg = Release|Win32 + {C249F016-7F82-45CF-BB6E-0642A988C4D3}.Release|Win32.Build.0 = Release|Win32 + {C249F016-7F82-45CF-BB6E-0642A988C4D3}.Release|x64.ActiveCfg = Release|x64 + {C249F016-7F82-45CF-BB6E-0642A988C4D3}.Release|x64.Build.0 = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -372,6 +390,7 @@ Global {B7DED405-40A2-48F8-9382-538F10D442F1} = {999C12EA-A74F-4868-84F7-64C258043C49} {D8A71225-178B-424E-96C1-CC3BE2C1B047} = {39FCACF8-10D9-4D8D-97AA-7507436AD932} {8BFD8150-94D5-4BF9-8A50-7BD9929A0850} = {39FCACF8-10D9-4D8D-97AA-7507436AD932} + {C249F016-7F82-45CF-BB6E-0642A988C4D3} = {39FCACF8-10D9-4D8D-97AA-7507436AD932} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {2FD47774-A031-48F4-B645-A49A3140A29B} diff --git a/Windows/PPSSPP.vcxproj b/Windows/PPSSPP.vcxproj index 659056d695..58acec5cc9 100644 --- a/Windows/PPSSPP.vcxproj +++ b/Windows/PPSSPP.vcxproj @@ -248,7 +248,7 @@ $(EXTERNAL_COMPILE_OPTIONS) - mf.lib;mfplat.lib;mfreadwrite.lib;mfuuid.lib;shlwapi.lib;Winmm.lib;Ws2_32.lib;dsound.lib;comctl32.lib;d3d9.lib;dxguid.lib;avcodec.lib;avformat.lib;avutil.lib;swresample.lib;swscale.lib;opengl32.lib;glu32.lib;%(AdditionalDependencies) + uxtheme.lib;mf.lib;mfplat.lib;mfreadwrite.lib;mfuuid.lib;shlwapi.lib;Winmm.lib;Ws2_32.lib;dsound.lib;comctl32.lib;d3d9.lib;dxguid.lib;avcodec.lib;avformat.lib;avutil.lib;swresample.lib;swscale.lib;opengl32.lib;glu32.lib;%(AdditionalDependencies) ../ffmpeg/Windows/x86/lib true Windows @@ -287,7 +287,7 @@ $(EXTERNAL_COMPILE_OPTIONS) - mf.lib;mfplat.lib;mfreadwrite.lib;mfuuid.lib;shlwapi.lib;Winmm.lib;Ws2_32.lib;dsound.lib;comctl32.lib;d3d9.lib;dxguid.lib;avcodec.lib;avformat.lib;avutil.lib;swresample.lib;swscale.lib;opengl32.lib;glu32.lib;%(AdditionalDependencies) + uxtheme.lib;mf.lib;mfplat.lib;mfreadwrite.lib;mfuuid.lib;shlwapi.lib;Winmm.lib;Ws2_32.lib;dsound.lib;comctl32.lib;d3d9.lib;dxguid.lib;avcodec.lib;avformat.lib;avutil.lib;swresample.lib;swscale.lib;opengl32.lib;glu32.lib;%(AdditionalDependencies) ../ffmpeg/Windows/x86_64/lib true $(OutDir)$(ProjectName).pdb @@ -322,7 +322,7 @@ $(EXTERNAL_COMPILE_OPTIONS) - mf.lib;mfplat.lib;mfreadwrite.lib;mfuuid.lib;shlwapi.lib;Winmm.lib;Ws2_32.lib;dsound.lib;comctl32.lib;d3d9.lib;dxguid.lib;avcodec.lib;avformat.lib;avutil.lib;swresample.lib;swscale.lib;oleaut32.lib;comdlg32.lib;shell32.lib;user32.lib;gdi32.lib;advapi32.lib;ole32.lib;%(AdditionalDependencies) + uxtheme.lib;mf.lib;mfplat.lib;mfreadwrite.lib;mfuuid.lib;shlwapi.lib;Winmm.lib;Ws2_32.lib;dsound.lib;comctl32.lib;d3d9.lib;dxguid.lib;avcodec.lib;avformat.lib;avutil.lib;swresample.lib;swscale.lib;oleaut32.lib;comdlg32.lib;shell32.lib;user32.lib;gdi32.lib;advapi32.lib;ole32.lib;%(AdditionalDependencies) ../ffmpeg/Windows/aarch64/lib true $(OutDir)$(ProjectName).pdb @@ -355,7 +355,7 @@ $(EXTERNAL_COMPILE_OPTIONS) - mf.lib;mfplat.lib;mfreadwrite.lib;mfuuid.lib;shlwapi.lib;Winmm.lib;Ws2_32.lib;dsound.lib;comctl32.lib;d3d9.lib;dxguid.lib;avcodec.lib;avformat.lib;avutil.lib;swresample.lib;swscale.lib;oleaut32.lib;comdlg32.lib;shell32.lib;user32.lib;gdi32.lib;advapi32.lib;ole32.lib;%(AdditionalDependencies) + uxtheme.lib;mf.lib;mfplat.lib;mfreadwrite.lib;mfuuid.lib;shlwapi.lib;Winmm.lib;Ws2_32.lib;dsound.lib;comctl32.lib;d3d9.lib;dxguid.lib;avcodec.lib;avformat.lib;avutil.lib;swresample.lib;swscale.lib;oleaut32.lib;comdlg32.lib;shell32.lib;user32.lib;gdi32.lib;advapi32.lib;ole32.lib;%(AdditionalDependencies) ../ffmpeg/Windows/arm/lib true $(OutDir)$(ProjectName).pdb @@ -392,7 +392,7 @@ $(EXTERNAL_COMPILE_OPTIONS) - mf.lib;mfplat.lib;mfreadwrite.lib;mfuuid.lib;shlwapi.lib;Winmm.lib;Ws2_32.lib;dsound.lib;comctl32.lib;d3d9.lib;dxguid.lib;avcodec.lib;avformat.lib;avutil.lib;swresample.lib;swscale.lib;opengl32.lib;glu32.lib;%(AdditionalDependencies) + uxtheme.lib;mf.lib;mfplat.lib;mfreadwrite.lib;mfuuid.lib;shlwapi.lib;Winmm.lib;Ws2_32.lib;dsound.lib;comctl32.lib;d3d9.lib;dxguid.lib;avcodec.lib;avformat.lib;avutil.lib;swresample.lib;swscale.lib;opengl32.lib;glu32.lib;%(AdditionalDependencies) ../ffmpeg/Windows/x86/lib;%(AdditionalLibraryDirectories) $(OutDir)$(TargetName)$(TargetExt) true @@ -440,7 +440,7 @@ $(EXTERNAL_COMPILE_OPTIONS) - mf.lib;mfplat.lib;mfreadwrite.lib;mfuuid.lib;shlwapi.lib;Winmm.lib;Ws2_32.lib;dsound.lib;comctl32.lib;d3d9.lib;dxguid.lib;avcodec.lib;avformat.lib;avutil.lib;swresample.lib;swscale.lib;opengl32.lib;glu32.lib;%(AdditionalDependencies) + uxtheme.lib;mf.lib;mfplat.lib;mfreadwrite.lib;mfuuid.lib;shlwapi.lib;Winmm.lib;Ws2_32.lib;dsound.lib;comctl32.lib;d3d9.lib;dxguid.lib;avcodec.lib;avformat.lib;avutil.lib;swresample.lib;swscale.lib;opengl32.lib;glu32.lib;%(AdditionalDependencies) ../ffmpeg/Windows/x86_64/lib;%(AdditionalLibraryDirectories) true Windows @@ -482,7 +482,7 @@ $(EXTERNAL_COMPILE_OPTIONS) - mf.lib;mfplat.lib;mfreadwrite.lib;mfuuid.lib;shlwapi.lib;Winmm.lib;Ws2_32.lib;dsound.lib;comctl32.lib;d3d9.lib;dxguid.lib;avcodec.lib;avformat.lib;avutil.lib;swresample.lib;swscale.lib;oleaut32.lib;comdlg32.lib;shell32.lib;user32.lib;gdi32.lib;advapi32.lib;ole32.lib;%(AdditionalDependencies) + uxtheme.lib;mf.lib;mfplat.lib;mfreadwrite.lib;mfuuid.lib;shlwapi.lib;Winmm.lib;Ws2_32.lib;dsound.lib;comctl32.lib;d3d9.lib;dxguid.lib;avcodec.lib;avformat.lib;avutil.lib;swresample.lib;swscale.lib;oleaut32.lib;comdlg32.lib;shell32.lib;user32.lib;gdi32.lib;advapi32.lib;ole32.lib;%(AdditionalDependencies) ../ffmpeg/Windows/aarch64/lib;%(AdditionalLibraryDirectories) true Windows @@ -522,7 +522,7 @@ $(EXTERNAL_COMPILE_OPTIONS) - mf.lib;mfplat.lib;mfreadwrite.lib;mfuuid.lib;shlwapi.lib;Winmm.lib;Ws2_32.lib;dsound.lib;comctl32.lib;d3d9.lib;dxguid.lib;avcodec.lib;avformat.lib;avutil.lib;swresample.lib;swscale.lib;oleaut32.lib;comdlg32.lib;shell32.lib;user32.lib;gdi32.lib;advapi32.lib;ole32.lib;%(AdditionalDependencies) + uxtheme.lib;mf.lib;mfplat.lib;mfreadwrite.lib;mfuuid.lib;shlwapi.lib;Winmm.lib;Ws2_32.lib;dsound.lib;comctl32.lib;d3d9.lib;dxguid.lib;avcodec.lib;avformat.lib;avutil.lib;swresample.lib;swscale.lib;oleaut32.lib;comdlg32.lib;shell32.lib;user32.lib;gdi32.lib;advapi32.lib;ole32.lib;%(AdditionalDependencies) ../ffmpeg/Windows/arm/lib;%(AdditionalLibraryDirectories) true Windows @@ -917,6 +917,7 @@ + $(IntDir)%(Filename)2.obj @@ -939,6 +940,7 @@ true true + @@ -1484,7 +1486,9 @@ + + @@ -1492,6 +1496,7 @@ + diff --git a/Windows/PPSSPP.vcxproj.filters b/Windows/PPSSPP.vcxproj.filters index b5f7795084..3407dc96f2 100644 --- a/Windows/PPSSPP.vcxproj.filters +++ b/Windows/PPSSPP.vcxproj.filters @@ -59,6 +59,9 @@ {8f39c005-9738-41c5-a8d8-cfc05bf178e8} + + {e6f1a7f6-807b-484e-9595-bdb58ecaa2ae} + @@ -271,6 +274,12 @@ Other Platforms\libretro + + Windows\W32Util + + + Windows\W32Util + @@ -553,6 +562,15 @@ Other Platforms\iOS\iCade + + Windows\W32Util + + + Windows\W32Util + + + Windows\W32Util + @@ -820,4 +838,4 @@ Other Platforms\SDL - \ No newline at end of file + diff --git a/Windows/W32Util/DarkMode.cpp b/Windows/W32Util/DarkMode.cpp new file mode 100644 index 0000000000..e22fc06629 --- /dev/null +++ b/Windows/W32Util/DarkMode.cpp @@ -0,0 +1,229 @@ +#include "IatHook.h" +#include "DarkMode.h" + +fnSetWindowCompositionAttribute _SetWindowCompositionAttribute = nullptr; +fnShouldAppsUseDarkMode _ShouldAppsUseDarkMode = nullptr; +fnAllowDarkModeForWindow _AllowDarkModeForWindow = nullptr; +fnAllowDarkModeForApp _AllowDarkModeForApp = nullptr; +fnFlushMenuThemes _FlushMenuThemes = nullptr; +fnRefreshImmersiveColorPolicyState _RefreshImmersiveColorPolicyState = nullptr; +fnIsDarkModeAllowedForWindow _IsDarkModeAllowedForWindow = nullptr; +fnGetIsImmersiveColorUsingHighContrast _GetIsImmersiveColorUsingHighContrast = nullptr; +fnOpenNcThemeData _OpenNcThemeData = nullptr; +// 1903 18362 +fnShouldSystemUseDarkMode _ShouldSystemUseDarkMode = nullptr; +fnSetPreferredAppMode _SetPreferredAppMode = nullptr; +fnSetWindowTheme _SetWindowTheme = nullptr; + +bool g_darkModeSupported = false; +bool g_darkModeEnabled = false; +DWORD g_buildNumber = 0; + +bool AllowDarkModeForWindow(HWND hWnd, bool allow) +{ + if (g_darkModeSupported) + return _AllowDarkModeForWindow(hWnd, allow); + return false; +} + +bool IsHighContrast() +{ + HIGHCONTRASTW highContrast = { sizeof(highContrast) }; + if (SystemParametersInfoW(SPI_GETHIGHCONTRAST, sizeof(highContrast), &highContrast, FALSE)) + return highContrast.dwFlags & HCF_HIGHCONTRASTON; + return false; +} + +void RefreshTitleBarThemeColor(HWND hWnd) +{ + BOOL dark = FALSE; + if (_IsDarkModeAllowedForWindow(hWnd) && + _ShouldAppsUseDarkMode() && + !IsHighContrast()) + { + dark = TRUE; + } + if (g_buildNumber < 18362) + SetPropW(hWnd, L"UseImmersiveDarkModeColors", reinterpret_cast(static_cast(dark))); + else if (_SetWindowCompositionAttribute) + { + WINDOWCOMPOSITIONATTRIBDATA data = { WCA_USEDARKMODECOLORS, &dark, sizeof(dark) }; + _SetWindowCompositionAttribute(hWnd, &data); + } +} + +bool IsColorSchemeChangeMessage(LPARAM lParam) +{ + bool is = false; + if (lParam && CompareStringOrdinal(reinterpret_cast(lParam), -1, L"ImmersiveColorSet", -1, TRUE) == CSTR_EQUAL) + { + _RefreshImmersiveColorPolicyState(); + is = true; + } + _GetIsImmersiveColorUsingHighContrast(IHCM_REFRESH); + return is; +} + +bool IsColorSchemeChangeMessage(UINT message, LPARAM lParam) +{ + if (message == WM_SETTINGCHANGE) + return IsColorSchemeChangeMessage(lParam); + return false; +} + +void AllowDarkModeForApp(bool allow) +{ + if (_AllowDarkModeForApp) + _AllowDarkModeForApp(allow); + else if (_SetPreferredAppMode) + _SetPreferredAppMode(allow ? AllowDark : Default); +} + +void FixDarkScrollBar() +{ + // Disable this, doesn't look good. + return; + + HMODULE hComctl = LoadLibraryExW(L"comctl32.dll", nullptr, LOAD_LIBRARY_SEARCH_SYSTEM32); + if (hComctl) + { + auto addr = FindDelayLoadThunkInModule(hComctl, "uxtheme.dll", 49); // OpenNcThemeData + if (addr) + { + DWORD oldProtect; + if (VirtualProtect(addr, sizeof(IMAGE_THUNK_DATA), PAGE_READWRITE, &oldProtect)) + { + auto MyOpenThemeData = [](HWND hWnd, LPCWSTR classList) -> HTHEME { + if (wcscmp(classList, L"ScrollBar") == 0) + { + hWnd = nullptr; + classList = L"Explorer::ScrollBar"; + } + return _OpenNcThemeData(hWnd, classList); + }; + + addr->u1.Function = reinterpret_cast(static_cast(MyOpenThemeData)); + VirtualProtect(addr, sizeof(IMAGE_THUNK_DATA), oldProtect, &oldProtect); + } + } + } +} + +void DarkModeInitDialog(HWND hDlg) { + if (g_darkModeSupported) { + _SetWindowTheme(GetDlgItem(hDlg, IDOK), L"Explorer", nullptr); + SendMessageW(hDlg, WM_THEMECHANGED, 0, 0); + } +} + +LRESULT DarkModeDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { + constexpr COLORREF darkBkColor = 0x383838; + constexpr COLORREF darkTextColor = 0xFFFFFF; + static HBRUSH hbrBkgnd = nullptr; + + switch (message) { + case WM_CTLCOLORDLG: + case WM_CTLCOLORSTATIC: + { + if (g_darkModeSupported && g_darkModeEnabled) + { + HDC hdc = reinterpret_cast(wParam); + SetTextColor(hdc, darkTextColor); + SetBkColor(hdc, darkBkColor); + if (!hbrBkgnd) + hbrBkgnd = CreateSolidBrush(darkBkColor); + return reinterpret_cast(hbrBkgnd); + } + break; + } + case WM_SETTINGCHANGE: + { + if (g_darkModeSupported && IsColorSchemeChangeMessage(lParam)) + SendMessageW(hDlg, WM_THEMECHANGED, 0, 0); + break; + } + case WM_THEMECHANGED: + { + if (g_darkModeSupported) + { + _AllowDarkModeForWindow(hDlg, g_darkModeEnabled); + RefreshTitleBarThemeColor(hDlg); + + HWND hButton = GetDlgItem(hDlg, IDOK); + _AllowDarkModeForWindow(hButton, g_darkModeEnabled); + SendMessageW(hButton, WM_THEMECHANGED, 0, 0); + + UpdateWindow(hDlg); + } + break; + } + } + return FALSE; +} + +bool IsDarkModeEnabled() { + return g_darkModeEnabled; +} + +constexpr bool CheckBuildNumber(DWORD buildNumber) +{ + // TODO: This is BS. + + return (buildNumber == 17763 || // 1809 + buildNumber == 18362 || // 1903 + buildNumber == 18363 || // 1909 + buildNumber >= 19041); // Windows 11 +} + +void InitDarkMode() +{ + auto RtlGetNtVersionNumbers = reinterpret_cast(GetProcAddress(GetModuleHandleW(L"ntdll.dll"), "RtlGetNtVersionNumbers")); + if (RtlGetNtVersionNumbers) + { + DWORD major, minor; + RtlGetNtVersionNumbers(&major, &minor, &g_buildNumber); + g_buildNumber &= ~0xF0000000; + if (major == 10 && minor == 0 && CheckBuildNumber(g_buildNumber)) + { + HMODULE hUxtheme = LoadLibraryExW(L"uxtheme.dll", nullptr, LOAD_LIBRARY_SEARCH_SYSTEM32); + if (hUxtheme) + { + _OpenNcThemeData = reinterpret_cast(GetProcAddress(hUxtheme, MAKEINTRESOURCEA(49))); + _RefreshImmersiveColorPolicyState = reinterpret_cast(GetProcAddress(hUxtheme, MAKEINTRESOURCEA(104))); + _GetIsImmersiveColorUsingHighContrast = reinterpret_cast(GetProcAddress(hUxtheme, MAKEINTRESOURCEA(106))); + _ShouldAppsUseDarkMode = reinterpret_cast(GetProcAddress(hUxtheme, MAKEINTRESOURCEA(132))); + _AllowDarkModeForWindow = reinterpret_cast(GetProcAddress(hUxtheme, MAKEINTRESOURCEA(133))); + + auto ord135 = GetProcAddress(hUxtheme, MAKEINTRESOURCEA(135)); + if (g_buildNumber < 18362) + _AllowDarkModeForApp = reinterpret_cast(ord135); + else + _SetPreferredAppMode = reinterpret_cast(ord135); + + //_FlushMenuThemes = reinterpret_cast(GetProcAddress(hUxtheme, MAKEINTRESOURCEA(136))); + _IsDarkModeAllowedForWindow = reinterpret_cast(GetProcAddress(hUxtheme, MAKEINTRESOURCEA(137))); + + _SetWindowCompositionAttribute = reinterpret_cast(GetProcAddress(GetModuleHandleW(L"user32.dll"), "SetWindowCompositionAttribute")); + _SetWindowTheme = reinterpret_cast(GetProcAddress(hUxtheme, "SetWindowTheme")); + + if (_OpenNcThemeData && + _RefreshImmersiveColorPolicyState && + _ShouldAppsUseDarkMode && + _AllowDarkModeForWindow && + (_AllowDarkModeForApp || _SetPreferredAppMode) && + //_FlushMenuThemes && + _IsDarkModeAllowedForWindow) + { + g_darkModeSupported = true; + + AllowDarkModeForApp(true); + _RefreshImmersiveColorPolicyState(); + + g_darkModeEnabled = _ShouldAppsUseDarkMode() && !IsHighContrast(); + + FixDarkScrollBar(); + } + } + } + } +} diff --git a/Windows/W32Util/DarkMode.h b/Windows/W32Util/DarkMode.h new file mode 100644 index 0000000000..50ac9498db --- /dev/null +++ b/Windows/W32Util/DarkMode.h @@ -0,0 +1,110 @@ +#pragma once + +#define WIN32_LEAN_AND_MEAN +#define NOMINMAX +#include +#include +#include +#include +#include + +#include "IatHook.h" + +enum IMMERSIVE_HC_CACHE_MODE +{ + IHCM_USE_CACHED_VALUE, + IHCM_REFRESH +}; + +// 1903 18362 +enum PreferredAppMode +{ + Default, + AllowDark, + ForceDark, + ForceLight, + Max +}; + +enum WINDOWCOMPOSITIONATTRIB +{ + WCA_UNDEFINED = 0, + WCA_NCRENDERING_ENABLED = 1, + WCA_NCRENDERING_POLICY = 2, + WCA_TRANSITIONS_FORCEDISABLED = 3, + WCA_ALLOW_NCPAINT = 4, + WCA_CAPTION_BUTTON_BOUNDS = 5, + WCA_NONCLIENT_RTL_LAYOUT = 6, + WCA_FORCE_ICONIC_REPRESENTATION = 7, + WCA_EXTENDED_FRAME_BOUNDS = 8, + WCA_HAS_ICONIC_BITMAP = 9, + WCA_THEME_ATTRIBUTES = 10, + WCA_NCRENDERING_EXILED = 11, + WCA_NCADORNMENTINFO = 12, + WCA_EXCLUDED_FROM_LIVEPREVIEW = 13, + WCA_VIDEO_OVERLAY_ACTIVE = 14, + WCA_FORCE_ACTIVEWINDOW_APPEARANCE = 15, + WCA_DISALLOW_PEEK = 16, + WCA_CLOAK = 17, + WCA_CLOAKED = 18, + WCA_ACCENT_POLICY = 19, + WCA_FREEZE_REPRESENTATION = 20, + WCA_EVER_UNCLOAKED = 21, + WCA_VISUAL_OWNER = 22, + WCA_HOLOGRAPHIC = 23, + WCA_EXCLUDED_FROM_DDA = 24, + WCA_PASSIVEUPDATEMODE = 25, + WCA_USEDARKMODECOLORS = 26, + WCA_LAST = 27 +}; + +struct WINDOWCOMPOSITIONATTRIBDATA +{ + WINDOWCOMPOSITIONATTRIB Attrib; + PVOID pvData; + SIZE_T cbData; +}; + +using fnRtlGetNtVersionNumbers = void (WINAPI *)(LPDWORD major, LPDWORD minor, LPDWORD build); +using fnSetWindowCompositionAttribute = BOOL (WINAPI *)(HWND hWnd, WINDOWCOMPOSITIONATTRIBDATA*); +// 1809 17763 +using fnShouldAppsUseDarkMode = bool (WINAPI *)(); // ordinal 132 +using fnAllowDarkModeForWindow = bool (WINAPI *)(HWND hWnd, bool allow); // ordinal 133 +using fnAllowDarkModeForApp = bool (WINAPI *)(bool allow); // ordinal 135, in 1809 +using fnFlushMenuThemes = void (WINAPI *)(); // ordinal 136 +using fnRefreshImmersiveColorPolicyState = void (WINAPI *)(); // ordinal 104 +using fnIsDarkModeAllowedForWindow = bool (WINAPI *)(HWND hWnd); // ordinal 137 +using fnGetIsImmersiveColorUsingHighContrast = bool (WINAPI *)(IMMERSIVE_HC_CACHE_MODE mode); // ordinal 106 +using fnOpenNcThemeData = HTHEME(WINAPI *)(HWND hWnd, LPCWSTR pszClassList); // ordinal 49 +// 1903 18362 +using fnShouldSystemUseDarkMode = bool (WINAPI *)(); // ordinal 138 +using fnSetPreferredAppMode = PreferredAppMode (WINAPI *)(PreferredAppMode appMode); // ordinal 135, in 1903 +using fnIsDarkModeAllowedForApp = bool (WINAPI *)(); // ordinal 139 +using fnSetWindowTheme = void (WINAPI*)(HWND, LPCWSTR, LPCWSTR); +//--------------------------------------------------------------------------- + +extern fnSetWindowCompositionAttribute _SetWindowCompositionAttribute; +extern fnShouldAppsUseDarkMode _ShouldAppsUseDarkMode; +extern fnAllowDarkModeForWindow _AllowDarkModeForWindow; +extern fnAllowDarkModeForApp _AllowDarkModeForApp; +extern fnFlushMenuThemes _FlushMenuThemes; +extern fnRefreshImmersiveColorPolicyState _RefreshImmersiveColorPolicyState; +extern fnIsDarkModeAllowedForWindow _IsDarkModeAllowedForWindow; +extern fnGetIsImmersiveColorUsingHighContrast _GetIsImmersiveColorUsingHighContrast; +extern fnOpenNcThemeData _OpenNcThemeData; +// 1903 18362 +extern fnShouldSystemUseDarkMode _ShouldSystemUseDarkMode; +extern fnSetPreferredAppMode _SetPreferredAppMode; +extern fnSetWindowTheme _SetWindowTheme; + +extern bool g_darkModeSupported; +extern bool g_darkModeEnabled; + +void InitDarkMode(); +bool AllowDarkModeForWindow(HWND hWnd, bool allow); +void RefreshTitleBarThemeColor(HWND hWnd); +bool IsColorSchemeChangeMessage(LPARAM lParam); +bool IsDarkModeEnabled(); + +void DarkModeInitDialog(HWND hDlg); +LRESULT DarkModeDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam); diff --git a/Windows/W32Util/IatHook.h b/Windows/W32Util/IatHook.h new file mode 100644 index 0000000000..1f259a5f20 --- /dev/null +++ b/Windows/W32Util/IatHook.h @@ -0,0 +1,91 @@ +// This file contains code from +// https://github.com/stevemk14ebr/PolyHook_2_0/blob/master/sources/IatHook.cpp +// which is licensed under the MIT License. +// See PolyHook_2_0-LICENSE for more information. + +#pragma once + +template +constexpr T RVA2VA(T1 base, T2 rva) +{ + return reinterpret_cast(reinterpret_cast(base) + rva); +} + +template +constexpr T DataDirectoryFromModuleBase(void *moduleBase, size_t entryID) +{ + auto dosHdr = reinterpret_cast(moduleBase); + auto ntHdr = RVA2VA(moduleBase, dosHdr->e_lfanew); + auto dataDir = ntHdr->OptionalHeader.DataDirectory; + return RVA2VA(moduleBase, dataDir[entryID].VirtualAddress); +} + +inline PIMAGE_THUNK_DATA FindAddressByName(void *moduleBase, PIMAGE_THUNK_DATA impName, PIMAGE_THUNK_DATA impAddr, const char *funcName) +{ + for (; impName->u1.Ordinal; ++impName, ++impAddr) + { + if (IMAGE_SNAP_BY_ORDINAL(impName->u1.Ordinal)) + continue; + + auto import = RVA2VA(moduleBase, impName->u1.AddressOfData); + if (strcmp(import->Name, funcName) != 0) + continue; + return impAddr; + } + return nullptr; +} + +inline PIMAGE_THUNK_DATA FindAddressByOrdinal(void *moduleBase, PIMAGE_THUNK_DATA impName, PIMAGE_THUNK_DATA impAddr, uint16_t ordinal) +{ + for (; impName->u1.Ordinal; ++impName, ++impAddr) + { + if (IMAGE_SNAP_BY_ORDINAL(impName->u1.Ordinal) && IMAGE_ORDINAL(impName->u1.Ordinal) == ordinal) + return impAddr; + } + return nullptr; +} + +inline PIMAGE_THUNK_DATA FindIatThunkInModule(void *moduleBase, const char *dllName, const char *funcName) +{ + auto imports = DataDirectoryFromModuleBase(moduleBase, IMAGE_DIRECTORY_ENTRY_IMPORT); + for (; imports->Name; ++imports) + { + if (_stricmp(RVA2VA(moduleBase, imports->Name), dllName) != 0) + continue; + + auto origThunk = RVA2VA(moduleBase, imports->OriginalFirstThunk); + auto thunk = RVA2VA(moduleBase, imports->FirstThunk); + return FindAddressByName(moduleBase, origThunk, thunk, funcName); + } + return nullptr; +} + +inline PIMAGE_THUNK_DATA FindDelayLoadThunkInModule(void *moduleBase, const char *dllName, const char *funcName) +{ + auto imports = DataDirectoryFromModuleBase(moduleBase, IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT); + for (; imports->DllNameRVA; ++imports) + { + if (_stricmp(RVA2VA(moduleBase, imports->DllNameRVA), dllName) != 0) + continue; + + auto impName = RVA2VA(moduleBase, imports->ImportNameTableRVA); + auto impAddr = RVA2VA(moduleBase, imports->ImportAddressTableRVA); + return FindAddressByName(moduleBase, impName, impAddr, funcName); + } + return nullptr; +} + +inline PIMAGE_THUNK_DATA FindDelayLoadThunkInModule(void *moduleBase, const char *dllName, uint16_t ordinal) +{ + auto imports = DataDirectoryFromModuleBase(moduleBase, IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT); + for (; imports->DllNameRVA; ++imports) + { + if (_stricmp(RVA2VA(moduleBase, imports->DllNameRVA), dllName) != 0) + continue; + + auto impName = RVA2VA(moduleBase, imports->ImportNameTableRVA); + auto impAddr = RVA2VA(moduleBase, imports->ImportAddressTableRVA); + return FindAddressByOrdinal(moduleBase, impName, impAddr, ordinal); + } + return nullptr; +} diff --git a/Windows/W32Util/UAHMenuBar.cpp b/Windows/W32Util/UAHMenuBar.cpp new file mode 100644 index 0000000000..d8bc53f811 --- /dev/null +++ b/Windows/W32Util/UAHMenuBar.cpp @@ -0,0 +1,115 @@ +#include "Common/CommonWindows.h" + +#include +#include + +#include "Windows/W32Util/UAHMenuBar.h" +#include "Windows/W32Util/DarkMode.h" + +static HTHEME g_menuTheme = nullptr; + +// processes messages related to UAH / custom menubar drawing. +// return true if handled, false to continue with normal processing in your wndproc +bool UAHDarkModeWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam, LRESULT *lr) +{ + if (!IsDarkModeEnabled() && message != WM_THEMECHANGED) { + return false; + } + + switch (message) + { + case WM_UAHDRAWMENU: + { + UAHMENU *pUDM = (UAHMENU *)lParam; + RECT rc = { 0 }; + + // get the menubar rect + { + MENUBARINFO mbi = { sizeof(mbi) }; + GetMenuBarInfo(hWnd, OBJID_MENU, 0, &mbi); + + RECT rcWindow; + GetWindowRect(hWnd, &rcWindow); + + // the rcBar is offset by the window rect + rc = mbi.rcBar; + OffsetRect(&rc, -rcWindow.left, -rcWindow.top); + + rc.top -= 1; + } + + if (!g_menuTheme) { + g_menuTheme = OpenThemeData(hWnd, L"Menu"); + } + + DrawThemeBackground(g_menuTheme, pUDM->hdc, MENU_POPUPITEM, MPI_NORMAL, &rc, nullptr); + return true; + } + case WM_UAHDRAWMENUITEM: + { + UAHDRAWMENUITEM *pUDMI = (UAHDRAWMENUITEM *)lParam; + + // get the menu item string + wchar_t menuString[256] = { 0 }; + MENUITEMINFO mii = { sizeof(mii), MIIM_STRING }; + { + mii.dwTypeData = menuString; + mii.cch = (sizeof(menuString) / 2) - 1; + + GetMenuItemInfo(pUDMI->um.hmenu, pUDMI->umi.iPosition, TRUE, &mii); + } + + // get the item state for drawing + + DWORD dwFlags = DT_CENTER | DT_SINGLELINE | DT_VCENTER; + + int iTextStateID = 0; + int iBackgroundStateID = 0; + { + if ((pUDMI->dis.itemState & ODS_INACTIVE) | (pUDMI->dis.itemState & ODS_DEFAULT)) { + // normal display + iTextStateID = MPI_NORMAL; + iBackgroundStateID = MPI_NORMAL; + } + if (pUDMI->dis.itemState & ODS_HOTLIGHT) { + // hot tracking + iTextStateID = MPI_HOT; + iBackgroundStateID = MPI_HOT; + } + if (pUDMI->dis.itemState & ODS_SELECTED) { + // clicked -- MENU_POPUPITEM has no state for this, though MENU_BARITEM does + iTextStateID = MPI_HOT; + iBackgroundStateID = MPI_HOT; + } + if ((pUDMI->dis.itemState & ODS_GRAYED) || (pUDMI->dis.itemState & ODS_DISABLED)) { + // disabled / grey text + iTextStateID = MPI_DISABLED; + iBackgroundStateID = MPI_DISABLED; + } + if (pUDMI->dis.itemState & ODS_NOACCEL) { + dwFlags |= DT_HIDEPREFIX; + } + } + + if (!g_menuTheme) { + g_menuTheme = OpenThemeData(hWnd, L"Menu"); + } + + DrawThemeBackground(g_menuTheme, pUDMI->um.hdc, MENU_POPUPITEM, iBackgroundStateID, &pUDMI->dis.rcItem, nullptr); + DrawThemeText(g_menuTheme, pUDMI->um.hdc, MENU_POPUPITEM, iTextStateID, menuString, mii.cch, dwFlags, 0, &pUDMI->dis.rcItem); + + return true; + } + case WM_THEMECHANGED: + { + if (g_menuTheme) { + CloseThemeData(g_menuTheme); + g_menuTheme = nullptr; + } + // continue processing in main wndproc + return false; + } + default: + return false; + } +} diff --git a/Windows/W32Util/UAHMenuBar.h b/Windows/W32Util/UAHMenuBar.h new file mode 100644 index 0000000000..95f9c0feb7 --- /dev/null +++ b/Windows/W32Util/UAHMenuBar.h @@ -0,0 +1,74 @@ +#pragma once + +// MIT license, see LICENSE +// Copyright(c) 2021 adzm / Adam D. Walling + +// processes messages related to UAH / custom menubar drawing. +// return true if handled, false to continue with normal processing in your wndproc +bool UAHDarkModeWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam, LRESULT* lr); + +// window messages related to menu bar drawing +#define WM_UAHDESTROYWINDOW 0x0090 // handled by DefWindowProc +#define WM_UAHDRAWMENU 0x0091 // lParam is UAHMENU +#define WM_UAHDRAWMENUITEM 0x0092 // lParam is UAHDRAWMENUITEM +#define WM_UAHINITMENU 0x0093 // handled by DefWindowProc +#define WM_UAHMEASUREMENUITEM 0x0094 // lParam is UAHMEASUREMENUITEM +#define WM_UAHNCPAINTMENUPOPUP 0x0095 // handled by DefWindowProc + +// describes the sizes of the menu bar or menu item +typedef union tagUAHMENUITEMMETRICS +{ + // cx appears to be 14 / 0xE less than rcItem's width! + // cy 0x14 seems stable, i wonder if it is 4 less than rcItem's height which is always 24 atm + struct { + DWORD cx; + DWORD cy; + } rgsizeBar[2]; + struct { + DWORD cx; + DWORD cy; + } rgsizePopup[4]; +} UAHMENUITEMMETRICS; + +// not really used in our case but part of the other structures +typedef struct tagUAHMENUPOPUPMETRICS +{ + DWORD rgcx[4]; + DWORD fUpdateMaxWidths : 2; // from kernel symbols, padded to full dword +} UAHMENUPOPUPMETRICS; + +// hmenu is the main window menu; hdc is the context to draw in +typedef struct tagUAHMENU +{ + HMENU hmenu; + HDC hdc; + DWORD dwFlags; // no idea what these mean, in my testing it's either 0x00000a00 or sometimes 0x00000a10 +} UAHMENU; + +// menu items are always referred to by iPosition here +typedef struct tagUAHMENUITEM +{ + int iPosition; // 0-based position of menu item in menubar + UAHMENUITEMMETRICS umim; + UAHMENUPOPUPMETRICS umpm; +} UAHMENUITEM; + +// the DRAWITEMSTRUCT contains the states of the menu items, as well as +// the position index of the item in the menu, which is duplicated in +// the UAHMENUITEM's iPosition as well +typedef struct UAHDRAWMENUITEM +{ + DRAWITEMSTRUCT dis; // itemID looks uninitialized + UAHMENU um; + UAHMENUITEM umi; +} UAHDRAWMENUITEM; + +// the MEASUREITEMSTRUCT is intended to be filled with the size of the item +// height appears to be ignored, but width can be modified +typedef struct tagUAHMEASUREMENUITEM +{ + MEASUREITEMSTRUCT mis; + UAHMENU um; + UAHMENUITEM umi; +} UAHMEASUREMENUITEM; + diff --git a/Windows/main.cpp b/Windows/main.cpp index ebfff8b6dc..d14b654f9e 100644 --- a/Windows/main.cpp +++ b/Windows/main.cpp @@ -42,6 +42,7 @@ #include "Common/Thread/ThreadUtil.h" #include "Common/Data/Encoding/Utf8.h" #include "Common/Net/Resolve.h" +#include "W32Util/DarkMode.h" #include "Core/Config.h" #include "Core/ConfigValues.h" @@ -290,7 +291,7 @@ static int ScreenRefreshRateHz() { return 60; // default value } else { if (lpDevMode.dmFields & DM_DISPLAYFREQUENCY) { - return lpDevMode.dmDisplayFrequency > 15 ? lpDevMode.dmDisplayFrequency : 60; + return lpDevMode.dmDisplayFrequency > 60 ? lpDevMode.dmDisplayFrequency : 60; } else { return 60; } @@ -553,6 +554,8 @@ static void WinMainInit() { // FMA3 support in the 2013 CRT is broken on Vista and Windows 7 RTM (fixed in SP1). Just disable it. _set_FMA3_enable(0); #endif + + InitDarkMode(); } static void WinMainCleanup() { diff --git a/Windows/ppsspp.rc b/Windows/ppsspp.rc index 40a9d9cc6d..b547443913 100644 --- a/Windows/ppsspp.rc +++ b/Windows/ppsspp.rc @@ -639,7 +639,6 @@ BEGIN END MENUITEM "Hardware Transform", ID_OPTIONS_HARDWARETRANSFORM MENUITEM "Vertex Cache", ID_OPTIONS_VERTEXCACHE - MENUITEM "Show FPS Counter", ID_OPTIONS_SHOWFPS MENUITEM "", 0, MFT_SEPARATOR MENUITEM "Enable Sound", ID_EMULATION_SOUND MENUITEM "", 0, MFT_SEPARATOR diff --git a/Windows/resource.h b/Windows/resource.h index 83ef889573..66ec982d23 100644 --- a/Windows/resource.h +++ b/Windows/resource.h @@ -158,7 +158,6 @@ #define ID_DEBUG_BREAKONLOAD 40039 #define ID_DEBUG_DUMPNEXTFRAME 40040 #define ID_OPTIONS_VERTEXCACHE 40041 -#define ID_OPTIONS_SHOWFPS 40042 #define ID_OPTIONS_FRAMESKIP 40044 #define IDC_MEMCHECK 40045 #define ID_FILE_MEMSTICK 40046 diff --git a/android/jni/Android.mk b/android/jni/Android.mk index b42ee5eff7..64a98c675d 100644 --- a/android/jni/Android.mk +++ b/android/jni/Android.mk @@ -4,6 +4,10 @@ SRC := ../.. include $(CLEAR_VARS) include $(LOCAL_PATH)/Locals.mk +LOCAL_C_INCLUDES += \ + $(LOCAL_PATH)/../../ext/cpu_features/include +LOCAL_CFLAGS += -DSTACK_LINE_READER_BUFFER_SIZE=1024 -DHAVE_DLFCN_H + # http://software.intel.com/en-us/articles/getting-started-on-optimizing-ndk-project-for-multiple-cpu-architectures ifeq ($(TARGET_ARCH_ABI),x86) @@ -119,7 +123,21 @@ EXT_FILES := \ $(SRC)/ext/udis86/syn-intel.c \ $(SRC)/ext/udis86/syn.c \ $(SRC)/ext/udis86/udis86.c \ - $(SRC)/ext/xbrz/xbrz.cpp + $(SRC)/ext/xbrz/xbrz.cpp \ + $(SRC)/ext/cpu_features/src/filesystem.c \ + $(SRC)/ext/cpu_features/src/hwcaps.c \ + $(SRC)/ext/cpu_features/src/impl_aarch64_linux_or_android.c \ + $(SRC)/ext/cpu_features/src/impl_arm_linux_or_android.c \ + $(SRC)/ext/cpu_features/src/impl_mips_linux_or_android.c \ + $(SRC)/ext/cpu_features/src/impl_ppc_linux.c \ + $(SRC)/ext/cpu_features/src/impl_riscv_linux.c \ + $(SRC)/ext/cpu_features/src/impl_s390x_linux.c \ + $(SRC)/ext/cpu_features/src/impl_x86_freebsd.c \ + $(SRC)/ext/cpu_features/src/impl_x86_linux_or_android.c \ + $(SRC)/ext/cpu_features/src/impl_x86_macos.c \ + $(SRC)/ext/cpu_features/src/impl_x86_windows.c \ + $(SRC)/ext/cpu_features/src/stack_line_reader.c \ + $(SRC)/ext/cpu_features/src/string_view.c EXEC_AND_LIB_FILES := \ $(ARCH_FILES) \ diff --git a/android/jni/AndroidJavaGLContext.cpp b/android/jni/AndroidJavaGLContext.cpp index 08e52034a5..ebf22b143c 100644 --- a/android/jni/AndroidJavaGLContext.cpp +++ b/android/jni/AndroidJavaGLContext.cpp @@ -38,7 +38,6 @@ bool AndroidJavaEGLGraphicsContext::InitFromRenderThread(ANativeWindow *wnd, int void AndroidJavaEGLGraphicsContext::ShutdownFromRenderThread() { INFO_LOG(G3D, "AndroidJavaEGLGraphicsContext::Shutdown"); - renderManager_->WaitUntilQueueIdle(); renderManager_ = nullptr; // owned by draw_. delete draw_; draw_ = nullptr; diff --git a/android/jni/AndroidJavaGLContext.h b/android/jni/AndroidJavaGLContext.h index 919bd8b80f..4b4ff95d14 100644 --- a/android/jni/AndroidJavaGLContext.h +++ b/android/jni/AndroidJavaGLContext.h @@ -40,7 +40,6 @@ public: } void StopThread() override { - renderManager_->WaitUntilQueueIdle(); renderManager_->StopThread(); } diff --git a/android/jni/app-android.cpp b/android/jni/app-android.cpp index 65d92cb4b5..b510942036 100644 --- a/android/jni/app-android.cpp +++ b/android/jni/app-android.cpp @@ -335,7 +335,7 @@ static void EmuThreadFunc() { while (emuThreadState != (int)EmuThreadState::QUIT_REQUESTED) { UpdateRunLoopAndroid(env); } - INFO_LOG(SYSTEM, "QUIT_REQUESTED found, left loop. Setting state to STOPPED."); + INFO_LOG(SYSTEM, "QUIT_REQUESTED found, left EmuThreadFunc loop. Setting state to STOPPED."); emuThreadState = (int)EmuThreadState::STOPPED; NativeShutdownGraphics(); @@ -868,17 +868,18 @@ extern "C" void Java_org_ppsspp_ppsspp_NativeApp_shutdown(JNIEnv *, jclass) { EmuThreadStop("shutdown"); INFO_LOG(SYSTEM, "BeginAndroidShutdown"); graphicsContext->BeginAndroidShutdown(); - // Skipping GL calls, the old context is gone. - while (graphicsContext->ThreadFrame()) { - INFO_LOG(SYSTEM, "graphicsContext->ThreadFrame executed to clear buffers"); - } - INFO_LOG(SYSTEM, "Joining emuthread"); - EmuThreadJoin(); - INFO_LOG(SYSTEM, "Joined emuthread"); - + // Now, it could be that we had some frames queued up. Get through them. + // We're on the render thread, so this is synchronous. + do { + INFO_LOG(SYSTEM, "Executing graphicsContext->ThreadFrame to clear buffers"); + } while (graphicsContext->ThreadFrame()); graphicsContext->ThreadEnd(); + INFO_LOG(SYSTEM, "ThreadEnd called."); graphicsContext->ShutdownFromRenderThread(); INFO_LOG(SYSTEM, "Graphics context now shut down from NativeApp_shutdown"); + + INFO_LOG(SYSTEM, "Joining emuthread"); + EmuThreadJoin(); } INFO_LOG(SYSTEM, "NativeApp.shutdown() -- begin"); diff --git a/assets/flash0/font/jpn0.pgf b/assets/flash0/font/jpn0.pgf index 7e191ef62c..17304b24f6 100644 Binary files a/assets/flash0/font/jpn0.pgf and b/assets/flash0/font/jpn0.pgf differ diff --git a/assets/lang/ar_AE.ini b/assets/lang/ar_AE.ini index c5223cfa3a..62685642e4 100644 --- a/assets/lang/ar_AE.ini +++ b/assets/lang/ar_AE.ini @@ -262,7 +262,7 @@ Random = ‎عشوائي Replace textures = ‎إستبدال الرسوم Reset = Reset Reset limited logging = Reset limited logging -RestoreDefaultSettings = Are you sure you want to restore all settings back to their defaults?\nControl mapping settings are not changed.\n\nYou can't undo this.\nPlease restart PPSSPP for the changes to take effect. +RestoreDefaultSettings = Restore these settings back to their defaults?\nYou can't undo this.\nPlease restart PPSSPP after restoring settings. RestoreGameDefaultSettings = Are you sure you want to restore the game-specific settings\nback to the PPSSPP defaults? Resume = Resume Run CPU Tests = ‎شغل فحوص المعالج @@ -530,6 +530,8 @@ Must Restart = ‎يجب عليك إعادة تشغيل البرنامج لكي Native device resolution = ‎حجم الجهاز الأساسي Nearest = Nearest No buffer = No buffer +Show Battery % = Show Battery % +Show Speed = Show Speed Skip Buffer Effects = Skip buffer effects None = ‎لا شئ Number of Frames = Number of frames diff --git a/assets/lang/az_AZ.ini b/assets/lang/az_AZ.ini index c3307efb9b..d7a5eebf30 100644 --- a/assets/lang/az_AZ.ini +++ b/assets/lang/az_AZ.ini @@ -254,7 +254,7 @@ Random = Random Replace textures = Replace textures Reset = Reset Reset limited logging = Reset limited logging -RestoreDefaultSettings = Are you sure you want to restore all settings back to their defaults?\nControl mapping settings are not changed.\n\nYou can't undo this.\nPlease restart PPSSPP for the changes to take effect. +RestoreDefaultSettings = Restore these settings back to their defaults?\nYou can't undo this.\nPlease restart PPSSPP after restoring settings. RestoreGameDefaultSettings = Are you sure you want to restore the game-specific settings\nback to the PPSSPP defaults? Resume = Resume Run CPU Tests = Run CPU tests @@ -522,6 +522,8 @@ Must Restart = You must restart PPSSPP for this change to take effect. Native device resolution = Native device resolution Nearest = Nearest No buffer = No buffer +Show Battery % = Show Battery % +Show Speed = Show Speed Skip Buffer Effects = Skip buffer effects None = None Number of Frames = Number of frames diff --git a/assets/lang/bg_BG.ini b/assets/lang/bg_BG.ini index 1b322c9ef2..115650fc72 100644 --- a/assets/lang/bg_BG.ini +++ b/assets/lang/bg_BG.ini @@ -522,6 +522,8 @@ Must Restart = You must restart PPSSPP for this change to take effect. Native device resolution = Native device resolution Nearest = Най-близко No buffer = No buffer +Show Battery % = Show Battery % +Show Speed = Show Speed Skip Buffer Effects = Skip buffer effects None = Нищо Number of Frames = Number of frames diff --git a/assets/lang/ca_ES.ini b/assets/lang/ca_ES.ini index 8efbf5edf4..0cfb65273b 100644 --- a/assets/lang/ca_ES.ini +++ b/assets/lang/ca_ES.ini @@ -254,7 +254,7 @@ Random = Aleatori Replace textures = Reemplaçar textures Reset = Reset Reset limited logging = Reset limited logging -RestoreDefaultSettings = Esteu segur que voleu restablir els ajustaments de fàbrica?\nEls canvis en els controls no s'esborraran.\n\nAixò no es pot desfer.\nReinicia PPSSPP per a que els canvis tenguin efecte. +RestoreDefaultSettings = Esteu segur que voleu restablir els ajustaments de fàbrica?\n\nAixò no es pot desfer.\nReinicia PPSSPP per a que els canvis tenguin efecte. RestoreGameDefaultSettings = Esteu segur que voleu restablir els paràmetres de joc\na els paràmetres per defecte de PPSSPP? Resume = Resume Run CPU Tests = Proves de CPU @@ -522,6 +522,8 @@ Must Restart = Heu de reiniciar PPSSPP per aplicar aquest canvi. Native device resolution = Resolució nativa del dispositiu Nearest = Més proper No buffer = Sense memòria intermèdia +Show Battery % = Show Battery % +Show Speed = Show Speed Skip Buffer Effects = Saltar efectes del memòria intermèdia None = No Number of Frames = Número de quadres diff --git a/assets/lang/cz_CZ.ini b/assets/lang/cz_CZ.ini index aabc47d379..85dd3d92d2 100644 --- a/assets/lang/cz_CZ.ini +++ b/assets/lang/cz_CZ.ini @@ -254,7 +254,7 @@ Random = Náhodné Replace textures = Replace textures Reset = Reset Reset limited logging = Reset limited logging -RestoreDefaultSettings = Jste si jisti obnovou všech nastavení zpět na jejich výchozí hodnoty?\nNastavení kontroly mapování nebude změněno.\n\nToto nelze vrátit zpět.\nPo obnově nastavení prosím restartujte PPSSPP. +RestoreDefaultSettings = Jste si jisti obnovou všech nastavení zpět na jejich výchozí hodnoty?\n\nToto nelze vrátit zpět.\nPo obnově nastavení prosím restartujte PPSSPP. RestoreGameDefaultSettings = Jste si jisti obnovou nastavení hry\nzpět na výchozí hodnoty PPSSPP? Resume = Resume Run CPU Tests = Spustit zkoušky CPU @@ -522,6 +522,8 @@ Must Restart = Aby došlo k použití těchto změn, je nutné PPSSPP restartova Native device resolution = Původní rozlišení zařízení Nearest = Nejbližší No buffer = No buffer +Show Battery % = Show Battery % +Show Speed = Show Speed Skip Buffer Effects = Přeskočit efekty vyrovnávací paměti None = Nezobrazovat Number of Frames = Number of frames diff --git a/assets/lang/da_DK.ini b/assets/lang/da_DK.ini index 5494d09632..7f42256ef9 100644 --- a/assets/lang/da_DK.ini +++ b/assets/lang/da_DK.ini @@ -254,7 +254,7 @@ Random = Tilfældig Replace textures = Erstat textures Reset = Reset Reset limited logging = Reset limited logging -RestoreDefaultSettings = Er du sikker på at du vil sætte indstillinger tilbage til standard?\nIndstilling af tasteplacering ændres ikke.\n\n\nDu kan ikke fortryde.\nGenstart venligst PPSSPP for at ændringer aktiveres. +RestoreDefaultSettings = Er du sikker på at du vil sætte indstillinger tilbage til standard?\n\nDu kan ikke fortryde.\nGenstart venligst PPSSPP for at ændringer aktiveres. RestoreGameDefaultSettings = Er du sikker på at du vil nustille de spilspecifikke\nindstillinger tilbage til standard? Resume = Resume Run CPU Tests = Kør CPU test @@ -522,6 +522,8 @@ Must Restart = Du må genstarte PPSSPP for at aktivere denne ændring. Native device resolution = Standard enheds opløsning Nearest = Nærmest No buffer = No buffer +Show Battery % = Show Battery % +Show Speed = Show Speed Skip Buffer Effects = Skip buffer effekter None = Ingen Number of Frames = Number of frames diff --git a/assets/lang/de_DE.ini b/assets/lang/de_DE.ini index 018d76a3d0..5696d8e7a8 100644 --- a/assets/lang/de_DE.ini +++ b/assets/lang/de_DE.ini @@ -254,7 +254,7 @@ Random = Zufall Replace textures = Texturen ersetzen Reset = Reset Reset limited logging = Reset limited logging -RestoreDefaultSettings = Sind Sie sicher, dass Sie alle Standardeinstellungen\n(außer die Tastenbelegung) wiederherstellen wollen?\n\nDies kann nicht rückgängig gemacht werden.\n\nBitte starten Sie PPSSPP nach Wiederherstellung neu. +RestoreDefaultSettings = Sind Sie sicher, dass Sie alle Standardeinstellungen\n\nDies kann nicht rückgängig gemacht werden.\n\nBitte starten Sie PPSSPP nach Wiederherstellung neu. RestoreGameDefaultSettings = Wollen Sie wirklich die spielspezifischen Einstellungen\nauf die Werkseinstellungen von PPSSPP zurücksetzen? Resume = Resume Run CPU Tests = CPU Test starten @@ -522,6 +522,8 @@ Must Restart = Sie müssen PPSSPP neustarten, damit die Änderungen wirksam werd Native device resolution = Native Auflösung Nearest = Nächster Nachbar No buffer = No buffer +Show Battery % = Show Battery % +Show Speed = Show Speed Skip Buffer Effects = Über&springe Puffereffekte None = Keine Number of Frames = Anzahl an Frames diff --git a/assets/lang/dr_ID.ini b/assets/lang/dr_ID.ini index 9e99a0677b..468e21b4ef 100644 --- a/assets/lang/dr_ID.ini +++ b/assets/lang/dr_ID.ini @@ -254,7 +254,7 @@ Random = Random Replace textures = Replace textures Reset = Reset Reset limited logging = Reset limited logging -RestoreDefaultSettings = Are you sure you want to restore all settings back to their defaults?\nControl mapping settings are not changed.\n\nYou can't undo this.\nPlease restart PPSSPP for the changes to take effect. +RestoreDefaultSettings = Restore these settings back to their defaults?\nYou can't undo this.\nPlease restart PPSSPP after restoring settings. RestoreGameDefaultSettings = Are you sure you want to restore the game-specific settings\nback to the PPSSPP defaults? Resume = Resume Run CPU Tests = Pajalanni tes CPU @@ -522,6 +522,8 @@ Must Restart = You must restart PPSSPP for this change to take effect. Native device resolution = Native device resolution Nearest = To paling mandoppi' No buffer = No buffer +Show Battery % = Show Battery % +Show Speed = Show Speed Skip Buffer Effects = Skip buffer effects None = Danggo'mo Number of Frames = Number of frames diff --git a/assets/lang/en_US.ini b/assets/lang/en_US.ini index cfd796836b..eec88bd1c4 100644 --- a/assets/lang/en_US.ini +++ b/assets/lang/en_US.ini @@ -278,7 +278,7 @@ Random = Random Replace textures = Replace textures Reset = Reset Reset limited logging = Reset limited logging -RestoreDefaultSettings = Are you sure you want to restore all settings back to their defaults?\nControl mapping settings are not changed.\n\nYou can't undo this.\nPlease restart PPSSPP for the changes to take effect. +RestoreDefaultSettings = Restore these settings back to their defaults?\nYou can't undo this.\nPlease restart PPSSPP after restoring settings. RestoreGameDefaultSettings = Are you sure you want to restore the game-specific settings\nback to the PPSSPP defaults? Resume = Resume Run CPU Tests = Run CPU tests @@ -546,6 +546,8 @@ Must Restart = You must restart PPSSPP for this change to take effect. Native device resolution = Native device resolution Nearest = Nearest No buffer = No buffer +Show Battery % = Show Battery % +Show Speed = Show Speed Skip Buffer Effects = Skip buffer effects None = None Number of Frames = Number of frames @@ -904,7 +906,7 @@ Current = Current DataCanBeShared = Data can be shared between PPSSPP regular/Gold DataCannotBeShared = Data CANNOT be shared between PPSSPP regular/Gold! DataWillBeLostOnUninstall = Warning! Data will be lost when you uninstall PPSSPP! -DataWillStay = Data will stay even if you uninstall PPSSPP. +DataWillStay = Data will stay even if you uninstall PPSSPP Done! = Done! EasyUSBAccess = Easy USB access Failed to move some files! = Failed to move some files! diff --git a/assets/lang/es_ES.ini b/assets/lang/es_ES.ini index 35b8c14807..5ebd6a7070 100644 --- a/assets/lang/es_ES.ini +++ b/assets/lang/es_ES.ini @@ -254,7 +254,7 @@ Random = Aleatorio Replace textures = remplazar texturas Reset = Reiniciar Reset limited logging = Reiniciar registro limitado -RestoreDefaultSettings = ¿Seguro que quieres volver a los ajustes de fábrica?\nLos cambios en los controles no se borrarán.\n\nNo puedes deshacer esto.\nReinicia PPSSPP para que los cambios tengan efecto. +RestoreDefaultSettings = ¿Seguro que quieres volver a los ajustes de fábrica?\n\nNo puedes deshacer esto.\nReinicia PPSSPP para que los cambios tengan efecto. RestoreGameDefaultSettings = ¿Seguro que quieres reestablecer los ajustes del juego\na los ajustes por defecto de PPSSPP? Resume = Reanudar Run CPU Tests = Pruebas de CPU @@ -522,6 +522,8 @@ Must Restart = Debes reiniciar PPSSPP para aplicar este cambio. Native device resolution = Resolución nativa del dispositivo Nearest = Pixelado No buffer = Sin búfer +Show Battery % = Show Battery % +Show Speed = Show Speed Skip Buffer Effects = Saltar efectos del búfer None = No Number of Frames = Nº de cuadros diff --git a/assets/lang/es_LA.ini b/assets/lang/es_LA.ini index 829eb4be30..a38174bf88 100644 --- a/assets/lang/es_LA.ini +++ b/assets/lang/es_LA.ini @@ -254,7 +254,7 @@ Random = Aleatorio Replace textures = Remplazar texturas Reset = Reset Reset limited logging = Reiniciar registro límitado -RestoreDefaultSettings = ¿Seguro que quieres volver a los ajustes de fábrica?\nLos cambios en los controles no se borrarán.\n\nNo puedes deshacer esto.\nReinicia PPSSPP para que los cambios tengan efecto. +RestoreDefaultSettings = ¿Seguro que quieres volver a los ajustes de fábrica?\n\nNo puedes deshacer esto.\nReinicia PPSSPP para que los cambios tengan efecto. RestoreGameDefaultSettings = ¿Seguro que quieres reestablecer los ajustes del juego\na los ajustes por defecto de PPSSPP? Resume = Reanudar Run CPU Tests = Ejecutando pruebas de CPU @@ -522,6 +522,8 @@ Must Restart = Debes reiniciar PPSSPP para aplicar este cambio. Native device resolution = Resolución nativa del dispositivo Nearest = Pixelado No buffer = No hay búfer +Show Battery % = Show Battery % +Show Speed = Show Speed Skip Buffer Effects = Saltar efectos por búfer (Desactiva búfer, rápido) None = No Number of Frames = Número de Frames diff --git a/assets/lang/fa_IR.ini b/assets/lang/fa_IR.ini index 680e958cc4..b19bb173f9 100644 --- a/assets/lang/fa_IR.ini +++ b/assets/lang/fa_IR.ini @@ -68,9 +68,9 @@ Keep this button pressed when right analog is pressed = Keep this button pressed Keyboard = ‎تنظیمات کیبورد L/R Trigger Buttons = ‎L/R دکمه های Landscape = ‎افقی -Landscape Auto = Landscape auto +Landscape Auto = چشم انداز خودکار Landscape Reversed = ‎افقی وارونه -Low end radius = Low end radius +Low end radius = شعاع کم پایان Mouse = ‎تنظیمات موس Mouse sensitivity = ‎حساسیت موس Mouse smoothing = ‎روان کردن حرکت موس @@ -80,28 +80,28 @@ Off = ‎خاموش OnScreen = ‎نمایش کنترل های لمسی Portrait = ‎عمودی Portrait Reversed = ‎عمودی وارونه -PSP Action Buttons = ‎Action دکمه های -Raw input = ورودی Raw +PSP Action Buttons = ‎اکشن دکمه های +Raw input = ورودی راو Repeat mode = حالت تکرار -Reset to defaults = Reset to defaults -Screen aligned to ground = Screen aligned to ground -Screen at right angle to ground = Screen at right angle to ground +Reset to defaults = ریست کردن پیشفرض +Screen aligned to ground = صفحه نمایش به زمین متصل است +Screen at right angle to ground = صفحه نمایش در زاویه راست به زمین Screen Rotation = ‎چرخش صفحه seconds, 0 : off = ‎به ثانیه، 0 : خاموش Sensitivity (scale) = Sensitivity (scale) Sensitivity = ‎حساسیت -Shape = Shape +Shape = اشیا Show Touch Pause Menu Button = ‎نمایش دکمه توقف بازی Swipe = حساسیت Swipe sensitivity = حساسیت کش رفتن Swipe smoothing = ضربه تند وشدید زدن -Thin borders = ‎حاشیه نازک +Thin borders = ‎نوار نازک Tilt Base Radius = شعاع پایه شیب Tilt Input Type = ‎...استفاده از شتاب سنج به عنوان Tilt Sensitivity along X axis = ‎X حساسیت شتاب سنج در جهت Tilt Sensitivity along Y axis = ‎Y حساسیت شتاب سنج در جهت To Calibrate = ‎برای کالیبره کردن، دستگاه را روی سطح صافی گذاشته و "کالیبره کردن" را بزنید -Toggle mode = Toggle mode +Toggle mode = حالت تعویض Touch Control Visibility = ‎نشان دادن دکمه های تاچ Use custom right analog = استفاده شخصی سازی شده انالوگ سمت راست Use Mouse Control = ‎استفاده از موس @@ -127,8 +127,8 @@ Auto = ‎اتوماتیک Auto Max Quality = Auto Max &Quality Backend = ‎Rendering &Backend (ریستارت میشود PPSSPP) Bicubic = &Bicubic -Break = Break -Break on Load = Break on load +Break = بازگشت +Break on Load = بازگشت و بارگیری Buy Gold = ‎خرید نسخه طلایی Control Mapping... = ‎...تنظیمات کنترلر Debugging = ‎دیباگ @@ -147,11 +147,11 @@ Exit = ‎خروج Extract File... = ‎...استخراج فایل File = ‎فایل Frame Skipping = ‎ردکردن فریم -Frame Skipping Type = Frame skipping type +Frame Skipping Type = رد کردن فریم خودکار تایپ Fullscreen = ‎تمام صفحه Game Settings = ‎تنظیمات بازی GE Debugger... = GE Debugge&r... -GitHub = Git&Hub +GitHub = گیت هاب Hardware Transform = ‎&استفاده از سخت افزار در پردازش Help = ‎راهنما Hybrid = ‎Hybrid (ترکیبی) @@ -161,11 +161,11 @@ Ignore Windows Key = ‎نادیده گرفتن کلید ویندوز Keep PPSSPP On Top = ‎روی سایر پنجره ها باشد PPSSPP Landscape = ‎افقی Landscape reversed = ‎افقی وارونه -Language... = La&nguage... +Language... = زبان..... Linear = ‎خطی Load = ‎... بارگیری Load .sym File... = Lo&ad .sym File... -Load Map File... = ‎... Map بارگیری فایل +Load Map File... = ‎... نقشه بارگیری فایل Load State = ‎بارگیری سریع Load State File... = ‎... بارگیری فایل ذخیره سریع Log Console = ‎کنسول لاگ @@ -174,11 +174,11 @@ More Settings... = ‎...تنظیمات بیشتر Nearest = ‎نزدیک ترین Skip Buffer Effects = ‎رد کردن اثرات بافر (سریع تر) Off = ‎خاموش -Open Chat = Open Chat +Open Chat = باز کردن چت Open Directory... = ‎... بازکردن مسیر Open from MS:/PSP/GAME... = ‎MS:/PSP/GAME... بازکردن از Open Memory Stick = ‎بازکردن مموری استیک -Open New Instance = Open new instance +Open New Instance = باز کردن نمونه جدید OpenGL = &OpenGL Pause = ‎مکث Pause When Not Focused = ‎هنگامی که پنجره فعال نباشد بازی متوقف شود @@ -224,29 +224,29 @@ Backspace = Backspace Block address = Block address By Address = By address Copy savestates to memstick root = Copy save states to Memory Stick root -Create/Open textures.ini file for current game = Create/Open textures.ini file for current game -Current = Current -Dev Tools = Development tools -DevMenu = DevMenu -Disabled JIT functionality = Disabled JIT functionality +Create/Open textures.ini file for current game = ساختن یا باز کردن تکسچر ini برای بازی شما +Current = جاری کردن +Dev Tools = ابزارهای توسعه +DevMenu = منوتوسعه دهنده +Disabled JIT functionality = قابلیت جت غیر فعال Draw Frametimes Graph = Draw frametimes graph Dump Decrypted Eboot = Dump decrypted EBOOT.BIN on game boot Dump next frame to log = ‎ریختن فریم بعدی به فایل لاگ Enable driver bug workarounds = Enable driver bug workarounds Enable Logging = ‎روشن کردن لاگ باگ ها -Enter address = Enter address +Enter address = وارد کردن ادرس FPU = FPU Framedump tests = Framedump tests Frame Profiler = Frame profiler -GPU Driver Test = GPU driver test +GPU Driver Test = تست کردن جی پی یو سخت افزار GPU log profiler = GPU log profiler GPU Profile = پروفایل سخت افراری؟ Jit Compare = Jit compare -JIT debug tools = JIT debug tools -Log Dropped Frame Statistics = Log dropped frame statistics -Log Level = Log level -Log View = Log view -Logging Channels = Logging channels +JIT debug tools = ابزار دیباگ کردن JIT +Log Dropped Frame Statistics = ورود آمار کادر کاهش یافته است +Log Level = سطح خطا +Log View = مشاهده خطا +Logging Channels = رکورد خطا چنل ها Next = بعدی No block = بدون بلوک Prev = قبلی @@ -256,12 +256,12 @@ Reset = ریست Reset limited logging = Reset limited logging RestoreDefaultSettings = ‎آیا شما می خواهید که تمامی تنظیمات به حالت اولیه خود باز گردند؟\n.تنظیمات کنترلر هیچ تغییری نمی کنند\n\n\n.تنظیمات دیگر قابل بازیابی نخواهند بود\n.پس از تایید شبیه ساز را دوباره راه اندازی کنید RestoreGameDefaultSettings = Are you sure you want to restore the game-specific settings\nback to the PPSSPP defaults? -Resume = Resume +Resume = ایست Run CPU Tests = ‎CPU اجرای تست -Save new textures = Save new textures +Save new textures = ذخیره بافت جدید Shader Viewer = Shader viewer -Show Developer Menu = Show developer menu -Show on-screen messages = Show on-screen messages +Show Developer Menu = نمایش منو توسعه دهنده +Show on-screen messages = نمایش پیام اسکرین Stats = Stats System Information = ‎اطلاعات سیستم Texture ini file created = ایجاد کنید یک فایل بافت با فرمت ini @@ -276,25 +276,25 @@ VFPU = VFPU Active = Active Back = ‎برگشت Cancel = ‎انصراف -Center = Center -ChangingGPUBackends = Changing GPU backends requires PPSSPP to restart. Restart now? -ChangingInflightFrames = Changing graphics command buffering requires PPSSPP to restart. Restart now? -Channel: = Channel: -Choose PPSSPP save folder = Choose PPSSPP save folder +Center = وسط +ChangingGPUBackends = تغییر Backends GPU نیاز به PPSSPP برای راه اندازی مجدد. راه اندازی مجدد حالا؟ +ChangingInflightFrames = تغییر دستور گرافیک گرافیک نیاز به PPSSPP برای راه اندازی مجدد دارد. راه اندازی مجدد حالا؟ +Channel: = کانال: +Choose PPSSPP save folder = انتخاب پوشه برای PPSSSPP Confirm Overwrite = ‎آیا می خواهید که دیتا ها را بازنویسی کنید؟ Confirm Save = ‎آیا می خواهید که این دیتا را ذخیره نمایید؟ ConfirmLoad = ‎بارگیری این دیتا؟ ConnectingAP = Connecting to the access point.\nPlease wait... ConnectingPleaseWait = Connecting.\nPlease wait... -ConnectionName = Connection name -Corrupted Data = Corrupted data +ConnectionName = نام اتصال +Corrupted Data = داده های خراب شده Delete = ‎حذف -Delete all = Delete all +Delete all = حذف همه Delete completed = ‎.حذف شد DeleteConfirm = ‎این دیتای ذخیره شده حذف خواهد شد.\nآیا از حذف آن مطمئن هستید؟ DeleteConfirmAll = ‎آیا شما می خواهید که همه ی\nدیتاهای ذخیره این بازی را حذف نمایید؟ DeleteConfirmGame = ‎آیا شما می خواهید این بازی را\n.از دستگاه خود حذف کنید؟ نمی توانید آن را برگردانید -DeleteConfirmGameConfig = Do you really want to delete the settings for this game? +DeleteConfirmGameConfig = آیا واقعا میخواهید تنظیمات این بازی را حذف کنید؟ DeleteFailed = Unable to delete data. Deleting = ‎در حال حذف کردن\n...منتظر بمانید Disable All = غیر فعال کردن همه؟ @@ -307,14 +307,14 @@ Finish = ‎پایان GE Frame Dumps = GE Frame Dumps Grid = چهارچوب Inactive = Inactive -InternalError = An internal error has occurred. +InternalError = خطای داخلی رخ داده است. Load = ‎بارگیری Load completed = ‎.بارگیری نکمیل شد Loading = ‎درحال بارگیری\n...منتظر بمانید LoadingFailed = Unable to load data. -Move = Move -Move Down = Move Down -Move Up = Move Up +Move = حرکت +Move Down = حرکت به پایین +Move Up = حرکت به بالا Network Connection = Network Connection NEW DATA = ‎دیتای جدید No = ‎خیر @@ -340,9 +340,9 @@ SSID = SSID Submit = تایید کردن Supported = حمایت میشود There is no data = ‎.دیتایی وجود ندارد -Toggle All = Toggle all -Toggle List = Toggle list -Unsupported = Unsupported +Toggle All = تغییر وضعیت همه +Toggle List = تغییر وضعیت لیست +Unsupported = ساپورت نمیشود When you save, it will load on a PSP, but not an older PPSSPP = When you save, it will load on a PSP, but not an older PPSSPP When you save, it will not work on outdated PSP Firmware anymore = When you save, it will not work on outdated PSP firmware anymore Yes = ‎بله @@ -362,7 +362,7 @@ Disk full while writing data = Disk full while writing data. ELF file truncated - can't load = ELF file truncated - can't load Error loading file = ‎:خطا در بارگیری فایل Error reading file = ‎.خطا در خواندن فایل -Failed initializing CPU/Memory = Failed initializing CPU or memory +Failed initializing CPU/Memory = خطا در نصب CPU و حافظه Failed to load executable: = Failed to load executable: File corrupt = File corrupt Game disc read error - ISO corrupt = Game disc read error: ISO corrupt. @@ -522,6 +522,8 @@ Must Restart = ‎برای اعمال این تنظیم باید برنامه ر Native device resolution = ‎رزولوشن دستگاه Nearest = ‎نزدیک ترین No buffer = بدون بافر +Show Battery % = Show Battery % +Show Speed = Show Speed Skip Buffer Effects = ‎رد کردن اثر بافر (سریع تر) None = ‎هیچ Number of Frames = Number of frames diff --git a/assets/lang/fi_FI.ini b/assets/lang/fi_FI.ini index bf09007dd0..bb8fe0dccd 100644 --- a/assets/lang/fi_FI.ini +++ b/assets/lang/fi_FI.ini @@ -254,7 +254,7 @@ Random = Random Replace textures = Replace textures Reset = Reset Reset limited logging = Reset limited logging -RestoreDefaultSettings = Are you sure you want to restore all settings back to their defaults?\nControl mapping settings are not changed.\n\nYou can't undo this.\nPlease restart PPSSPP for the changes to take effect. +RestoreDefaultSettings = Restore these settings back to their defaults?\nYou can't undo this.\nPlease restart PPSSPP after restoring settings. RestoreGameDefaultSettings = Are you sure you want to restore the game-specific settings\nback to the PPSSPP defaults? Resume = Resume Run CPU Tests = Suorita suoritin testi @@ -522,6 +522,8 @@ Must Restart = You must restart PPSSPP for this change to take effect. Native device resolution = Native device resolution Nearest = Lähin No buffer = No buffer +Show Battery % = Show Battery % +Show Speed = Show Speed Skip Buffer Effects = Skip buffer effects None = Ei mitään Number of Frames = Number of frames diff --git a/assets/lang/fr_FR.ini b/assets/lang/fr_FR.ini index bd76be0607..230bd386c4 100644 --- a/assets/lang/fr_FR.ini +++ b/assets/lang/fr_FR.ini @@ -254,7 +254,7 @@ Random = Aléatoire Replace textures = Remplacer les textures Reset = Reset Reset limited logging = Réinitialiser le journal limité -RestoreDefaultSettings = Êtes-vous sûr de vouloir restaurer tous les paramètres (sauf\nla réassignation des commandes) par défaut ?\n\nVous ne pourrez pas revenir en arrière.\nVeuillez redémarrer PPSSPP pour appliquer\nles changements. +RestoreDefaultSettings = Êtes-vous sûr de vouloir restaurer tous les paramètres par défaut ?\n\nVous ne pourrez pas revenir en arrière.\nVeuillez redémarrer PPSSPP pour appliquer\nles changements. RestoreGameDefaultSettings = Êtes-vous sûr de vouloir restaurer tous les paramètres\nspécifiques au jeu à leur valeur par défaut de PPSSPP ? Resume = Reprendre Run CPU Tests = Exécuter des tests CPU @@ -522,6 +522,8 @@ Must Restart = Vous devez redémarrer PPSSPP pour que cette modification prenne Native device resolution = Définition native de l'appareil Nearest = Le plus proche No buffer = 0 +Show Battery % = Show Battery % +Show Speed = Show Speed Skip Buffer Effects = Pas d'effets en mémoire tampon (hack vitesse) None = Aucun Number of Frames = Nombre d'images diff --git a/assets/lang/gl_ES.ini b/assets/lang/gl_ES.ini index cccbc2c91a..33a241b4be 100644 --- a/assets/lang/gl_ES.ini +++ b/assets/lang/gl_ES.ini @@ -254,7 +254,7 @@ Random = Aleatorio Replace textures = Replace textures Reset = Reset Reset limited logging = Reset limited logging -RestoreDefaultSettings = Seguro que queres volver ós axustes de fábrica?\nOs cambios nos controis non se borrarán.\n\nNon podes desfacer isto.\nReinicia PPSSPP para que os cambios teñan efecto. +RestoreDefaultSettings = Seguro que queres volver ós axustes de fábrica?\n\nNon podes desfacer isto.\nReinicia PPSSPP para que os cambios teñan efecto. RestoreGameDefaultSettings = Seguro que queres reestablecer os axustes do xogo\nós axustes por defecto de PPSSPP? Resume = Resume Run CPU Tests = Probas de CPU @@ -522,6 +522,8 @@ Must Restart = Debes reiniciar PPSSPP para aplicar este cambio. Native device resolution = Resolución nativa do dispositivo Nearest = Pixelado No buffer = No buffer +Show Battery % = Show Battery % +Show Speed = Show Speed Skip Buffer Effects = Skip buffer effects None = Non Number of Frames = Number of frames diff --git a/assets/lang/gr_EL.ini b/assets/lang/gr_EL.ini index a71d2c8396..b381c042de 100644 --- a/assets/lang/gr_EL.ini +++ b/assets/lang/gr_EL.ini @@ -522,6 +522,8 @@ Must Restart = Πρέπει να επανεκκινήσετε το PPSSPP για Native device resolution = Χρήση ανάλυσης συσκευής Nearest = Κοντινότερο No buffer = No buffer +Show Battery % = Show Battery % +Show Speed = Show Speed Skip Buffer Effects = Παράκαμψη εφέ buffer (γρηγορότερο) None = Καμία Number of Frames = Number of frames diff --git a/assets/lang/he_IL.ini b/assets/lang/he_IL.ini index a467804fe4..47511f206f 100644 --- a/assets/lang/he_IL.ini +++ b/assets/lang/he_IL.ini @@ -254,7 +254,7 @@ Random = Random Replace textures = Replace textures Reset = Reset Reset limited logging = Reset limited logging -RestoreDefaultSettings = Are you sure you want to restore all settings back to their defaults?\nControl mapping settings are not changed.\n\nYou can't undo this.\nPlease restart PPSSPP for the changes to take effect. +RestoreDefaultSettings = Restore these settings back to their defaults?\nYou can't undo this.\nPlease restart PPSSPP after restoring settings. RestoreGameDefaultSettings = Are you sure you want to restore the game-specific settings\nback to the PPSSPP defaults? Resume = Resume Run CPU Tests = הרץ בדיקות מעבד @@ -522,6 +522,8 @@ Must Restart = You must restart PPSSPP for this change to take effect. Native device resolution = Native device resolution Nearest = הקרוב ביותר No buffer = No buffer +Show Battery % = Show Battery % +Show Speed = Show Speed Skip Buffer Effects = Skip buffer effects None = אל תציג מונה Number of Frames = Number of frames diff --git a/assets/lang/he_IL_invert.ini b/assets/lang/he_IL_invert.ini index 280841603e..b1f93fe906 100644 --- a/assets/lang/he_IL_invert.ini +++ b/assets/lang/he_IL_invert.ini @@ -254,7 +254,7 @@ Random = Random Replace textures = Replace textures Reset = Reset Reset limited logging = Reset limited logging -RestoreDefaultSettings = Are you sure you want to restore all settings back to their defaults?\nControl mapping settings are not changed.\n\nYou can't undo this.\nPlease restart PPSSPP for the changes to take effect. +RestoreDefaultSettings = Restore these settings back to their defaults?\nYou can't undo this.\nPlease restart PPSSPP after restoring settings. RestoreGameDefaultSettings = Are you sure you want to restore the game-specific settings\nback to the PPSSPP defaults? Resume = Resume Run CPU Tests = דבעמ תוקידב ץרה @@ -522,6 +522,8 @@ Must Restart = You must restart PPSSPP for this change to take effect. Native device resolution = Native device resolution Nearest = רתויב בורקה No buffer = No buffer +Show Battery % = Show Battery % +Show Speed = Show Speed Skip Buffer Effects = Skip buffer effects None = הנומ גיצת לא Number of Frames = Number of frames diff --git a/assets/lang/hr_HR.ini b/assets/lang/hr_HR.ini index 0de6a49ba6..8ee74690c3 100644 --- a/assets/lang/hr_HR.ini +++ b/assets/lang/hr_HR.ini @@ -254,7 +254,7 @@ Random = Nasumično Replace textures = Zamijeni teksture Reset = Reset Reset limited logging = Reset limited logging -RestoreDefaultSettings = Jesi li siguran da želiš vratiti sve postavke na zadano?\nPostavke kontroli nisu izmijenjene.\n\nNe možeš poništiti ovo.\nPonovo pokrenite PPSSPP za izmijenu postavki. +RestoreDefaultSettings = Jesi li siguran da želiš vratiti sve postavke na zadano?\n\nNe možeš poništiti ovo.\nPonovo pokrenite PPSSPP za izmijenu postavki. RestoreGameDefaultSettings = Jesi li siguran da želiš vratiti igrom-specifične postavke \nna PPSSPP zadane postavke? Resume = Resume Run CPU Tests = Pokreni CPU testove @@ -522,6 +522,8 @@ Must Restart = Morate ponovno pokrenuti PPSSPP da bi se efekat primjenio. Native device resolution = Urođena rezolucija uređaja Nearest = Najbliže No buffer = No buffer +Show Battery % = Show Battery % +Show Speed = Show Speed Skip Buffer Effects = Preskoči efekte ublaživanja (nije ublaženo, faster) None = Nijedna Number of Frames = Broj frame-ova diff --git a/assets/lang/hu_HU.ini b/assets/lang/hu_HU.ini index 77d52f97ff..3302ef7d9a 100644 --- a/assets/lang/hu_HU.ini +++ b/assets/lang/hu_HU.ini @@ -254,7 +254,7 @@ Random = Véletlenszerű Replace textures = Textúrák kicserélése Reset = Reset Reset limited logging = Reset limited logging -RestoreDefaultSettings = Biztos vagy benne, hogy mindent az alapértelmezettre állítasz?\nA gombbeállítások nem változnak.\n\n\nNem vonható vissza.\nIndítsd újra a PPSSPP-t a beállítások érvényesítéséhez. +RestoreDefaultSettings = Biztos vagy benne, hogy mindent az alapértelmezettre állítasz?\n\nNem vonható vissza.\nIndítsd újra a PPSSPP-t a beállítások érvényesítéséhez. RestoreGameDefaultSettings = Biztos vagy benne, hogy minden játék-specifikus beállítást\nvisszaállítáasz a PPSSPP alapértelmezettre? Resume = Resume Run CPU Tests = CPU tesztek futtatása @@ -522,6 +522,8 @@ Must Restart = A beállítások érvénybeléptetéséhez újra kell indítani a Native device resolution = Natív készülék felbontás Nearest = Legközelebbi No buffer = No buffer +Show Battery % = Show Battery % +Show Speed = Show Speed Skip Buffer Effects = Buffer effektek kihagyása (nem bufferelt, gyorsabb) None = Nincs Number of Frames = Képkockák száma diff --git a/assets/lang/id_ID.ini b/assets/lang/id_ID.ini index e2bbeb039d..171e95e619 100644 --- a/assets/lang/id_ID.ini +++ b/assets/lang/id_ID.ini @@ -254,7 +254,7 @@ Random = Acak Replace textures = Ganti tekstur Reset = Atur ulang Reset limited logging = Atur ulang pencatatan terbatas -RestoreDefaultSettings = Apakah Anda yakin ingin mengembalikan semua pengaturan ke awal?\nPengaturan pemetaan kendali tidak berubah.\n\nAksi ini bersifat permanen.\nSilakan mulai ulang PPSSPP agar perubahan ini bisa diterapkan. +RestoreDefaultSettings = Apakah Anda yakin ingin mengembalikan semua pengaturan ke awal?\n\nAksi ini bersifat permanen.\nSilakan mulai ulang PPSSPP agar perubahan ini bisa diterapkan. RestoreGameDefaultSettings = Apakah Anda yakin ingin mengembalikan pengaturan permainan\nkembali ke pengaturan awal PPSSPP? Resume = Lanjutkan Run CPU Tests = Jalankan pengujian CPU @@ -522,6 +522,8 @@ Must Restart = Anda harus memulai ulang PPSSPP agar perubahan ini berfungsi. Native device resolution = Resolusi asli Nearest = Terdekat No buffer = Tidak ada penyangga +Show Battery % = Show Battery % +Show Speed = Show Speed Skip Buffer Effects = Lewati efek penyangga (tak tersangga, lebih cepat) None = Tidak ada Number of Frames = Nomor laju bingkai diff --git a/assets/lang/it_IT.ini b/assets/lang/it_IT.ini index 897a8ad2e4..3496e72ba1 100644 --- a/assets/lang/it_IT.ini +++ b/assets/lang/it_IT.ini @@ -254,7 +254,7 @@ Random = Casuale Replace textures = Sostituisci textures Reset = Reset Reset limited logging = Reset del logging limitato -RestoreDefaultSettings = Si desidera davvero ripristinare le impostazioni?\nImpostazioni dei Controlli non sono cambiate.\n\n\nQuest'azione non può essere annullata.\nRiavviare PPSSPP per caricare i cambiamenti. +RestoreDefaultSettings = Si desidera davvero ripristinare le impostazioni?\n\n\nQuest'azione non può essere annullata.\nRiavviare PPSSPP per caricare i cambiamenti. RestoreGameDefaultSettings = Si desidera davvero ripristinare le impostazioni specifiche per il gioco\nai valori predefiniti? Resume = Ripristina Run CPU Tests = Fai Test CPU @@ -523,6 +523,8 @@ Must Restart = Sarà necessario riavviare PPSSPP per attivare le modifiche. Native device resolution = Risoluzione nativa della periferica Nearest = Pixel perfect No buffer = Niente buffer +Show Battery % = Show Battery % +Show Speed = Show Speed Skip Buffer Effects = Salta effetti di buffer (niente buffer, più velocità) None = Nessuno Number of Frames = Numero di Frames diff --git a/assets/lang/ja_JP.ini b/assets/lang/ja_JP.ini index 07dbd5e436..bb99224379 100644 --- a/assets/lang/ja_JP.ini +++ b/assets/lang/ja_JP.ini @@ -522,6 +522,8 @@ Must Restart = この変更を適用するにはPPSSPPを再起動してくだ Native device resolution = 機器のネイティブ解像度 Nearest = Nearest No buffer = バッファなし +Show Battery % = Show Battery % +Show Speed = Show Speed Skip Buffer Effects = ノンバッファレンダリング (高速化) None = なし Number of Frames = フレーム数 diff --git a/assets/lang/jv_ID.ini b/assets/lang/jv_ID.ini index 98a9b281a3..a8e82c5b79 100644 --- a/assets/lang/jv_ID.ini +++ b/assets/lang/jv_ID.ini @@ -254,7 +254,7 @@ Random = Acak Replace textures = Replace textures Reset = Reset Reset limited logging = Reset limited logging -RestoreDefaultSettings = Apa panjenengan yakin arep mulihake kabeh setelan bali menyang sing awal?Setelan pemetaan Control ora diganti.Avatar sing Rika unggahna ora bisa batalaken iki.monggo miwiti PPSSPP kanggo owah-owahan kanggo ditrapake. +RestoreDefaultSettings = Apa panjenengan yakin arep mulihake kabeh setelan bali menyang sing awal?\nAvatar sing Rika unggahna ora bisa batalaken iki.\nMonggo miwiti PPSSPP kanggo owah-owahan kanggo ditrapake. RestoreGameDefaultSettings = Apa panjenengan yakin arep mulihake setelan-game tartamtu back kanggo awal PPSSPP? Resume = Resume Run CPU Tests = Mbukak Tes CPU @@ -522,6 +522,8 @@ Must Restart = Wiwiti maneh PPSSPP kanggo aplikasi setelan. Native device resolution = Resolusi piranti asal Nearest = Cedhak No buffer = No buffer +Show Battery % = Show Battery % +Show Speed = Show Speed Skip Buffer Effects = Skip efek buffer (non-yakuwi,luwih cepet) None = Ora ana Number of Frames = Number of frames diff --git a/assets/lang/ko_KR.ini b/assets/lang/ko_KR.ini index cb5c84c905..ed6c0e238c 100644 --- a/assets/lang/ko_KR.ini +++ b/assets/lang/ko_KR.ini @@ -46,9 +46,9 @@ Custom Key Setting = 커스텀 키 설정 Customize = 맞춤설정 Customize Touch Controls = 터치 제어 레이아웃 수정... Customize tilt = 기울기 맞춤설정... -D-PAD = D-패드 +D-PAD = 십자 패드 Deadzone radius = 데드존 반경 -Disable D-Pad diagonals (4-way touch) = D-패드 대각선 비활성화 (4 방향 터치) +Disable D-Pad diagonals (4-way touch) = 십자 패드 대각선 비활성화 (4 방향 터치) Disable diagonal input = 대각선 입력 비활성화 Double tap = 두 번 탭 Enable gesture control = 제스처 제어 활성화 @@ -133,8 +133,8 @@ Buy Gold = 골드 버전 구매(&G) Control Mapping... = 제어 맵핑(&O)... Debugging = 디버그(&D) Deposterize = 색조 융합(&D) -Direct3D9 = Direct3D 9(&9) -Direct3D11 = Direct3D 11(&1) +Direct3D9 = 다이렉트3D 9(&9) +Direct3D11 = 다이렉트3D 11(&1) Disassembly = 역어셈블리(&D)... Discord = 디스코드 Display Layout && Effects = 레이아웃 편집기 표시... @@ -159,8 +159,8 @@ Hybrid + Bicubic = 혼합 + 고등차수보간(&Y) Ignore Illegal Reads/Writes = 잘못된 읽기/쓰기 무시(&I) Ignore Windows Key = 윈도우즈 키 무시 Keep PPSSPP On Top = PPSSPP 항상 위에 표시(&K) -Landscape = 가로방향 -Landscape reversed = 가로방향 반전 +Landscape = 가로 방향 +Landscape reversed = 가로 방향 반전 Language... = 언어(&N)... Linear = 선형 필터링(&L) Load = 불러오기(&L)... @@ -182,8 +182,8 @@ Open New Instance = 새로운 인스턴트 열기 OpenGL = OpenGL(&O) Pause = 일시 정지(&P) Pause When Not Focused = 포커싱되지 않았을 때 일시 정지(&P) -Portrait = 세로방향 -Portrait reversed = 세로방향 반전 +Portrait = 세로 방향 +Portrait reversed = 세로 방향 반전 PPSSPP Forums = PPSSPP 포럼(&F) Record = 녹음(&R) Record Audio = 사운드 녹음(&A) @@ -254,8 +254,8 @@ Random = 랜덤 Replace textures = 텍스처 교체 Reset = 재설정 Reset limited logging = 제한된 로깅 재설정 -RestoreDefaultSettings = 모든 설정을 기본값으로 되돌리겠습니까?\n제어 매핑 설정은 변경되지 않습니다.\n\n이 작업은 취소할 수 없습니다.\n변경 사항을 적용하려면 PPSSPP를 다시 시작하세요. -RestoreGameDefaultSettings = 게임별 설정을\nPPSSPP 기본값으로 복원하겠습니까? +RestoreDefaultSettings = 모든 설정을 기본값으로 되돌리겠습니까?\n\n이 작업은 취소할 수 없습니다.\n변경 사항을 적용하려면 PPSSPP를 다시 시작하세요. +RestoreGameDefaultSettings = 게임별 설정을\nPPSSPP 기본값으로 복원할까요? Resume = 다시 시작 Run CPU Tests = CPU 테스트 실행 Save new textures = 새로운 텍스처 저장 @@ -282,7 +282,7 @@ ChangingInflightFrames = 그래픽 명령 버퍼링을 변경하려면 PPSSPP를 Channel: = 채널: Choose PPSSPP save folder = PPSSPP 저장 폴더 선택 Confirm Overwrite = 데이터를 덮어쓰겠습니까? -Confirm Save = 이 데이터를 저장하겠습니까? +Confirm Save = 이 데이터를 저장할까요? ConfirmLoad = 이 데이터를 불러오겠습니까? ConnectingAP = 접속 포인트에 연결하는 중입니다.\n잠시만 기다려 주세요... ConnectingPleaseWait = 연결 중입니다.\n잠시만 기다려 주세요... @@ -291,10 +291,10 @@ Corrupted Data = 손상된 데이터 Delete = 삭제 Delete all = 모두 삭제 Delete completed = 삭제가 완료되었습니다. -DeleteConfirm = 이 저장 데이터는 삭제됩니다.\n계속하겠습니까? -DeleteConfirmAll = 이 게임에 대한 모든 저장 데이터를\n삭제하겠습니까? -DeleteConfirmGame = 이 게임을 정말로 장치에서\n삭제하겠습니까? 이 작업은 취소할 수 없습니다. -DeleteConfirmGameConfig = 이 게임의 설정을 삭제하겠습니까? +DeleteConfirm = 이 저장 데이터는 삭제됩니다.\n계속할까요? +DeleteConfirmAll = 이 게임에 대한 모든 저장 데이터를\n삭제할까요? +DeleteConfirmGame = 이 게임을 정말로 장치에서\n삭제할까요? 이 작업은 취소할 수 없습니다. +DeleteConfirmGameConfig = 이 게임의 설정을 삭제할까요? DeleteFailed = 데이터를 삭제할 수 없습니다. Deleting = 삭제 중\n잠시만 기다려 주세요... Disable All = 모두 비활성화 @@ -310,11 +310,11 @@ Inactive = 비활성 InternalError = 내부 오류가 발생했습니다. Load = 불러오기 Load completed = 불러오기가 완료되었습니다. -Loading = 로딩 중\n잠시만 기다려 주세요... +Loading = 불러오기 중\n잠시만 기다려 주세요... LoadingFailed = 데이터를 불러올 수 없습니다. Move = 이동 -Move Down = Move Down -Move Up = Move Up +Move Up = 위로 이동 +Move Down = 아래로 이동 Network Connection = 네트워크 연결 NEW DATA = 새로운 데이터 No = 아니오 @@ -322,7 +322,7 @@ ObtainingIP = IP 주소를 가져오는 중입니다.\n잠시만 기다려 주 OK = 확인 Old savedata detected = 오래된 저장 데이터 감지됨 Options = 옵션 -Remove = Remove +Remove = 제거 Reset = 재설정 Resize = 크기 조정 Retry = 재시도 @@ -356,7 +356,7 @@ Could not save screenshot file = 스크린샷 파일을 저장할 수 없습니 D3D9or11 = 다이렉트3D 9? (또는 Direct3D 11의 경우 "아니오") D3D11CompilerMissing = D3DCompiler_47.dll을 찾을 수 없습니다. 설치하세요. 또는 예를 눌러 대신 Direct3D 9를 사용하여 다시 시도하세요. D3D11InitializationError = Direct3D 11 초기화 오류 -D3D11Missing = 운영 체제 버전에 D3D11이 포함되어 있지 않습니다. 윈도우즈 업데이트를 실행하세요.\n\n대신 Direct3D 9를 사용하여 다시 시도하려면 예를 누르세요. +D3D11Missing = 운영 체제 버전에 D3D11이 포함되어 있지 않습니다. 윈도우즈 업데이트를 실행하세요.\n\n대신 다이렉트3D 9를 사용하여 다시 시도하려면 예를 누르세요. D3D11NotSupported = GPU가 Direct3D 11을 지원하지 않는 것 같습니다.\n\n대신 Direct3D 9를 사용하여 다시 시도하겠습니까? Disk full while writing data = 데이터를 쓰는 동안 디스크가 가득 찼습니다. ELF file truncated - can't load = ELF 파일이 불완전함 - 불러올 수 없음 @@ -368,11 +368,11 @@ File corrupt = 파일 손상 Game disc read error - ISO corrupt = 게임 디스크 읽기 오류: ISO 손상되었습니다. GenericAllStartupError = PPSSPP가 그래픽 백엔드로 시작하지 못했습니다. 그래픽 및 기타 드라이버를 업그레이드해 보세요. GenericBackendSwitchCrash = 시작하는 동안 PPSSPP가 충돌했습니다.\n\n이것은 일반적으로 그래픽 드라이버 문제를 의미합니다. 그래픽 드라이버를 업그레이드해 보세요.\n\n그래픽 백엔드가 전환되었습니다: -GenericDirect3D9Error = 그래픽 초기화에 실패했습니다. 그래픽 드라이버와 DirectX 9 런타임을 업그레이드해 보세요.\n\nOpenGL로 전환하시겠습니까?\n\n오류 메세지: +GenericDirect3D9Error = 그래픽 초기화에 실패했습니다. 그래픽 드라이버와 다이렉트X 9 런타임을 업그레이드해 보세요.\n\nOpenGL로 전환할까요?\n\n오류 메세지: GenericGraphicsError = 그래픽 오류 GenericOpenGLError = 그래픽 초기화에 실패했습니다. 그래픽 드라이버를 업그레이드해 보세요.\n\nDirectX 9로 전환하겠습니까?\n\n오류 메세지: GenericVulkanError = 그래픽 초기화에 실패했습니다. 그래픽 드라이버를 업그레이드해 보세요.\n\nOpenGL로 전환하겠습니까?\n\n오류 메세지: -InsufficientOpenGLDriver = 불충분한 OpenGL 드라이버 지원이 감지되었습니다!\n\nGPU가 OpenGL 2.0을 지원하지 않는다고 보고합니다. DirectX를 대신 사용하겠습니까?\n\nDirectX는 현재 더 적은 수의 게임과 호환되지만 GPU에서는 유일한 선택일 수 있습니다.\n\n자세한 내용은 https://forums.ppsspp.org의 포럼을 방문하세요.\n\n +InsufficientOpenGLDriver = 불충분한 OpenGL 드라이버 지원이 감지되었습니다!\n\nGPU가 OpenGL 2.0을 지원하지 않는다고 보고합니다. 다이렉트X를 대신 사용하겠습니까?\n\nDirectX는 현재 더 적은 수의 게임과 호환되지만 GPU에서는 유일한 선택일 수 있습니다.\n\n자세한 내용은 https://forums.ppsspp.org의 포럼을 방문하세요.\n\n Just a directory. = 그냥 디렉토리입니다. Missing key = 키 누락 MsgErrorCode = 오류 코드: @@ -388,7 +388,7 @@ PPSSPP doesn't support UMD Video. = PPSSPP는 UMD 비디오를 지원하지 않 PPSSPP plays PSP games, not PlayStation 1 or 2 games. = PPSSPP는 플레이스테이션 1 또는 2 게임이 아닌 PSP 게임을 실행합니다. PPSSPPDoesNotSupportInternet = PPSSPP는 현재 DLC, PSN 또는 게임 업데이트를 위한 인터넷 연결을 지원하지 않습니다. PS1 EBOOTs are not supported by PPSSPP. = 플레이스테이션 1 EBOOT는 PPSSPP에서 지원되지 않습니다. -PSX game image detected. = 파일은 MODE2 이미지입니다. PPSSPP는 플레이스테이션 1 게임을 지원하지 않습니다. +PSX game image detected. = 파일은 모드2 이미지입니다. PPSSPP는 플레이스테이션 1 게임을 지원하지 않습니다. RAR file detected (Require UnRAR) = 파일은 (RAR로) 압축되어 있습니다.\n먼저 압축을 해제하세요 (UnRAR 시도). RAR file detected (Require WINRAR) = 파일은 (RAR로) 압축되어 있습니다.\n먼저 압축을 해제하세요 (WinRAR 시도). Running slow: try frameskip, sound is choppy when slow = 느리게 실행: 프레임생략 시도, 느릴 때 소리가 고르지 않음 @@ -422,7 +422,7 @@ Hong Kong = 홍콩 InstallData = 데이터 설치 Japan = 일본 Korea = 한국 -MB = MB +MB = 메가바이트 One moment please... = 잠깐만 기다려 주세요... Play = 재생 Remove From Recent = "최근"에서 제거 @@ -458,8 +458,8 @@ Aggressive = 과격 Alternative Speed = 대체 속도 (%, 0 = 무제한) Alternative Speed 2 = 대체 속도 2 (%, 0 = 무제한) Anisotropic Filtering = 비등방성 필터링 -Antialiasing (MSAA) = Antialiasing (MSAA) -Aspect Ratio = Aspect Ratio +Antialiasing (MSAA) = 안티앨리어싱 (MSAA) +Aspect Ratio = 화면비 Auto = 자동 Auto (1:1) = 자동 (1:1) Auto (same as Rendering) = 자동 (렌더링 해상도와 동일) @@ -469,6 +469,7 @@ Auto Scaling = 자동 스케일링 Backend = 백엔드 Balanced = 평형 Bicubic = 고등차수보간 +GPUReadbackRequired = 경고: 이 게임은 "GPU 다시 읽기 건너뛰기"를 꺼짐으로 설정해야 합니다. Both = 둘 다 Buffer graphics commands (faster, input lag) = 버퍼 그래픽 명령 (빠름, 입력 지연) BufferedRenderingRequired = 경고: 이 게임은 "렌더링 모드"를 "버퍼링"으로 설정해야 합니다. @@ -485,8 +486,8 @@ DefaultCPUClockRequired = 경고: 이 게임은 CPU 클럭을 기본값으로 Deposterize = 색조 융합 Deposterize Tip = 업스케일링된 텍스처의 시각적 밴딩 결함 수정 Device = 장치 -Direct3D 9 = Direct3D 9 -Direct3D 11 = Direct3D 11 +Direct3D 9 = 다이렉트3D 9 +Direct3D 11 = 다이렉트3D 11 Disabled = 비활성화 Display Layout && Effects = 화면 레이아웃 편집기 Display Resolution (HW scaler) = 화면 해상도(HW 스케일러) @@ -496,8 +497,7 @@ Frame Rate Control = 프레임속도 제어 Frame Skipping = 프레임 생략 Frame Skipping Type = 프레임 생략 유형 FullScreen = 전체화면 -Geometry shader culling = Geometry shader culling -GPUReadbackRequired = Warning: This game requires "Skip GPU Readbacks" to be set to Off. +Geometry shader culling = 기하학 쉐이더 삭제 Hack Settings = 핵 설정 (결함을 일으킬 수 있음) Hardware Tessellation = 하드웨어 조각화 Hardware Transform = 하드웨어 변환 @@ -522,6 +522,8 @@ Must Restart = 이 변경 사항을 적용하려면 PPSSPP를 다시 시작해 Native device resolution = 기본 장치 해상도 Nearest = 근접 필터링 No buffer = 버퍼 없음 +Show Battery % = Show Battery % +Show Speed = Show Speed Skip Buffer Effects = 버퍼 효과 건너뛰기(버퍼되지 않음, 더 빠름) None = 없음 Number of Frames = 프레임 수 @@ -543,14 +545,14 @@ Safe = 안전 Screen Scaling Filter = 화면 크기 조정 필터 Show Debug Statistics = 디버그 통계 표시 Show FPS Counter = FPS 카운터 표시 -Skip GPU Readbacks = Skip GPU Readbacks +Skip GPU Readbacks = GPU 다시 읽기 건너뛰기 Software Rendering = 소프트웨어 렌더링 (느림) Software Skinning = 소프트웨어 스키닝 SoftwareSkinning Tip = 대부분의 게임에서 더 빠르게 CPU에서 스킨 모델 드로우를 결합합니다. Speed = 속도 Speed Hacks = Speed Hacks (결함을 일으킬 수 있음) -Stereo display shader = Stereo display shader -Stereo rendering = Stereo rendering +Stereo display shader = 스트레오 디스플레이 쉐이더 +Stereo rendering = 스트레오 렌더링 Stretch = 늘이기 Texture Filter = 텍스처 필터링 Texture Filtering = 텍스처 필터링 @@ -596,7 +598,7 @@ You can press ESC to cancel. = Esc를 눌러 취소할 수 있습니다. [MainMenu] Browse = 찾아보기... -Buy PPSSPP Gold = PPSSPP Gold 구매 +Buy PPSSPP Gold = PPSSPP 골드 구매 Choose folder = 폴더 선택 Credits = 크레딧 PPSSPP Homebrew Store = PPSSPP 홈브류 스토어 @@ -638,7 +640,7 @@ An.Up = 아날로그 위쪽 Analog limiter = 아날로그 리미터 Analog Stick = 아날로그 스틱 Audio/Video Recording = 오디오/비디오 녹화 -AxisSwap = 축 스왑 +히AxisSwap = 축 교체 Circle = 동그라미 Cross = 십자 Custom 1 = 커스텀 1 @@ -651,19 +653,19 @@ Custom 7 = 커스텀 7 Custom 8 = 커스텀 8 Custom 9 = 커스텀 9 Custom 10 = 커스텀 10 -D-pad down = D-패드 아래쪽 -D-pad left = D-패드 왼쪽 -D-pad right = D-패드 오른쪽 -D-pad up = D-패드 위쪽 +D-pad down = 십자 패드 아래쪽 +D-pad left = 십자 패드 왼쪽 +D-pad right = 십자 패드 오른쪽 +D-pad up = 십자 패드 위쪽 DevMenu = 개발메뉴 Double tap button = 두 번 탭 버튼 -Down = D패드 아래쪽 -Dpad = D패드 +Down = 십자 패드 아래쪽 +Dpad = 십자 패드 Frame Advance = 프레임 어드밴스 Hold = 잠금 Home = 홈 L = L -Left = D패드 왼쪽 +Left = 십자 패드 왼쪽 Load State = 상태 불러오기 Mute toggle = 무음 토글 Next Slot = 다음 슬롯 @@ -676,7 +678,7 @@ RapidFire = 연사 Record = 녹화 Remote hold = 리모트 잠금 Rewind = 되감기 -Right = D패드 오른쪽 +Right = 십자 패드 오른쪽 Right Analog Stick = 오른쪽 아날로그 스틱 RightAn.Down = 우측 아날로그 아래쪽 RightAn.Left = 우측 아날로그 왼쪽 @@ -702,7 +704,7 @@ Toggle Fullscreen = 전체 화면 토글 Toggle mode = 토글 모드 Triangle = 세모 Fast-forward = 빨리 감기 -Up = Dpad Up +Up = 집자 패드 위쪽 Vol + = 볼륨 + Vol - = 볼륨 - Wlan = 무선랜 @@ -795,9 +797,9 @@ Undo last save = 마지막 저장 실행 취소 [PostShaders] (duplicated setting, previous slider will be used) = (설정이 중복되면 이전 슬라이더가 사용됩니다.) -4xHqGLSL = 4xHQ pixel art upscaler -5xBR = 5xBR pixel art upscaler -5xBR-lv2 = 5xBR-lv2 pixel art upscaler +4xHqGLSL = 4xHQ 픽셀 아트 업스케일러 +5xBR = 5xBR 픽셀 아트 업스케일러 +5xBR-lv2 = 5xBR-lv2 픽셀 아트 업스케일러 AAColor = AA-색상 Amount = 양 Black border = 검정 테두리 @@ -805,24 +807,24 @@ Bloom = 블룸 Brightness = 밝기 Cartoon = 카툰 ColorCorrection = 색상 교정 -ColorPreservation = Color preservation +ColorPreservation = 색상 보존 Contrast = 명암 CRT = CRT 스캔라인 FXAA = FXAA 안티 에일리어싱 Gamma = 감마 -GreenLevel = Green level +GreenLevel = 녹색 수준 Intensity = 강도 -LCDPersistence = LCD Persistence +LCDPersistence = LCD 지속성 Natural = 자연스러운 색상 NaturalA = 자연스러운 색상 (흐림 없음) Off = 끔 Power = 전원 PSPColor = PSP 색상 -RedBlue = Red/Blue glasses +RedBlue = 빨간/파란 안경 Saturation = 채도 Scanlines = 스캔라인 (CRT) Sharpen = 선명함 -SideBySide = Side by side (SBS) +SideBySide = 나란 (SBS) SSAA(Gauss) = 슈퍼샘플 AA (가우스) Tex4xBRZ = 4xBRZ TexMMPX = MMPX @@ -873,26 +875,6 @@ Twitter @PPSSPP_emu = 트위터 @PPSSPP_emu website = 웹사이트를 확인하세요: written = 속도와 이식성을 위해 C++로 작성되었습니다. -[RemoteISO] -Browse Games = 게임 찾아보기 -Local Server Port = 로컬 서버 포트 -Manual Mode Client = 수동 모드 클라이언트 -Remote disc streaming = 원격 디스크 스트리밍 -Remote Port = 원격 포트 -Remote Server = 원격 서버 -Remote Subdirectory = 공유할 하위 폴더 -RemoteISODesc = 최근 게임 목록에 있는 게임들이 공유됩니다. -RemoteISOLoading = 접속 완료, 게임 목록 불러오는 중... -RemoteISOScanning = 검색 중... 서버 장치의 "게임 공유하기" 버튼을 눌러주십시오. -RemoteISOScanningTimeout = 검색 중... 방화벽 설정을 확인하십시오. -RemoteISOWifi = 팁: 같은 Wi-Fi 네트워크 상에서 서로 접속할 수 있습니다. -RemoteISOWinFirewall = 경고: Windows 방화벽이 공유를 차단하고 있습니다. -Settings = 설정 -Share Games (Server) = 게임 공유하기 (서버) -Share on PPSSPP startup = PPSSPP 시작시 자동으로 공유하기 -Stop Sharing = 공유 끝내기 -Stopping.. = 중지하는 중... - [MemStick] Already contains PSP data = 이미 PSP 데이터가 포함되어 있습니다. Create or Choose a PSP folder = PSP 폴더 생성 또는 선택 @@ -920,22 +902,22 @@ USBAccessThroughGold = Android/data/org.ppsspp.ppssppgold/files를 통한 USB Use App Private Data = 앱 개인 데이터 사용 Use PSP folder at root of storage = 저장공간 루트에서 PSP 폴더 사용 Welcome to PPSSPP! = PPSSPP에 오신 것을 환영합니다! -WhatsThis = 이것은 무엇입니까? +WhatsThis = 이것은 무엇인가요? [RemoteISO] Browse Games = 게임 찾아보기 Local Server Port = 로컬 서버 포트 -Manual Mode Client = 수동으로 클라이언트 구성 +Manual Mode Client = 수동 모드 클라이언트 Remote disc streaming = 원격 디스크 스트리밍 Remote Port = 원격 포트 Remote Server = 원격 서버 -Remote Subdirectory = 원격 하위 디렉토리 -RemoteISODesc = "최근" 목록에 있는 게임이 공유됩니다. -RemoteISOLoading = 연결됨, 게임 목록 불러오기 중... -RemoteISOScanning = 검색 중... 서버 장치에서 "게임 공유"를 클릭하세요. -RemoteISOScanningTimeout = 검색 중... 바탕 화면의 방화벽 설정을 확인하세요. -RemoteISOWifi = 참고: 두 장치를 동일한 와이파이 네트워크에 연결하세요. -RemoteISOWinFirewall = 경고: 윈도우즈 방화벽이 공유를 차단하고 있습니다. +Remote Subdirectory = 공유할 하위 폴더 +RemoteISODesc = 최근 게임 목록에 있는 게임들이 공유됩니다. +RemoteISOLoading = 접속 완료, 게임 목록 불러오는 중... +RemoteISOScanning = 검색 중... 서버 장치의 "게임 공유하기" 버튼을 눌러주십시오. +RemoteISOScanningTimeout = 검색 중... 방화벽 설정을 확인하십시오. +RemoteISOWifi = 팁: 같은 Wi-Fi 네트워크 상에서 서로 접속할 수 있습니다. +RemoteISOWinFirewall = 경고: Windows 방화벽이 공유를 차단하고 있습니다. Settings = 설정 Share Games (Server) = 게임 공유하기 (서버) Share on PPSSPP startup = PPSSPP 시작시 자동으로 공유하기 @@ -1031,16 +1013,16 @@ Already Installed = 이미 설치됨 Connection Error = 연결 오류 Install = 설치 Launch Game = 게임 실행 -Loading... = 로딩 중... -MB = MB +Loading... = 불러오기 중... +MB = 메가바이트 Size = 크기 Uninstall = 제거 [SysInfo] -%0.2f Hz = %0.2f Hz %d (%d per core, %d cores) = %d (코어 당 %d, 코어 %d 개) %d bytes = %d 바이트 %d Hz = %d Hz +%0.2f Hz = %0.2f Hz (none detected) = (감지되지 않음) 3D API = 3D API ABI = ABI @@ -1058,7 +1040,7 @@ CPU Name = 이름 D3DCompiler Version = D3D컴파일러 버전 Debug = 디버그 Debugger Present = 디버거 탐지 -Depth buffer format = Depth buffer format +Depth buffer format = 깊이 버퍼 형식 Device Info = 장치 정보 Directories = 디렉토리 Display Information = 정보 표시 @@ -1093,7 +1075,7 @@ System Information = 시스템 정보 System Name = 이름 System Version = 시스템 버전 Threads = 스레드 -UI Resolution = UI Resolution +UI Resolution = UI 해상도 Vendor = 공급업체 Vendor (detected) = 공급업체 (탐지됨) Version Information = 버전 정보 @@ -1111,8 +1093,6 @@ AVI Dump started. = AVI 덤프가 시작됨 AVI Dump stopped. = AVI 덤프가 중지됨 Cache ISO in RAM = RAM에 전체 ISO 캐시 Change CPU Clock = 에뮬레이트된 PSP의 CPU 클럭 변경 (불안정) -Game crashed = Game crashed -Language = 언어 Memory Stick folder = 메모리 스틱 폴더 Memory Stick size = 메모리 스틱 크기 Change Nickname = 별명 변경 @@ -1145,6 +1125,7 @@ Fast Memory = 빠른 메모리 (불안정) Floating symbols = 부동 기호 Force real clock sync (slower, less lag) = 실제 클럭 동기화 강제 실행(느림, 지연 감소) frames, 0:off = 프레임, 0 = 끔 +Game crashed = 게임 충돌 Games list settings = 게임 목록 설정 General = 일반 Grid icon size = 그리드 아이콘 크기 @@ -1155,6 +1136,7 @@ Increase size = 크기 증가 Interpreter = 해석기 IO timing method = I/O 타이밍 방식 IR Interpreter = IR 해석기 +Language = 언어 Memory Stick Folder = 메모리 스틱 폴더 Memory Stick inserted = 메모리 스틱 삽입 MHz, 0:default = MHz, 0 = 기본 @@ -1182,7 +1164,7 @@ Save path in My Documents = 내 문서에 경로 저장 Savestate Slot = 저장 상태 슬롯 Savestate slot backups = 저장 상태 슬롯 백업 Screenshots as PNG = 스크린샷을 PNG 형식으로 저장 -Set Memory Stick folder = Set Memory Stick folder +Set Memory Stick folder = 메모리 스틱 폴더 설정 Set UI background... = UI 배경 설정... Show ID = ID 표시 Show region flag = 지역 플래그 표시 @@ -1195,7 +1177,7 @@ Slot 5 = 슬롯 5 Storage full = 저장 공간 가득 참 Sustained performance mode = 지속 성능 모드 Time Format = 시간 형식 -Transparent UI background = Transparent UI background +Transparent UI background = 투명한 UI 배경 UI = UI UI Sound = UI 사운드 UI background animation = UI 배경 애니메이션 @@ -1251,15 +1233,15 @@ Progress: %1% = 진행율: %1% Screen representation = 화면 표현 [VR] -% of native FoV = % of native FoV -6DoF movement = 6DoF movement -Distance to 2D menus and scenes = Distance to 2D menus and scenes -Field of view scale = Field of view scale -Force 72Hz update = Force 72Hz update -Heads-up display scale = Heads-up display scale -Map controller movements to keys = Map controller movements to keys -Motion needed to generate action = Motion needed to generate action -Stereoscopic vision (Experimental) = Stereoscopic vision (Experimental) -Virtual reality = Virtual reality -VR camera = VR camera -VR controllers = VR controllers +% of native FoV = 실제 시야의 % +6DoF movement = 6DoF 이동 +Distance to 2D menus and scenes = 2D 메뉴 및 장면까지의 거리 +Field of view scale = 시야 스케일 +Force 72Hz update = 강제 72Hz 업데이트 +Heads-up display scale = 상방시현기 스케일 +Map controller movements to keys = 컨트롤러 이동을 키에 매핑 +Motion needed to generate action = 동작 생성에 필요한 동작 +Stereoscopic vision (Experimental) = 입체시 (실험적) +Virtual reality = 가상 현실 +VR camera = VR 카메라 +VR controllers = VR 컨트롤러 diff --git a/assets/lang/lo_LA.ini b/assets/lang/lo_LA.ini index 6326dbb401..f48a7bf2aa 100644 --- a/assets/lang/lo_LA.ini +++ b/assets/lang/lo_LA.ini @@ -254,7 +254,7 @@ Random = ສຸມ Replace textures = ແທນທີ່ພື້ນຜິວ Reset = Reset Reset limited logging = Reset limited logging -RestoreDefaultSettings = ເຈົ້າແນ່ໃຈຫຼືບໍ່ວ່າຕ້ອງການກູ້ການຕັ້ງຄ່າກັບເປັນປົກກະຕິ?\nການຕັ້ງຄ່າແຜງການຄວບຄຸມຈະບໍ່ປ່ຽນ\n\n\nເຈົ້າບໍ່ສາມາດຍົກເລີກ\nກະລຸນາເລີ່ມ PPSSPP ໃໝ່ອີກຄັ້ງ ເພື່ອເຫັນຜົນການປ່ຽນແປງ +RestoreDefaultSettings = ເຈົ້າແນ່ໃຈຫຼືບໍ່ວ່າຕ້ອງການກູ້ການຕັ້ງຄ່າກັບເປັນປົກກະຕິ?\n\nເຈົ້າບໍ່ສາມາດຍົກເລີກ\nກະລຸນາເລີ່ມ PPSSPP ໃໝ່ອີກຄັ້ງ ເພື່ອເຫັນຜົນການປ່ຽນແປງ RestoreGameDefaultSettings = ເຈົ້າແນ່ໃຈຫຼືບໍ່ວ່າຕ້ອງການຄືນຄ່າການຕັ້ງຄ່າເກມໂດຍສະເພາະ\nກັບສູ່ຄ່າເລີ່ມຕົ້ນ PPSSPP ຫຼືບໍ່? Resume = Resume Run CPU Tests = ເອີ້ນໃຊ້ການທົດສອບ CPU @@ -522,6 +522,8 @@ Must Restart = ເຈົ້າຄວນເລີ່ມ PPSSPP ໃໝ່ເພື Native device resolution = ຄ່າຄວາມລະອຽດດັ້ງເດີມຂອງອຸປະກອນ Nearest = Nearest No buffer = No buffer +Show Battery % = Show Battery % +Show Speed = Show Speed Skip Buffer Effects = ຂ້າມການໃຊ້ບັບເຟີເອັບເຟກ (ບໍ່ໃຊ້ບັບເຟີ, ໄວຂຶ້ນ) None = ບໍ່ມີ Number of Frames = Number of frames diff --git a/assets/lang/lt-LT.ini b/assets/lang/lt-LT.ini index 5e42f7ecee..76b43bbfd2 100644 --- a/assets/lang/lt-LT.ini +++ b/assets/lang/lt-LT.ini @@ -254,7 +254,7 @@ Random = Random Replace textures = Replace textures Reset = Reset Reset limited logging = Reset limited logging -RestoreDefaultSettings = Ar atstatyti "PPSSPP" parametrus į numatytuosius?\nValdymo mygtukų parametrai nebus atstatyti į numatytuosius.\n\n\nJūs negalėsite atstatyti statuso į prieš tai buvusį.\nJūs turite perkrauti "PPSSPP" programą, kad pakeisti parametrai turėtų efektą. +RestoreDefaultSettings = Ar atstatyti "PPSSPP" parametrus į numatytuosius?\n\nJūs negalėsite atstatyti statuso į prieš tai buvusį.\nJūs turite perkrauti "PPSSPP" programą, kad pakeisti parametrai turėtų efektą. RestoreGameDefaultSettings = Are you sure you want to restore the game-specific settings\nback to the PPSSPP defaults? Resume = Resume Run CPU Tests = Atidaryti pagrindinio procesoriaus testus @@ -522,6 +522,8 @@ Must Restart = Jūs turite perkrauti "PPSSPP" programą, kad pakeisti parametrai Native device resolution = Įrenginio rezoliucija Nearest = Arčiausias No buffer = No buffer +Show Battery % = Show Battery % +Show Speed = Show Speed Skip Buffer Effects = Skip buffer effects None = Nieko Number of Frames = Number of frames diff --git a/assets/lang/ms_MY.ini b/assets/lang/ms_MY.ini index 602b35301f..1e6cf09dca 100644 --- a/assets/lang/ms_MY.ini +++ b/assets/lang/ms_MY.ini @@ -254,7 +254,7 @@ Random = Rawak Replace textures = Replace textures Reset = Reset Reset limited logging = Reset limited logging -RestoreDefaultSettings = Anda pasti menetapkan semua tetapan kecuali pemetaan kawalan kembali ke lalai?\n\nAnda tidak boleh membatalkan tindakan ini.\nSila mulakan semula PPSSPP untuk perubahan berkuat kuasa. +RestoreDefaultSettings = Anda pasti menetapkan semua tetapan ke lalai?\n\nAnda tidak boleh membatalkan tindakan ini.\nSila mulakan semula PPSSPP untuk perubahan berkuat kuasa. RestoreGameDefaultSettings = Are you sure you want to restore the game-specific settings\nback to the PPSSPP defaults? Resume = Resume Run CPU Tests = Jalankan percubaan CPU @@ -522,6 +522,8 @@ Must Restart = You must restart PPSSPP for this change to take effect. Native device resolution = Native device resolution Nearest = Terdekat No buffer = No buffer +Show Battery % = Show Battery % +Show Speed = Show Speed Skip Buffer Effects = Skip buffer effects None = Tiada Number of Frames = Number of frames diff --git a/assets/lang/nl_NL.ini b/assets/lang/nl_NL.ini index 88ebca38e1..9349806fcd 100644 --- a/assets/lang/nl_NL.ini +++ b/assets/lang/nl_NL.ini @@ -254,7 +254,7 @@ Random = Willekeurig Replace textures = Textures vervangen Reset = Reset Reset limited logging = Reset limited logging -RestoreDefaultSettings = Weet u zeker dat u alle instellingen wilt herstellen\nnaar hun standaardwaarden?\nDe besturingsinstellingen worden niet gewijzigd.\n\nDit kan niet ongedaan gemaakt worden. Start PPSSPP\nopnieuw op om de wijzigingen toe te passen. +RestoreDefaultSettings = Weet u zeker dat u alle instellingen wilt herstellen\nnaar hun standaardwaarden?\n\nDit kan niet ongedaan gemaakt worden. Start PPSSPP\nopnieuw op om de wijzigingen toe te passen. RestoreGameDefaultSettings = Weet u zeker dat u de game-specifieke instellingen wilt\nherstellen naar de standaardwaarden van PPSSPP? Resume = Resume Run CPU Tests = CPU-controles uitvoeren @@ -522,6 +522,8 @@ Must Restart = U moet PPSSPP herstarten om de wijzigingen door te voeren. Native device resolution = Apparaatresolutie Nearest = Naaste buur No buffer = No buffer +Show Battery % = Show Battery % +Show Speed = Show Speed Skip Buffer Effects = Buffereffecten nalaten (niet-gebufferd, sneller) None = Geen Number of Frames = Number of frames diff --git a/assets/lang/no_NO.ini b/assets/lang/no_NO.ini index 032a1a80e1..6f1b88faf9 100644 --- a/assets/lang/no_NO.ini +++ b/assets/lang/no_NO.ini @@ -254,7 +254,7 @@ Random = Random Replace textures = Replace textures Reset = Reset Reset limited logging = Reset limited logging -RestoreDefaultSettings = Are you sure you want to restore all settings back to their defaults?\nControl mapping settings are not changed.\n\nYou can't undo this.\nPlease restart PPSSPP for the changes to take effect. +RestoreDefaultSettings = Restore these settings back to their defaults?\nYou can't undo this.\nPlease restart PPSSPP after restoring settings. RestoreGameDefaultSettings = Are you sure you want to restore the game-specific settings\nback to the PPSSPP defaults? Resume = Resume Run CPU Tests = Kjør CPU-test @@ -522,6 +522,8 @@ Must Restart = You must restart PPSSPP for this change to take effect. Native device resolution = Native device resolution Nearest = Nermest No buffer = No buffer +Show Battery % = Show Battery % +Show Speed = Show Speed Skip Buffer Effects = Skip buffer effects None = Ingen Number of Frames = Number of frames diff --git a/assets/lang/pl_PL.ini b/assets/lang/pl_PL.ini index e219948470..1133a0c4ee 100644 --- a/assets/lang/pl_PL.ini +++ b/assets/lang/pl_PL.ini @@ -254,7 +254,7 @@ Random = Przypadkowy Replace textures = Podmiana tekstur Reset = Reset Reset limited logging = Reset limited logging -RestoreDefaultSettings = Czy na pewno chcesz przywrócić domyślne ustawienia?\nUstawienia sterowania pozostaną niezmienione.\n\n\nNie można tego cofnąć.\nZrestartuj PPSSPP, aby zastosować zmiany. +RestoreDefaultSettings = Czy na pewno chcesz przywrócić domyślne ustawienia?\n\nNie można tego cofnąć.\nZrestartuj PPSSPP, aby zastosować zmiany. RestoreGameDefaultSettings = Czy na pewno chcesz przywrócić ustawienia specyficzne dla danych gier\npowrót do ustawień domyślnych PPSSPP? Resume = Wznów Run CPU Tests = Uruchom testy CPU @@ -522,6 +522,8 @@ Must Restart = Musisz zrestartować PPSSPP, aby zobaczyć zmiany. Native device resolution = Natywna rozdzielczość urządzenia Nearest = Najbliższe No buffer = No buffer +Show Battery % = Show Battery % +Show Speed = Show Speed Skip Buffer Effects = Nie renderuj efektów z bufora (niebuforowane, szybsze) None = Wył. Number of Frames = Ilość klatek diff --git a/assets/lang/pt_BR.ini b/assets/lang/pt_BR.ini index b2c8d5dcf9..d5f65883e9 100644 --- a/assets/lang/pt_BR.ini +++ b/assets/lang/pt_BR.ini @@ -278,7 +278,7 @@ Random = Aleatório Replace textures = Substituir texturas Reset = Resetar Reset limited logging = Resetar o registro limitado -RestoreDefaultSettings = Você tem certeza que você quer restaurar todas as configurações de volta aos padrões delas?\nAs configurações do mapeamento dos controles não são mudadas.\nVocê não pode desfazer isto.\nPor favor reinicie o PPSSPP para as mudanças terem efeito. +RestoreDefaultSettings = Você tem certeza que você quer restaurar todas as configurações de volta aos padrões delas?\n\nVocê não pode desfazer isto.\nPor favor reinicie o PPSSPP para as mudanças terem efeito. RestoreGameDefaultSettings = Você tem certeza que você quer restaurar as configurações específicas do jogo\nde volta para os padrões do PPSSPP? Resume = Resumo Run CPU Tests = Executar testes da CPU @@ -522,7 +522,7 @@ Frame Skipping = Pulo dos frames Frame Skipping Type = Tipo de pulo dos frames FullScreen = Tela cheia Geometry shader culling = Abate do shader da geometria -Hack Settings = Configurações dos hacks (pode causar erros gráficos) +Hack Settings = Configurações dos hacks (pode causar erros gráficos) Hardware Tessellation = Tesselação por hardware Hardware Transform = Transformação por hardware hardware transform error - falling back to software = Erro de transformação pelo hardware, retrocedendo pro software. @@ -546,6 +546,8 @@ Must Restart = Você deve reiniciar o PPSSPP pra esta mudança ter efeito. Native device resolution = Resolução nativa do dispositivo Nearest = Mais próximo No buffer = Sem buffer +Show Battery % = Show Battery % +Show Speed = Show Speed Skip Buffer Effects = Ignorar efeitos do buffer None = Nenhum Number of Frames = Número de frames @@ -889,10 +891,10 @@ tools = Ferramentas grátis usadas: # Leave extra lines blank. 4 contributors per line seems to look best. translators1 = Papel, gabrielmop, Efraim Lopes, AkiraJkr translators2 = Felipe -translators3 = -translators4 = -translators5 = -translators6 = +translators3 = +translators4 = +translators5 = +translators6 = Twitter @PPSSPP_emu = Twitter @PPSSPP_emu website = Verifique o site da web: written = Escrito em C++ pela velocidade e portabilidade diff --git a/assets/lang/pt_PT.ini b/assets/lang/pt_PT.ini index 65719e17ca..45efb8e0ab 100644 --- a/assets/lang/pt_PT.ini +++ b/assets/lang/pt_PT.ini @@ -278,7 +278,7 @@ Random = Aleatório Replace textures = Substituir texturas Reset = Reiniciar Reset limited logging = Reiniciar o log limitado -RestoreDefaultSettings = Tens a certeza que queres restaurar todas as Definições de volta ao padrão?\nAs Definições do mapeamento dos controlos não serão mudadas.\nTu não podes desfazer isto.\nPor favor reinicie o PPSSPP para as mudanças terem efeito. +RestoreDefaultSettings = Tens a certeza que queres restaurar todas as Definições de volta ao padrão?\n\nTu não podes desfazer isto.\nPor favor reinicie o PPSSPP para as mudanças terem efeito. RestoreGameDefaultSettings = Tens a certeza que queres restaurar as Definições específicas do jogo\nde volta para os padrões do PPSSPP? Resume = Resumir Run CPU Tests = Executar testes da CPU @@ -546,6 +546,8 @@ Must Restart = Deverás reiniciar o PPSSPP para esta mudança ter efeito. Native device resolution = Resolução Nativa do Dispositivo Nearest = Mais próximo No buffer = Sem buffer +Show Battery % = Show Battery % +Show Speed = Show Speed Skip Buffer Effects = Ignorar efeitos do buffer (sem buffer, mais rápido) None = Nenhum Number of Frames = Número de quadros diff --git a/assets/lang/ro_RO.ini b/assets/lang/ro_RO.ini index a6832af01c..98ce8f3cc3 100644 --- a/assets/lang/ro_RO.ini +++ b/assets/lang/ro_RO.ini @@ -254,7 +254,7 @@ Random = Random Replace textures = Replace textures Reset = Reset Reset limited logging = Reset limited logging -RestoreDefaultSettings = Are you sure you want to restore all settings back to their defaults?\nControl mapping settings are not changed.\n\nYou can't undo this.\nPlease restart PPSSPP for the changes to take effect. +RestoreDefaultSettings = Restore these settings back to their defaults?\nYou can't undo this.\nPlease restart PPSSPP after restoring settings. RestoreGameDefaultSettings = Are you sure you want to restore the game-specific settings\nback to the PPSSPP defaults? Resume = Resume Run CPU Tests = Run CPU tests @@ -522,6 +522,8 @@ Must Restart = Trebuie să resartezi PPSSPP pt. ca această schimbare să aibă Native device resolution = Rezoluție nativă dispozitiv Nearest = Apropiată No buffer = No buffer +Show Battery % = Show Battery % +Show Speed = Show Speed Skip Buffer Effects = Skip buffer effects None = Fără Number of Frames = Number of frames diff --git a/assets/lang/ru_RU.ini b/assets/lang/ru_RU.ini index 01391d7144..29e9c1915e 100644 --- a/assets/lang/ru_RU.ini +++ b/assets/lang/ru_RU.ini @@ -254,7 +254,7 @@ Random = Случайный Replace textures = Подменять текстуры Reset = Сбросить Reset limited logging = Сбросить ограниченное логирование -RestoreDefaultSettings = "Вы уверены, что хотите сбросить настройки\n(кроме управления) на стандартные?\nВы не сможете это отменить.\nПожалуйста, перезапустите PPSSPP после сброса." +RestoreDefaultSettings = "Вы уверены, что хотите сбросить настройки на стандартные?\nВы не сможете это отменить.\nПожалуйста, перезапустите PPSSPP после сброса." RestoreGameDefaultSettings = Вы уверены, что хотите вернуть все параметры игры к стандартным? Resume = Resume Run CPU Tests = Запустить тесты ЦП @@ -522,6 +522,8 @@ Must Restart = Вы должны перезапустить PPSSPP, чтобы Native device resolution = Разрешение устройства Nearest = Ближайший No buffer = Нет буфера +Show Battery % = Показывать % заряда батареи +Show Speed = Показывать скорость Skip Buffer Effects = Пропускать эффекты (небуферированный) None = Выключено Number of Frames = Количество кадров @@ -880,7 +882,7 @@ Current = Текущая DataCanBeShared = Данные могут передаваться между обычным PPSSPP и Gold DataCannotBeShared = Данные НЕ МОГУТ передаваться между обычным PPSSPP и Gold! DataWillBeLostOnUninstall = Внимание! Данные будут утеряны, если вы удалите PPSSPP! -DataWillStay = Данные останутся, даже если вы удалите PPSSPP. +DataWillStay = Данные останутся, даже если вы удалите PPSSPP Done! = Завершено! EasyUSBAccess = Простой доступ к USB Failed to move some files! = Не получилось переместить некоторые файлы! diff --git a/assets/lang/sv_SE.ini b/assets/lang/sv_SE.ini index 7889fe5084..fd14dc2882 100644 --- a/assets/lang/sv_SE.ini +++ b/assets/lang/sv_SE.ini @@ -254,7 +254,7 @@ Random = Slump Replace textures = Ersätt texturer Reset = Återställ Reset limited logging = Reset limited logging -RestoreDefaultSettings = Are you sure you want to restore all settings back to their defaults?\nControl mapping settings are not changed.\n\nYou can't undo this.\nPlease restart PPSSPP for the changes to take effect. +RestoreDefaultSettings = Restore these settings back to their defaults?\nYou can't undo this.\nPlease restart PPSSPP after restoring settings. RestoreGameDefaultSettings = Are you sure you want to restore the game-specific settings\nback to the PPSSPP defaults? Resume = Resume Run CPU Tests = Kör CPU-tester @@ -522,6 +522,8 @@ Must Restart = Starta om PPSSPP för att ändringen ska få effekt. Native device resolution = Native device resolution Nearest = Närmast No buffer = Ingen buffer +Show Battery % = Show Battery % +Show Speed = Show Speed Skip Buffer Effects = Skippa buffereffekter (snabbare, risk för fel) None = Inget Number of Frames = Antal frames diff --git a/assets/lang/tg_PH.ini b/assets/lang/tg_PH.ini index 718a8adc59..3a29fe53e2 100644 --- a/assets/lang/tg_PH.ini +++ b/assets/lang/tg_PH.ini @@ -254,7 +254,7 @@ Random = Random Replace textures = Replace textures Reset = Ulitin Reset limited logging = Reset limited logging -RestoreDefaultSettings = Sigurado ka bang ibalik ang Ssetting sa dati?\nAng Control Mapping Settings ay di mababago.\n\n\nHindi mo na ito maibabalik.\nPaki-restart ang PPSSPP para makita ang mga binago. +RestoreDefaultSettings = Sigurado ka bang ibalik ang Ssetting sa dati?\n\nHindi mo na ito maibabalik.\nPaki-restart ang PPSSPP para makita ang mga binago. RestoreGameDefaultSettings = Sigurado ka bang ibalik sa dati\nang Setting ng isang spesipikong laro?\n\n\nHindi mo na ito maibabalik.\nPaki-restart ang PPSSPP para makita ang mga binago. Resume = Resume Run CPU Tests = Magsagawa ng CPU Tests @@ -522,6 +522,8 @@ Must Restart = Kailangan i-restart ang PPSSPP upang maging epiktibo ito Native device resolution = Native device resolution Nearest = Pinakamalapit No buffer = No buffer +Show Battery % = Show Battery % +Show Speed = Show Speed Skip Buffer Effects = Skip buffer effects (non-buffered, mabilis) None = Wala Number of Frames = Bilang ng frames diff --git a/assets/lang/th_TH.ini b/assets/lang/th_TH.ini index 9f86a0cf24..4e6a3fe23c 100644 --- a/assets/lang/th_TH.ini +++ b/assets/lang/th_TH.ini @@ -254,7 +254,7 @@ Random = สุ่ม Replace textures = แทนที่พื้นผิวจากแหล่งที่เก็บข้อมูล Reset = คืนค่า Reset limited logging = รีเซ็ตขีดจำกัดของการบันทึกค่า -RestoreDefaultSettings = คุณแน่ใจรึว่าต้องการรีเซ็ตกลับไปเป็นค่าเริ่มต้น?\nการตั้งค่าของปุ่มต่างๆ จะไม่ถูกลบ\n\nคุณสามารถกดยกเลิกได้\nแต่ถ้าหากกดตกลงแล้วไม่เห็นผลการเปลี่ยนแปลง\nโปรดเริ่ม PPSSPP ใหม่อีกครั้งนึง +RestoreDefaultSettings = คุณแน่ใจรึว่าต้องการรีเซ็ตกลับไปเป็นค่าเริ่มต้น?\n\nคุณสามารถกดยกเลิกได้\nแต่ถ้าหากกดตกลงแล้วไม่เห็นผลการเปลี่ยนแปลง\nโปรดเริ่ม PPSSPP ใหม่อีกครั้งนึง RestoreGameDefaultSettings = คุณแน่ใจรึว่าต้องการรีเซ็ตตั้งค่าเฉพาะเกม?\nการตั้งค่าของเกมนี้จะกลับไปใช้ค่าเริ่มต้นของ PPSSPP? Resume = เล่นต่อ Run CPU Tests = เรียกใช้การทดสอบซีพียู @@ -522,6 +522,8 @@ Must Restart = คุณควรรีสตาร์ท PPSSPP อีกคร Native device resolution = ค่าความละเอียดดั้งเดิมของอุปกรณ์ Nearest = แบบใกล้เคียง No buffer = ไม่ใช้บัฟเฟอร์ +Show Battery % = Show Battery % +Show Speed = Show Speed Skip Buffer Effects = ข้ามการใช้บัฟเฟอร์เอฟเฟ็คท์ (ปิดบัฟเฟอร์) None = ไม่มี Number of Frames = อิงจากค่าจำนวนเฟรม diff --git a/assets/lang/tr_TR.ini b/assets/lang/tr_TR.ini index 6bb17f5a22..e9d6125315 100644 --- a/assets/lang/tr_TR.ini +++ b/assets/lang/tr_TR.ini @@ -256,7 +256,7 @@ Random = Rastgele Replace textures = Dokuları değiştir Reset = Sıfırla Reset limited logging = Sınırlı günlük kaydını sıfırlayın -RestoreDefaultSettings = Bütün ayarları varsayılanlarına döndürmek istediğine emin misin?\nKontrol ayarları değiştirilmedi.\n\nBunu geri alamazsın.\nDeğişikliklerin uygulanması için lütfen PPSSPP'yi yeniden başlatın. +RestoreDefaultSettings = Bütün ayarları varsayılanlarına döndürmek istediğine emin misin?\n\nBunu geri alamazsın.\nDeğişikliklerin uygulanması için lütfen PPSSPP'yi yeniden başlatın. RestoreGameDefaultSettings = Oyun için ayarlanmış olan özel ayarları PPSSPP varsayılanlarına döndürmek istediğinden emin misin? Resume = Devam ettir Run CPU Tests = İşlemci testlerini başlat @@ -524,6 +524,8 @@ Must Restart = Bu değişikliğin uygulanması için PPSSPP'yi yeniden başlatma Native device resolution = Yerel aygıt çözünürlüğü Nearest = En yakın No buffer = Arabellek/tampon bellek yok +Show Battery % = Show Battery % +Show Speed = Show Speed Skip Buffer Effects = Arabellek efektlerini atla (arabelleğe alınmaz, daha hızlıdır) None = Hiçbiri Number of Frames = Kare sayısı diff --git a/assets/lang/uk_UA.ini b/assets/lang/uk_UA.ini index fbe6a704e8..cfe33702b2 100644 --- a/assets/lang/uk_UA.ini +++ b/assets/lang/uk_UA.ini @@ -254,7 +254,7 @@ Random = Випадковий Replace textures = Заміна текстур Reset = Reset Reset limited logging = Reset limited logging -RestoreDefaultSettings = "Ви впевненні,що хочете скинути налаштування \n(окрім керування) на стандартні?\nВи не зможите це відмінити.\nБудь ласка, презавантажте PPSSPP після скидання." +RestoreDefaultSettings = "Ви впевненні,що хочете скинути налаштування на стандартні?\nВи не зможите це відмінити.\nБудь ласка, презавантажте PPSSPP після скидання." RestoreGameDefaultSettings = Ви впевнені, що хочете повернути всі параметри гри до стардартних\nповернути PPSSPP за замовчуванням ? Resume = Resume Run CPU Tests = Запустити тести CPU @@ -522,6 +522,8 @@ Must Restart = Ви повинні перезавантажити PPSSPP, щоб Native device resolution = Роздільна здатність пристрою Nearest = Найближчий No buffer = Без буфера +Show Battery % = Show Battery % +Show Speed = Show Speed Skip Buffer Effects = Пропускати ефекти (небуференізованний, швидше) None = Немає Number of Frames = Кількість кадрів diff --git a/assets/lang/vi_VN.ini b/assets/lang/vi_VN.ini index d9f8272c47..8c5815ef01 100644 --- a/assets/lang/vi_VN.ini +++ b/assets/lang/vi_VN.ini @@ -254,7 +254,7 @@ Random = Ngẫu nhiên Replace textures = Thay thế textures Reset = Reset Reset limited logging = Reset limited logging -RestoreDefaultSettings = Bạn có muốn khôi phục các thiết lập về mặc định không?\nThiết lập tay cầm (bên ngoài) sẽ không bị thay đổi.\n\n\n\nHãy thoát PPSSPP rồi mở lại. +RestoreDefaultSettings = Bạn có muốn khôi phục các thiết lập về mặc định không?\n\nHãy thoát PPSSPP rồi mở lại. RestoreGameDefaultSettings = Bạn có muốn khôi phục cài đặt trò chơi\nPPSSPP sẽ trở về mặc định? Resume = Resume Run CPU Tests = Chạy thử CPU @@ -522,6 +522,8 @@ Must Restart = Bạn cần khởi động lại PPSSPP để những thay đổi Native device resolution = Độ phân giải tự nhiên. Nearest = Gần nhất No buffer = No buffer +Show Battery % = Show Battery % +Show Speed = Show Speed Skip Buffer Effects = Bỏ qua hiệu ứng đệm (không bộ nhớ đệm, nhanh hơn) None = Không Number of Frames = Number of frames diff --git a/assets/lang/zh_CN.ini b/assets/lang/zh_CN.ini index b3af1111bd..068153bd9b 100644 --- a/assets/lang/zh_CN.ini +++ b/assets/lang/zh_CN.ini @@ -1,8 +1,8 @@ [Audio] -Alternate speed volume = 自定义速度时的音量 -Audio backend = 音频引擎(需要重启) +Alternate speed volume = 备选速度时的音量 +Audio backend = 音频引擎 Audio Error = 音频错误 -AudioBufferingForBluetooth = 蓝牙友好缓冲区(更慢) +AudioBufferingForBluetooth = 适合蓝牙缓冲区(更慢) Auto = 自动 Device = 设备 Disabled = 禁用 @@ -22,12 +22,12 @@ Analog Binding = 摇杆绑定 Analog Settings = 摇杆设置 Analog Style = 摇杆样式 Auto-rotation speed = 自动旋转速度 -Analog Limiter = 摇杆限制器 +Analog Limiter = 摇杆限制 Analog Stick = 摇杆 -AnalogLimiter Tip = 当按下摇杆限制器键时 +AnalogLimiter Tip = 按下限制键时摇杆的最大移动范围 Auto = 自动 Auto-centering analog stick = 摇杆自动跟手 -Auto-hide buttons after seconds = 自动隐藏按键时间 +Auto-hide buttons after seconds = 自动隐藏按键 Auto-switch = 自动切换 Base tilt position = 标准体感位置 Binds = 绑定 @@ -35,20 +35,20 @@ Button Binding = 按键绑定 Button Opacity = 按键透明度 Button style = 按键样式 Calibrate Analog Stick = 校准摇杆 -Calibrate D-Pad = 校准方向键 +Calibrate D-Pad = 校准 Calibrated = 校准后 Calibration = 校准 -Circular stick input = 环形摇杆输入 +Circular stick input = 环四周摇杆输入 Classic = 传统 Confine Mouse = 鼠标固定在窗口/显示区域内 Control Mapping = 按键映射 Custom Key Setting = 自定义键位设置 -Customize = 自定义 -Customize Touch Controls = 编辑触屏布局... -Customize tilt = 自定义重力感应... +Customize = 自定义… +Customize Touch Controls = 编辑触屏布局… +Customize tilt = 自定义重力感应… D-PAD = 方向键 Deadzone radius = 死区半径 -Disable D-Pad diagonals (4-way touch) = 禁用方向键对角线(四方向触控) +Disable D-Pad diagonals (4-way touch) = 禁用对角线输入(方向键) Disable diagonal input = 禁用对角线方向输入 Double tap = 双击 Enable gesture control = 启用体感操作 @@ -56,38 +56,38 @@ Enable standard shortcut keys = 启用标准快捷键 Gesture = 体感 Gesture mapping = 体感映射 Glowing borders = 细边框(发光) -HapticFeedback = 按键反馈(震动) -Hide touch analog stick background circle = 隐藏触屏摇杆的背景圈 +HapticFeedback = 按键震动 +Hide touch analog stick background circle = 隐藏摇杆圈 Icon = 图标 -Ignore gamepads when not focused = 后台运行时忽略游戏手柄 +Ignore gamepads when not focused = 后台运行时忽略手柄 Ignore Windows Key = 忽略Windows键 Invert Axes = 轴反转 Invert Tilt along X axis = 沿X轴倾斜反转 Invert Tilt along Y axis = 沿Y轴倾斜反转 -Keep this button pressed when right analog is pressed = 按下右摇杆时长按此按键 -Keyboard = 键盘控制设定 -L/R Trigger Buttons = L/R扳机按钮 +Keep this button pressed when right analog is pressed = 移动右摇杆时长按此键 +Keyboard = 键盘专用设定 +L/R Trigger Buttons = L/R 按钮 Landscape = 横向 Landscape Auto = 自动横向 Landscape Reversed = 横向反转 -Low end radius = 末端半径 +Low end radius = 起步半径 Mouse = 鼠标设置 Mouse sensitivity = 鼠标灵敏度 Mouse smoothing = 鼠标平滑度 -MouseControl Tip = 您可以在按键映射界面按下'M'图标来映射鼠标按键。 -None (Disabled) = 无(禁用) +MouseControl Tip = 可以在按键映射界面按下'M'图标来映射鼠标。 +None (Disabled) = 无 (禁用) Off = 关闭 -OnScreen = 屏幕虚拟按键 +OnScreen = 屏幕虚拟键 Portrait = 纵向 Portrait Reversed = 纵向反转 -PSP Action Buttons = PSP功能键 +PSP Action Buttons = PSP 动作键 Raw input = 原始输入 -Repeat mode = 连点模式 +Repeat mode = 连发模式 Reset to defaults = 重置为默认 Screen aligned to ground = 屏幕水平地面 Screen at right angle to ground = 屏幕垂直地面 Screen Rotation = 屏幕旋转 -seconds, 0 : off = 秒, 0 = 不隐藏 +seconds, 0 : off = 秒, 0=不隐藏 Sensitivity (scale) = 灵敏度(倍率) Sensitivity = 灵敏度 Shape = 外形 @@ -97,12 +97,12 @@ Swipe sensitivity = 滑动灵敏度 Swipe smoothing = 滑动平滑度 Thin borders = 细边框 Tilt Base Radius = 倾斜最小半径 -Tilt Input Type = 重力感应替代按键类型 +Tilt Input Type = 重力感应按键 Tilt Sensitivity along X axis = 沿X轴倾斜灵敏度 Tilt Sensitivity along Y axis = 沿Y轴倾斜灵敏度 -To Calibrate = 如需校准, 请保证设备在一个平面上,然后按"校准" +To Calibrate = 如需校准, 请放好设备在水平面上,然后按"校准" Toggle mode = 开关模式(只需按一次) -Touch Control Visibility = 可见的触屏按键 +Touch Control Visibility = 显示的按键 Use custom right analog = 自定义右摇杆用途 Use Mouse Control = 使用鼠标控制 Visibility = 按键显示 @@ -113,7 +113,7 @@ Y = Y [CwCheats] Cheats = 金手指 Edit Cheat File = 编辑金手指文件 -Enable/Disable All = 启用/禁用所有金手指 +Enable/Disable All = 启用/禁用全部 Import Cheats = 从cheat.db导入 Options = 选项 Refresh Rate = 刷新率 @@ -172,9 +172,9 @@ Log Console = 控制台日志 (&L) Memory View... = 查看内存 (&V)... More Settings... = 更多设置 (&M)... Nearest = 邻近取样 (&N) -Skip Buffer Effects = 跳过缓冲效果(不缓冲, 更快) (&S) +Skip Buffer Effects = 跳过缓冲效果(更快) (&S) Off = 关闭 (&O) -Open Chat = 打开聊天 +Open Chat = 聊天窗口 Open Directory... = 打开路径(&D)... Open from MS:/PSP/GAME... = 从MS:/PSP/GAME处打开 (&p)... Open Memory Stick = 打开记忆棒 (&M) @@ -200,7 +200,7 @@ Save State File... = 保存即时存档 (&S)... Savestate Slot = 即时存档插槽 (&t) Screen Scaling Filter = 屏幕缩放方法 (&e) Show Debug Statistics = 显示调试信息 (&g) -Show FPS Counter = 显示FPS计数器 (&F) +Show FPS Counter = 显示帧率 (&F) Skip Number of Frames = 跳过帧的数量 Skip Percent of FPS = 跳过帧率的百分比 Stop = 停止 (&S) @@ -208,8 +208,8 @@ Switch UMD = 切换UMD光盘 Take Screenshot = 屏幕截图 (&T) Texture Filtering = 纹理过滤方法 (&x) Texture Scaling = 纹理缩放方法 (&T) -Use Lossless Video Codec (FFV1) = 使用无损视频编解码器(FFV1) (&U) -Use output buffer for video = 录制时使用输出缓冲 +Use Lossless Video Codec (FFV1) = 使用无损视频编码器(FFV1) (&U) +Use output buffer for video = 录制使用输出缓冲 Vertex Cache = 顶点缓存 (&V) VSync = 垂直同步 (&y) Vulkan = Vulkan @@ -230,9 +230,9 @@ Dev Tools = 开发者工具 DevMenu = 开发者菜单 Disabled JIT functionality = 已禁用的JIT功能 Draw Frametimes Graph = 显示帧时间统计图 -Dump Decrypted Eboot = 当载入游戏时转储已解密的EBOOT.BIN +Dump Decrypted Eboot = 载入游戏时保存已解密的EBOOT.BIN Dump next frame to log = 转储下一帧到日志 -Enable driver bug workarounds = 启用驱动程序错误解决方法 +Enable driver bug workarounds = 启用GPU驱动错误解决方法 Enable Logging = 启用调试日志 Enter address = 输入地址 FPU = FPU @@ -254,14 +254,14 @@ Random = 随机 Replace textures = 纹理替换 Reset = 重置 Reset limited logging = 重置受限日志 -RestoreDefaultSettings = 您确定要将所有设置恢复到默认? (按键映射除外)\n该操作无法撤销。\n\n操作将在PPSSPP重新启动后生效。 +RestoreDefaultSettings = 您确定要将所有设置恢复到默认?\n该操作无法撤销。\n操作将在PPSSPP重新启动后生效。 RestoreGameDefaultSettings = 您确定要将此游戏设置\n恢复为PPSSPP默认吗? Resume = 恢复 Run CPU Tests = 运行CPU测试 Save new textures = 保存新纹理 Shader Viewer = 着色器查看器 Show Developer Menu = 显示开发者菜单 -Show on-screen messages = 显示屏幕消息 +Show on-screen messages = 显示屏幕上方消息 Stats = 统计数据 System Information = 系统信息 Texture ini file created = 创建纹理ini文件 @@ -277,8 +277,8 @@ Active = 激活 Back = 返回 Cancel = 取消 Center = 中心 -ChangingGPUBackends = 更改引擎模式后需要重启PPSSPP。立刻重启? -ChangingInflightFrames = 更改缓冲图形命令后需要重启PPSSPP。立刻重启? +ChangingGPUBackends = 更改引擎模式需要重启PPSSPP。立刻重启吗? +ChangingInflightFrames = 更改缓冲图形命令需要重启PPSSPP。立刻重启吗? Channel: = 信道: Choose PPSSPP save folder = 选择PPSSPP存档的文件夹 Confirm Overwrite = 您要覆盖这个存档吗? @@ -312,7 +312,7 @@ Load = 载入 Load completed = 已载入。 Loading = 载入中\n请稍候... LoadingFailed = 无法载入存档。 -Move = 移动 +Move = 移动位置 Move Down = 移至下层 Move Up = 移至上层 Network Connection = 网络连接 @@ -340,7 +340,7 @@ SSID = SSID Submit = 提交 Supported = 支持 There is no data = 存档不存在。 -Toggle All = 全选(全不选) +Toggle All = 全选/不选 Toggle List = 切换列表 Unsupported = 不支持 When you save, it will load on a PSP, but not an older PPSSPP = 当您保存后, 它只会在PSP实机上载入, 而不是旧版本的PPSSPP @@ -391,8 +391,8 @@ PS1 EBOOTs are not supported by PPSSPP. = PPSSPP不支持由PS1 EBOOT生成的 PSX game image detected. = 这是MODE2镜像。PPSSPP不支持PS1游戏。 RAR file detected (Require UnRAR) = 这是RAR压缩文件。\n请尝试使用UnRAR进行解压缩。 RAR file detected (Require WINRAR) = 这是RAR压缩文件。\n请尝试使用WinRAR进行解压缩。 -Running slow: try frameskip, sound is choppy when slow = 运行速度慢:尝试跳帧, 运行速度慢时声音不连贯 -Running slow: Try turning off Software Rendering = 运行速度慢:尝试关闭"软件渲染" +Running slow: try frameskip, sound is choppy when slow = 运行速度慢:可以尝试跳帧, 减速时声音会不连贯 +Running slow: Try turning off Software Rendering = 运行速度慢:可以尝试关闭软件渲染 Save encryption failed. This save won't work on real PSP = 存档加密失败。此存档将无法在PSP实机使用 textures.ini filenames may not be cross-platform = "textures.ini"文件名可能不是多平台的。 This is a saved state, not a game. = 这是一个即时存档,不是游戏。 @@ -407,7 +407,7 @@ ZIP file detected (Require WINRAR) = 这是ZIP压缩文件。\n请尝试使用Wi [Game] Asia = 亚洲 -Calculate CRC = 计算CRC +Calculate CRC = 计算CRC校验码 ConfirmDelete = 确认删除 Create Game Config = 建立游戏配置 Create Shortcut = 创建快捷方式 @@ -424,13 +424,13 @@ Japan = 日本 Korea = 韩国 MB = MB One moment please... = 请稍等... -Play = 启动游戏 +Play = 启动 Remove From Recent = 从"最近的游戏"中删除 SaveData = 存档 Setting Background = 设置背景 -Show In Folder = 显示文件夹 +Show In Folder = 在文件夹中显示 USA = 美国 -Use UI background = 使用界面背景 +Use UI background = 使用背景为壁纸 [Graphics] % of the void = %的边框 @@ -455,10 +455,10 @@ Use UI background = 使用界面背景 10x PSP = 10倍PSP 16x = 16倍 Aggressive = 激进 -Alternative Speed = 自定义速度 -Alternative Speed 2 = 自定义速度2 +Alternative Speed = 备选速度1 +Alternative Speed 2 = 备选速度2 Anisotropic Filtering = 各向异性过滤 -Antialiasing (MSAA) = 抗锯齿 (MSAA) +Antialiasing (MSAA) = 抗锯齿(MSAA) Aspect Ratio = 宽高比 Auto = 自动 Auto (1:1) = 自动(1:1) @@ -471,7 +471,7 @@ Balanced = 均衡 Bicubic = 双三次 Both = 全部显示 Buffer graphics commands (faster, input lag) = 缓冲图形命令(更快, 增加输入延迟) -BufferedRenderingRequired = 警告:此游戏需要将"渲染模式"设置为"缓冲渲染"。 +BufferedRenderingRequired = 警告:此游戏需要关闭"跳过缓冲效果"。 Camera = 摄像头 Camera Device = 摄像头设备 Cardboard Screen Size = 屏幕大小(视区%) @@ -479,11 +479,11 @@ Cardboard Screen X Shift = 水平 % Cardboard Screen Y Shift = 垂直 % Cardboard VR Settings = Google Cardboard VR设置 Cheats = 金手指 -CPU Core = CPU 核心模式 +CPU Core = CPU核心模式 Debugging = 调试设置 DefaultCPUClockRequired = 警告:此游戏需要将CPU频率设置为默认。 Deposterize = 色调融合 -Deposterize Tip = 修复纹理被放大时可见的带状错误 +Deposterize Tip = 修复纹理被放大时可见的缝隙 Device = 设备 Direct3D 9 = Direct3D 9 Direct3D 11 = Direct3D 11 @@ -497,13 +497,13 @@ Frame Skipping = 跳帧 Frame Skipping Type = 跳帧方式 FullScreen = 全屏幕 Geometry shader culling = 几何着色器剔除 -GPUReadbackRequired = 警告: 此游戏需要"跳过 GPU 回读"设置为关闭 +GPUReadbackRequired = 警告: 此游戏需要"跳过GPU块传输"设置为关闭 Hack Settings = 渲染修正(可能引发故障) Hardware Tessellation = 硬件曲面细分 Hardware Transform = 硬件几何变换 hardware transform error - falling back to software = 硬件几何变换错误, 改回软件模式 -HardwareTessellation Tip = 使用硬件绘制曲线, 使用固定的质量 -High = 高 +HardwareTessellation Tip = 使用硬件绘制曲线, 采用固定的质量 +High = 高质量 Hybrid = 混合 Hybrid + Bicubic = 混合+双三次 Ignore camera notch when centering = 忽略摄像头挖孔 @@ -511,18 +511,20 @@ Internal Resolution = 内部分辨率 Lazy texture caching = 减少缓存存取(提速) Lazy texture caching Tip = 更快, 在一些游戏里引起文字渲染错误 Linear = 线性过滤 -Low = 低 -LowCurves = 低品质样条函数/贝塞尔曲线(提速) -LowCurves Tip = 仅对部分游戏有效, 控制曲线的平滑度 -Lower resolution for effects (reduces artifacts) = 降低特效分辨率(减少图像错误) +Low = 低质量 +LowCurves = 样条函数/贝塞尔曲线质量(提速) +LowCurves Tip = 适用于极少部分游戏, 控制曲线的细节程度 +Lower resolution for effects (reduces artifacts) = 降低特效分辨率(减少特效错误) Manual Scaling = 手动缩放 -Medium = 中 +Medium = 中质量 Mode = 渲染模式 Must Restart = 重启PPSSPP才能使这项设置生效。 Native device resolution = 本机原生的分辨率 Nearest = 邻近取样 No buffer = 不缓冲 -Skip Buffer Effects = 跳过缓冲效果(不缓冲, 更快) +Show Battery % = 显示电量 % +Show Speed = 显示速度 +Skip Buffer Effects = 跳过缓冲效果(更快) None = 不显示 Number of Frames = 帧的数量 Off = 关闭 @@ -530,26 +532,26 @@ OpenGL = OpenGL Overlay Information = 叠加信息 Partial Stretch = 部分拉伸 Percent of FPS = 帧率的百分比 -Performance = 性能 +Performance = 性能选项 Postprocessing shaders = 后处理着色器 Recreate Activity = 重建进程 Render duplicate frames to 60hz = 渲染重复帧至60Hz -RenderDuplicateFrames Tip = 在较低帧率的游戏中可以使帧速率更平滑 +RenderDuplicateFrames Tip = 在较低帧率的游戏中, 使帧生成更平滑 Rendering Mode = 渲染模式 Rendering Resolution = 渲染分辨率 -RenderingMode NonBuffered Tip = 更快,但可能在某些游戏中丢失特效 +RenderingMode NonBuffered Tip = 更快, 在某些游戏中丢失特效 Rotation = 方向 Safe = 安全 Screen Scaling Filter = 缩放方法 Show Debug Statistics = 显示调试信息 -Show FPS Counter = 显示FPS计数器 -Skip GPU Readbacks = 跳过 GPU 回读 +Show FPS Counter = 显示帧率 +Skip GPU Readbacks = 跳过GPU块传输 Software Rendering = 软件渲染(慢) Software Skinning = 软件蒙皮 -SoftwareSkinning Tip = 合并CPU中已经蒙皮的模型绘制,在部分游戏中更快 +SoftwareSkinning Tip = 将模型绘制转移至CPU, 在较多游戏中更快, 但也有减速的反例 Speed = 运行速度 -Speed Hacks = 提速修正 (引起不稳定性) -Stereo display shader = 立体显示效果 +Speed Hacks = 提速修正 (引起画面错误) +Stereo display shader = 立体显示模式 Stereo rendering = 立体渲染 Stretch = 拉伸 Texture Filter = 纹理过滤方法 @@ -562,10 +564,10 @@ Up to 1 = 最高为1 Up to 2 = 最高为2 Upscale Level = 纹理缩放级别 Upscale Type = 纹理缩放方法 -UpscaleLevel Tip = CPU重负载-为避免卡顿, 某些缩放可能会延迟 +UpscaleLevel Tip = CPU负担大--某些缩放会延迟, 以减少卡顿 Use all displays = 使用全部显示器 Vertex Cache = 顶点缓存 -VertexCache Tip = 更快,但可能会造成暂时的闪烁 +VertexCache Tip = 略微提速, 可能造成暂时模型闪烁或丢失 VSync = 垂直同步 Vulkan = Vulkan Window Size = 窗口大小 @@ -583,16 +585,16 @@ Zip file does not contain PSP software = ZIP文件不包含PSP软件 [KeyMapping] Autoconfigure = 自动配置 -Autoconfigure for device = 自动根据设备配置 +Autoconfigure for device = 根据设备配置 Bind All = 全部绑定 Clear All = 全部清除 Default All = 恢复默认 -Map a new key for = 映射该键的新按键 +Map a new key for = 输入一个新按键: Map Key = 按键映射 Map Mouse = 鼠标映射 Replace = 替换现有 -Show PSP = 显示 PSP -You can press ESC to cancel. = 您可以按下ESC键取消 +Show PSP = PSP布局 +You can press ESC to cancel. = 可以按下 ESC 键取消 [MainMenu] Browse = 浏览... @@ -609,13 +611,13 @@ How to get games = 如何获得游戏? How to get homebrew & demos = 如何获得自制游戏与试玩? Load = 载入游戏... Loading... = 载入中... -PinPath = 固定 +PinPath = 置顶文件夹 PPSSPP can't load games or save right now = PPSSPP现在不能载入游戏或存档 Recent = 最近的游戏 SavesAreTemporary = PPSSPP正在临时空间内存档 SavesAreTemporaryGuidance = 请将PPSSPP解压出来以使存档永久保留 SavesAreTemporaryIgnore = 忽略警告 -UnpinPath = 取消固定 +UnpinPath = 取消置顶 UseBrowseOrLoad = 浏览以选择文件夹,或者加载以读取游戏文件 www.ppsspp.org = 访问官网 @@ -629,18 +631,18 @@ Tools = 工具 Search = 搜索 [MappableControls] -Alt speed 1 = 自定义速度1 -Alt speed 2 = 自定义速度2 +Alt speed 1 = 备选速度1 +Alt speed 2 = 备选速度2 An.Down = 左摇杆:下 An.Left = 左摇杆:左 An.Right = 左摇杆:右 An.Up = 左摇杆:上 -Analog limiter = 摇杆限制器 +Analog limiter = 摇杆限制 Analog Stick = 左摇杆 -Audio/Video Recording = 音频/视频录制 -AxisSwap = 摇杆互换 -Circle = 圆 -Cross = 叉 +Audio/Video Recording = 录制音频视频 +AxisSwap = 摇杆/方向键互换 +Circle = 圆圈键 +Cross = 叉键 Custom 1 = 预设1 Custom 10 = 预设10 Custom 2 = 预设2 @@ -656,30 +658,30 @@ D-pad left = 方向键:左 D-pad right = 方向键:右 D-pad up = 方向键:上 DevMenu = 开发者菜单 -Display Landscape = 显示横向 -Display Landscape Reversed = 显示横向反转 -Display Portrait = 显示纵向 -Display Portrait Reversed = 显示纵向反转 +Display Landscape = 横向显示 +Display Landscape Reversed = 横向反转显示 +Display Portrait = 纵向显示 +Display Portrait Reversed = 纵向反转显示 Double tap button = 双击键 Down = 方向键:下 Dpad = 方向键 Frame Advance = 逐帧播放 -Hold = 短按电源键 +Hold = 锁键 Home = Home键 L = L Left = 方向键:左 Load State = 载入即时存档 Mute toggle = 静音 -Next Slot = 下个即时存档插槽 +Next Slot = 下个即时存档槽 None = 无 -Note = ♪键 +Note = 音效键♪ OpenChat = 打开聊天 -Pause = 暂停 +Pause = 暂停界面 R = R -RapidFire = 连射按钮 +RapidFire = 连射(需重合某个键 Record = 录制 -Remote hold = 长按电源键 -Rewind = 倒带 +Remote hold = 锁键(遥控器) +Rewind = 读取倒带 Right = 方向键:右 Right Analog Stick = 右摇杆 RightAn.Down = 右摇杆:下 @@ -693,23 +695,23 @@ Screen = 屏幕亮度键 Screenshot = 截图 Select = Select SpeedToggle = 加速(按一次) -Square = 方形 +Square = 方块键 Start = Start Swipe Down = 向下滑动 Swipe Left = 向左滑动 Swipe Right = 向右滑动 Swipe Up = 向上滑动 -tap to customize = 点击以自定义 +tap to customize = 点击自定义 Texture Dumping = 纹理转储 Texture Replacement = 纹理替换 Toggle Fullscreen = 切换全屏 Toggle mode = 切换模式 -Triangle = 三角 +Triangle = 三角键 Fast-forward = 加速(长按) Up = 方向键:上 -Vol + = 音量+ -Vol - = 音量- -Wlan = 无线网络 +Vol + = 音量+键 +Vol - = 音量-键 +Wlan = WLAN键 [MemStick] Already contains PSP data = 已含有PSP数据 @@ -751,19 +753,19 @@ Bottom Right = 右下方 Center Left = 左中间 Center Right = 右中间 Change Mac Address = 更改MAC地址 -Change proAdhocServer Address = 更改PRO Ad Hoc服务器IP地址(localhost=多个实例) -ChangeMacSaveConfirm = 生成新的MAC地址? -ChangeMacSaveWarning = 一些游戏会在载入存档数据时验证MAC地址,这可能会破坏旧的存档。 +Change proAdhocServer Address = 更改 PRO Ad Hoc 服务器IP地址 +ChangeMacSaveConfirm = 确认随机生成新的MAC地址? +ChangeMacSaveWarning = 一些游戏会在载入存档时会验证MAC地址,这可能会破坏原有的存档。 Chat = 聊天 Chat Button Position = 聊天按钮位置 Chat Here = 在这里聊天 Chat message = 聊天消息 -Chat Screen Position = 聊天屏幕位置 +Chat Screen Position = 聊天窗口位置 Disconnected from AdhocServer = 与Adhoc服务器断开连接 -DNS Error Resolving = DNS错误解析 -Enable built-in PRO Adhoc Server = 启用内置PRO Ad Hoc服务器 +DNS Error Resolving = DNS解析错误 +Enable built-in PRO Adhoc Server = 启用内置 PRO Ad Hoc 服务器 Enable network chat = 启用聊天 -Enable networking = 启用联网/无线网络 (测试) +Enable networking = 启用联网/无线网络 Enable UPnP = 启用UPnP(需要几秒钟来检测) EnableQuickChat = 启用快速聊天 Enter a new PSP nickname = 输入新的PSP昵称 @@ -781,14 +783,14 @@ GM: Data from Unknown Port = GM:来自未知端口的数据 Hostname = 主机名 Invalid IP or hostname = IP或主机名是无效的 Minimum Timeout = 最小超时(以毫秒为单位,0=默认值) -Misc = 其他(默认=PSP兼容性) +Misc = 其他(默认=兼容PSP) Network Initialized = 网络已初始化 None = 无 Please change your Port Offset = 请更改您的端口偏移 Port offset = 端口偏移(0 = 兼容PSP) -Open PPSSPP Multiplayer Wiki Page = 打开PPSSPP多人联机百科页面 +Open PPSSPP Multiplayer Wiki Page = PPSSPP多人联机Wiki页面 MultiplayerHowToURL = https://github.com/hrydgard/ppsspp/wiki/如何使用PPSSPP多人联机游戏 -proAdhocServer Address: = Ad Hoc服务器地址: +proAdhocServer Address: = 服务器地址(localhost=模拟器双开联机) Quick Chat 1 = 快速聊天1 Quick Chat 2 = 快速聊天2 Quick Chat 3 = 快速聊天3 @@ -796,7 +798,7 @@ Quick Chat 4 = 快速聊天4 Quick Chat 5 = 快速聊天5 QuickChat = 快速聊天 Send = 发送 -Send Discord Presence information = 发送Discord"在线状态"信息 +Send Discord Presence information = 发送 Discord 在线状态 Top Center = 正上方 Top Left = 左上方 Top Right = 右上方 @@ -805,8 +807,8 @@ UPnP (port-forwarding) = UPnP(端口转发) UPnP need to be reinitialized = UPnP 需要重新初始化 UPnP use original port = UPnP 使用原始端口(启用=兼容PSP) Validating address... = 正在验证地址... -WLAN Channel = WLAN信道 -You're in Offline Mode, go to lobby or online hall = 您现在是离线模式, 请进入房间或在线大厅 +WLAN Channel = WLAN 信道 +You're in Offline Mode, go to lobby or online hall = 您现在处于离线模式, 请进入房间或在线大厅 [Pause] Cheats = 金手指 @@ -824,7 +826,7 @@ Undo last load = 撤销加载 Undo last save = 撤销保存 [PostShaders] -(duplicated setting, previous slider will be used) = (设置重复, 将使用上面滑块的值) +(duplicated setting, previous slider will be used) = (重复, 将使用上面的设置值) 4xHqGLSL = 4xHQ 像素风缩放 5xBR = 5xBR 像素风缩放 5xBR-lv2 = 5xBR-lv2 像素风缩放 @@ -843,7 +845,7 @@ FXAA = FXAA(快速近似抗锯齿) Gamma = 伽马值 GreenLevel = 绿色等级 Intensity = 强度 -LCDPersistence = LCD拖影 +LCDPersistence =液晶屏拖影 Natural = 自然色 NaturalA = 自然色(无模糊) Off = 关闭 @@ -860,14 +862,14 @@ TexMMPX = MMPX UpscaleSpline36 = Spline36缩放 VideoSmoothingAA = 视频平滑抗锯齿 Vignette = 光晕 -MitchellNetravali = Mitchell-Netravali双三插值缩放 -CatmullRom = Catmull-Rom双三插值缩放 +MitchellNetravali = Mitchell-Netravali 双三插值缩放 +CatmullRom = Catmull-Rom 双三插值缩放 [PSPCredits] all the forum mods = 论坛上所有的mod build server = 编译服务器 Buy Gold = 购买黄金版 -check = 同时请查阅海豚模拟器, 最好用的Wii/GC模拟器 +check = 同时请查阅海豚模拟器, 最好用的Wii/NGC模拟器 CheckOutPPSSPP = 查阅PPSSPP, 一款超级棒的PSP 模拟器:https://www.ppsspp.org/ contributors = 参与者: created = 作者: @@ -924,46 +926,46 @@ Stop Sharing = 停止共享 Stopping.. = 正在停止... [Reporting] -Bad = 很差 -FeedbackCRCCalculating = 光盘CRC: 计算中... -FeedbackCRCValue = 光盘CRC: %1 +Bad = 太差了 +FeedbackCRCCalculating = 镜像CRC: 计算中... +FeedbackCRCValue = 镜像CRC: %1 FeedbackDelayInfo = 您的数据正在后台提交。 -FeedbackDesc = 模拟兼容性怎样?请告诉我们和社区! -FeedbackDisabled = 必须启用"向服务器报告兼容性问题"选项 -FeedbackIncludeCRC = 注意:将使用部分电量发送CRC校验 +FeedbackDesc = 这款游戏兼容性怎样?请告诉我们和社区! +FeedbackDisabled = 需要启用"向服务器报告兼容性问题"选项 +FeedbackIncludeCRC = 注意:将使用少部分电量发送CRC校验码 FeedbackIncludeScreen = 包含一张截图 FeedbackSubmitDone = 您的数据已提交。 FeedbackSubmitFail = 无法向服务器提交数据。尝试更新PPSSPP。 FeedbackThanks = 感谢您的反馈! -Gameplay = 游戏过程 -Graphics = 图像 -Great = 很好 -In-game = 在游戏中 -In-game Description = 可以进入游戏, 但是bug太多无法完成游戏 -Menu/Intro = 菜单/开头 -Menu/Intro Description = 无法进入游戏 -Nothing = 没画面 -Nothing Description = 彻底损坏 -OK = 好 -Open Browser = 打开报告网站 -Overall = 总体 -Perfect = 完美 -Perfect Description = 完美模拟整个游戏-太棒了! -Plays = 可玩 -Plays Description = 基本模拟整个游戏, 但有时会出现故障 +Gameplay = 游戏过程正常 +Graphics = 画面无错误 +Great = 非常好 +In-game = 能进游戏 +In-game Description = 游戏是能够运行,但BUG太多,不能开心通关 +Menu/Intro = 卡主界面 +Menu/Intro Description = 就看到个菜单,然后没了 +Nothing = 啥都没有 +Nothing Description = 直接黑屏或者崩溃 +OK = 还行 +Open Browser = 打开反馈网站 +Overall = 总体概括 +Perfect = 非常完美 +Perfect Description = 游戏全程完美模拟——太赞了! +Plays = 可以玩 +Plays Description =游戏大部分都可玩,偶尔有一些小错误,但不影响 ReportButton = 报告反馈 -Show disc CRC = 显示光盘CRC -Speed = 速度 +Show disc CRC = 查看镜像CRC +Speed = 运行速度快 Submit Feedback = 提交反馈 SuggestionConfig = 请参阅网站上的报告以了解最佳设置。 -SuggestionCPUSpeed0 = 请禁用锁定CPU速度设置。 +SuggestionCPUSpeed0 = 请禁用修改CPU速度设置。 SuggestionDowngrade = 请降级到较旧的PPSSPP版本 (请报告这个错误)。 SuggestionsFound = 其他用户报告了更佳的结果。点击"查看所有反馈"了解更多详情。 SuggestionsNone = 其他用户也不能运行该游戏。 SuggestionsWaiting = 提交中, 并检查其他用户的反馈... SuggestionUpgrade = 请更新到较新版本的PPSSPP SuggestionVerifyDisc = 请检查您的ISO是否为光盘的正确拷贝。 -Unselected Overall Description = 这款游戏模拟的怎样? +Unselected Overall Description = 这款游戏各方面表现怎样? View Feedback = 查看所有反馈 [Savedata] @@ -971,11 +973,11 @@ Date = 日期 Filename = 文件名 No screenshot = 没有截图 None yet. Things will appear here after you save. = 暂无。在你保存后将会在此出现存档。 -Nothing matching '%1' was found. = 没有找到符合'%1'的结果 +Nothing matching '%1' was found. = 没有找到关于"%1"的结果 Save Data = 保存的存档 Save States = 保存的即时存档 Savedata Manager = 存档数据管理器 -Showing matches for '%1'. = 找到符合'%1'的搜索结果。 +Showing matches for '%1'. = 找到符合"%1"的搜索结果。 Size = 大小 [Screen] @@ -983,7 +985,7 @@ Cardboard VR OFF = Cardboard VR关闭 Chainfire3DWarning = 警告:检测到Chainfire3D(3D 神器), 可能会导致问题。 Failed to load state = 无法载入即时存档 Failed to save state = 无法保存即时存档 -fixed = 速度:自定义 +fixed = 速度:备选 GLToolsWarning = 警告:检测到GLTools,可能会导致问题。 In menu = 在菜单中 Load savestate failed = 无法载入即时存档 @@ -1002,7 +1004,7 @@ Save State Failed = 无法保存即时存档 Saved State = 已保存即时存档 saveNewTextures_false = 纹理转储已停止。 saveNewTextures_true = 开始转储新纹理。 -SpeedCustom2 = 速度:自定义2 +SpeedCustom2 = 速度:备选2 standard = 速度:标准 State load undone = 撤销即时存档载入 Untitled PSP game = 无标题的PSP游戏 @@ -1033,8 +1035,8 @@ Build Configuration = 编译配置 Built by = 编译者 Core Context = 核心上下文 Cores = 核心数 -CPU Extensions = CPU扩展 -CPU Information = CPU信息 +CPU Extensions = CPU 扩展 +CPU Information = CPU 信息 CPU Name = CPU 名称 D3DCompiler Version = D3DCompiler版本 Debug = 调试 @@ -1077,10 +1079,10 @@ UI Resolution = UI 分辨率 Vendor = 型号 Vendor (detected) = 型号(检测到的) Version Information = 版本信息 -Vulkan Extensions = Vulkan扩展 -Vulkan Features = Vulkan特性 +Vulkan Extensions = Vulkan 扩展 +Vulkan Features = Vulkan 特性 Driver bugs = 驱动错误 -No GPU driver bugs detected = 未检测到GPU驱动错误 +No GPU driver bugs detected = 未发现GPU驱动错误 [System] (broken) = (损坏) @@ -1091,55 +1093,55 @@ Auto Load Savestate = 自动载入即时存档 AVI Dump started. = AVI转储开始 AVI Dump stopped. = AVI转储停止 Cache ISO in RAM = 在内存中缓存完整ISO -Change CPU Clock = 修改模拟的PSP的CPU频率(不稳定) +Change CPU Clock = 修改PSP的CPU频率(不稳定) Color Tint = 颜色色调 -Color Saturation = 颜色饱和度 +Color Saturation = 饱和度 Error: load undo state is from a different game = 错误:撤回的即时存档是来自不同游戏的 Failed to load state for load undo. Error in the file system. = 无法撤回加载即时存档。文件系统有错误。 -Floating symbols = 飘浮的按键 +Floating symbols = 飘浮按键 Game crashed = 游戏发生崩溃。 Language = 语言设置 -Memory Stick folder = 记忆棒文件夹 -Memory Stick size = 记忆棒大小(GB) +Memory Stick folder = 记忆棒目录 +Memory Stick size = 记忆棒大小 Change Nickname = 修改昵称 ChangingMemstickPath = 游戏存档、即时存档及其它数据不会复制到新路径。\n\n确定要修改记忆棒文件夹吗? ChangingMemstickPathInvalid = 目标路径不能用于保存记忆棒数据。 Cheats = 作弊设置 -Clear Recent = 清除"最近的游戏" -Clear Recent Games List = 清除"最近的游戏"列表 -Clear UI background = 清除界面背景 +Clear Recent = 清除最近的游戏 +Clear Recent Games List = 清除"最近的游戏"内容 +Clear UI background = 清除壁纸 Confirmation Button = 确认按钮 Date Format = 日期格式 Day Light Saving = 夏令时 DDMMYYYY = 日/月/年 Decrease size = 减小尺寸 Developer Tools = 开发者工具 -Display Extra Info = 显示附加信息 -Display Games on a grid = 以方格显示"游戏" -Display Homebrew on a grid = 以方格显示"自制与试玩" -Display Recent on a grid = 以方格显示"最近的游戏" +Display Extra Info = 显示额外信息 +Display Games on a grid = "游戏"用图标显示 +Display Homebrew on a grid = "自制与试玩"用图标显示 +Display Recent on a grid = "最近的游戏"用图标显示 Dynarec (JIT) = 动态重编译(JIT) Emulation = 模拟设置 Enable Cheats = 开启金手指 Enable Compatibility Server Reports = 向服务器报告兼容性问题 Failed to load state. Error in the file system. = 无法载入即时存档。文件系统出错。 Failed to save state. Error in the file system. = 无法保存即时存档。文件系统出错。 -Fast (lag on slow storage) = 快速(在低速存储会有延迟) +Fast (lag on slow storage) = 快速模式(存储低速时有延迟) Fast Memory = 快速内存(不稳定) -Force real clock sync (slower, less lag) = 强制同步实际时钟频率(慢,但是更少延迟) +Force real clock sync (slower, less lag) = 强制同步实际时钟(降低延迟,很慢) frames, 0:off = 每几帧, 0=关 Games list settings = 游戏列表设置 General = 常规设置 -Grid icon size = 按倍率的图标尺寸 +Grid icon size = 图标方格尺寸 Help the PPSSPP team = 帮助PPSSPP团队 -Host (bugs, less lag) = 主机(较少延迟,有错误) -Ignore bad memory accesses = 忽略错误的内存访问 +Host (bugs, less lag) = 主机模式(有错误,较少延迟) +Ignore bad memory accesses = 忽略错误内存访问 Increase size = 增大尺寸 Interpreter = 解释器 IO timing method = I/O计时方法 IR Interpreter = IR解释器 Memory Stick Folder = 记忆棒文件夹 -Memory Stick inserted = 记忆棒已插入 +Memory Stick inserted = 插入记忆棒 MHz, 0:default = MHz, 默认为0 MMDDYYYY = 月/日/年 Moving background = 动态壁纸 @@ -1149,7 +1151,7 @@ Not a PSP game = 这不是一个PSP游戏 Off = 关闭 Oldest Save = 最旧的即时存档 Path does not exist! = 路径不存在! -PSP Memory Stick = PSP记忆棒 +PSP Memory Stick = PSP储存 PSP Model = PSP机型 PSP Settings = PSP设置 PSP-1000 = PSP-1000 @@ -1160,15 +1162,15 @@ Record Display = 录制视频 Reset Recording on Save/Load State = 保存/载入存档时重置录制 Restore Default Settings = 恢复默认PPSSPP设置 Rewind Snapshot Frequency = 倒带存档频率 -Save path in installed.txt = 存档路径在installed.txt -Save path in My Documents = 存档路径在我的文档 +Save path in installed.txt = 记忆棒目录使用"installed.txt" +Save path in My Documents = 记忆棒目录使用"我的文档" Savestate Slot = 即时存档插槽 -Savestate slot backups = 即时存档插槽备份 +Savestate slot backups = 即时存档备份 Screenshots as PNG = 将截图保存为 PNG 格式 Set Memory Stick folder = 设置记忆棒文件夹 -Set UI background... = 设置界面背景... -Show ID = 显示游戏ID -Show region flag = 显示游戏区域标识 +Set UI background... = 设置壁纸... +Show ID = 游戏ID +Show region flag = 地区标识 Simulate UMD delays = 模拟 UMD 延迟 Slot 1 = 插槽1 Slot 2 = 插槽2 @@ -1178,24 +1180,24 @@ Slot 5 = 插槽5 Storage full = 存储空间已满 Sustained performance mode = 持久性能模式(使长时间运行的应用运行更流畅) Time Format = 时间格式 -Transparent UI background = 透明用户界面背景 +Transparent UI background = 透明游戏背景 UI = 用户界面 -UI background animation = 用户界面背景动画 -UI Sound = 用户界面声音 +UI background animation = 背景动画 +UI Sound = 按键音效 undo %c = 备份 %c USB = USB -Use Lossless Video Codec (FFV1) = 使用无损视频编解码器(FFV1) -Use O to confirm = 使用按钮O确认 -Use output buffer (with overlay) for recording = 录制时使用输出缓冲(包括叠加信息) -Use system native keyboard = 使用系统本机键盘 -Use X to confirm = 使用按钮X确认 +Use Lossless Video Codec (FFV1) = 使用无损视频编码器(FFV1) +Use O to confirm = 使用按键O +Use output buffer (with overlay) for recording = 录制使用输出缓冲(包括叠加信息) +Use system native keyboard = 使用系统原生键盘 +Use X to confirm = 使用按键X VersionCheck = 检查PPSSPP新版本 WARNING: Android battery save mode is on = 警告:安卓省电模式已开启 WARNING: Battery save mode is on = 警告:省电模式已开启 Waves = 波浪动画 YYYYMMDD = 年/月/日 Theme = 主题 -Show Memory Stick folder = 显示记忆棒文件夹 +Show Memory Stick folder = 打开记忆棒文件夹 [TextureShaders] Off = 关闭 @@ -1212,7 +1214,7 @@ Default = 默认 %1 choice = %1选择 %1 heading = %1标题 %1 radio button = %1单选按键 -%1 text field = %1文本域 +%1 text field = %1文本框 Choices: = 选择: List: = 列表: Progress: %1% = 进度: %1% @@ -1225,22 +1227,22 @@ Download = 下载 New version of PPSSPP available = 有新版本PPSSPP可用 [Search] -Filtering settings by '%1' = 设置筛选'%1' -Find settings = 搜索设置 -Filter = 筛选 -Clear filter = 清除筛选结果 -No settings matched '%1' = 未找到设置'%1' +Filtering settings by '%1' = 查找"%1"的结果 +Find settings = 查找选项 +Filter = 搜索 +Clear filter = 取消筛选 +No settings matched '%1' = 没有找到选项"%1" [VR] -% of native FoV = % of 原生 FoV +% of native FoV = 原生视角的% 6DoF movement = 6自由度移动 Distance to 2D menus and scenes = 2D 菜单和场景的距离 -Field of view scale = 视野比例 -Force 72Hz update = 强制72赫兹更新 -Heads-up display scale = 平视显示比例 +Field of view scale = 视角比例 +Force 72Hz update = 强制72Hz刷新 +Heads-up display scale = HUD比例 Map controller movements to keys = 映射控制器移动到关键点 -Motion needed to generate action = 运动捕捉所需的行动 -Stereoscopic vision (Experimental) = 立体视觉(试验性) +Motion needed to generate action = 产生动作的感应值 +Stereoscopic vision (Experimental) = 立体视觉(实验性) Virtual reality = 虚拟现实 -VR camera = VR 摄像 +VR camera = VR 相机 VR controllers = VR 控制器 diff --git a/assets/lang/zh_TW.ini b/assets/lang/zh_TW.ini index 9695f762be..11d737ddf1 100644 --- a/assets/lang/zh_TW.ini +++ b/assets/lang/zh_TW.ini @@ -254,7 +254,7 @@ Random = 隨機 Replace textures = 取代紋理 Reset = 重設 Reset limited logging = 重設受限記錄 -RestoreDefaultSettings = 您確定要將所有設定還原為預設值嗎?\n控制對應設定將不會變更。\n\n您無法復原此動作。\n請重新啟動 PPSSPP 以使變更生效。 +RestoreDefaultSettings = 您確定要將所有設定還原為預設值嗎?\n\n您無法復原此動作。\n請重新啟動 PPSSPP 以使變更生效。 RestoreGameDefaultSettings = 您確定要將遊戲特定設定\n還原為 PPSSPP 預設值嗎? Resume = 恢復 Run CPU Tests = 執行 CPU 測試 @@ -522,6 +522,8 @@ Must Restart = 您必須重新啟動 PPSSPP 以使這項變更生效 Native device resolution = 原生裝置解析度 Nearest = 鄰近取樣 No buffer = 無緩衝 +Show Battery % = 顯示電池百分比 +Show Speed = 顯示速度 Skip Buffer Effects = 跳過緩衝區效果 None = 無 Number of Frames = 影格數 diff --git a/ext/CMakeLists.txt b/ext/CMakeLists.txt index ac16518a5a..8205fe4054 100644 --- a/ext/CMakeLists.txt +++ b/ext/CMakeLists.txt @@ -20,6 +20,12 @@ if(ANDROID) set(ENABLE_HLSL OFF CACHE BOOL "let's not build HLSL support we don't need" FORCE) endif() +# This works around a bug in cpu_features when ${CMAKE_BINARY_DIR} != ${CMAKE_CURRENT_BINRARY_DIR}. +# We also disable the list_cpu_features binary. +add_subdirectory(cmake/cpu_features) + +set(SKIP_GLSLANG_INSTALL ON CACHE BOOL "" FORCE) +set(ENABLE_GLSLANG_INSTALL OFF) add_subdirectory(glslang EXCLUDE_FROM_ALL) add_subdirectory(snappy) add_subdirectory(udis86) diff --git a/ext/cmake/cpu_features/CMakeLists.txt b/ext/cmake/cpu_features/CMakeLists.txt new file mode 100644 index 0000000000..31446d908a --- /dev/null +++ b/ext/cmake/cpu_features/CMakeLists.txt @@ -0,0 +1,191 @@ +cmake_minimum_required(VERSION 3.0) + +# option() honors normal variables. +# see: https://cmake.org/cmake/help/git-stage/policy/CMP0077.html +if(POLICY CMP0077) + cmake_policy(SET CMP0077 NEW) +endif() + +project(CpuFeatures VERSION 0.7.0 LANGUAGES C) + +set(CMAKE_C_STANDARD 99) + +# Default Build Type to be Release +if(NOT CMAKE_BUILD_TYPE) + set(CMAKE_BUILD_TYPE "Release" CACHE STRING + "Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel." + FORCE) +endif(NOT CMAKE_BUILD_TYPE) + +# BUILD_SHARED_LIBS is a standard CMake variable, but we declare it here to make +# it prominent in the GUI. +# cpu_features uses bit-fields which are - to some extends - implementation-defined (see https://en.cppreference.com/w/c/language/bit_field). +# As a consequence it is discouraged to use cpu_features as a shared library because different compilers may interpret the code in different ways. +# Prefer static linking from source whenever possible. +option(BUILD_SHARED_LIBS "Build library as shared." OFF) + +# Force PIC on unix when building shared libs +# see: https://en.wikipedia.org/wiki/Position-independent_code +if(BUILD_SHARED_LIBS AND UNIX) + option(CMAKE_POSITION_INDEPENDENT_CODE "Build with Position Independant Code." ON) +endif() + +include(CheckIncludeFile) +include(CheckSymbolExists) +include(GNUInstallDirs) + +macro(setup_include_and_definitions TARGET_NAME) + target_include_directories(${TARGET_NAME} + PUBLIC $ + PRIVATE $ + ) + target_compile_definitions(${TARGET_NAME} + PUBLIC STACK_LINE_READER_BUFFER_SIZE=1024 + ) +endmacro() + +set(PROCESSOR_IS_MIPS FALSE) +set(PROCESSOR_IS_ARM FALSE) +set(PROCESSOR_IS_AARCH64 FALSE) +set(PROCESSOR_IS_X86 FALSE) +set(PROCESSOR_IS_POWER FALSE) +set(PROCESSOR_IS_S390X FALSE) +set(PROCESSOR_IS_RISCV FALSE) + +if(CMAKE_SYSTEM_PROCESSOR MATCHES "^mips") + set(PROCESSOR_IS_MIPS TRUE) +elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(aarch64|arm64)") + set(PROCESSOR_IS_AARCH64 TRUE) +elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^arm") + set(PROCESSOR_IS_ARM TRUE) +elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "(x86_64)|(AMD64|amd64)|(^i.86$)") + set(PROCESSOR_IS_X86 TRUE) +elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(powerpc|ppc)") + set(PROCESSOR_IS_POWER TRUE) +elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(s390x)") + set(PROCESSOR_IS_S390X TRUE) +elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^riscv") + set(PROCESSOR_IS_RISCV TRUE) +endif() + +macro(add_cpu_features_headers_and_sources HDRS_LIST_NAME SRCS_LIST_NAME) + list(APPEND ${HDRS_LIST_NAME} ${PROJECT_SOURCE_DIR}/../../cpu_features/include/cpu_features_macros.h) + list(APPEND ${HDRS_LIST_NAME} ${PROJECT_SOURCE_DIR}/../../cpu_features/include/cpu_features_cache_info.h) + file(GLOB IMPL_SOURCES CONFIGURE_DEPENDS "${PROJECT_SOURCE_DIR}/../../cpu_features/src/impl_*.c") + list(APPEND ${SRCS_LIST_NAME} ${IMPL_SOURCES}) + if(PROCESSOR_IS_MIPS) + list(APPEND ${HDRS_LIST_NAME} ${PROJECT_SOURCE_DIR}/../../cpu_features/include/cpuinfo_mips.h) + elseif(PROCESSOR_IS_ARM) + list(APPEND ${HDRS_LIST_NAME} ${PROJECT_SOURCE_DIR}/../../cpu_features/include/cpuinfo_arm.h) + elseif(PROCESSOR_IS_AARCH64) + list(APPEND ${HDRS_LIST_NAME} ${PROJECT_SOURCE_DIR}/../../cpu_features/include/cpuinfo_aarch64.h) + elseif(PROCESSOR_IS_X86) + list(APPEND ${HDRS_LIST_NAME} ${PROJECT_SOURCE_DIR}/../../cpu_features/include/cpuinfo_x86.h) + list(APPEND ${SRCS_LIST_NAME} ${PROJECT_SOURCE_DIR}/../../cpu_features/include/internal/cpuid_x86.h) + list(APPEND ${SRCS_LIST_NAME} ${PROJECT_SOURCE_DIR}/../../cpu_features/include/internal/windows_utils.h) + elseif(PROCESSOR_IS_POWER) + list(APPEND ${HDRS_LIST_NAME} ${PROJECT_SOURCE_DIR}/../../cpu_features/include/cpuinfo_ppc.h) + elseif(PROCESSOR_IS_S390X) + list(APPEND ${HDRS_LIST_NAME} ${PROJECT_SOURCE_DIR}/../../cpu_features/include/cpuinfo_s390x.h) + elseif(PROCESSOR_IS_RISCV) + list(APPEND ${HDRS_LIST_NAME} ${PROJECT_SOURCE_DIR}/../../cpu_features/include/cpuinfo_riscv.h) + else() + message(FATAL_ERROR "Unsupported architectures ${CMAKE_SYSTEM_PROCESSOR}") + endif() +endmacro() + +# +# library : utils +# + +add_library(utils OBJECT + ${PROJECT_SOURCE_DIR}/../../cpu_features/include/internal/bit_utils.h + ${PROJECT_SOURCE_DIR}/../../cpu_features/include/internal/filesystem.h + ${PROJECT_SOURCE_DIR}/../../cpu_features/include/internal/stack_line_reader.h + ${PROJECT_SOURCE_DIR}/../../cpu_features/include/internal/string_view.h + ${PROJECT_SOURCE_DIR}/../../cpu_features/src/filesystem.c + ${PROJECT_SOURCE_DIR}/../../cpu_features/src/stack_line_reader.c + ${PROJECT_SOURCE_DIR}/../../cpu_features/src/string_view.c +) +setup_include_and_definitions(utils) + +# +# library : unix_based_hardware_detection +# + +if(UNIX) + add_library(unix_based_hardware_detection OBJECT + ${PROJECT_SOURCE_DIR}/../../cpu_features/include/internal/hwcaps.h + ${PROJECT_SOURCE_DIR}/../../cpu_features/src/hwcaps.c + ) + setup_include_and_definitions(unix_based_hardware_detection) + check_include_file(dlfcn.h HAVE_DLFCN_H) + if(HAVE_DLFCN_H) + target_compile_definitions(unix_based_hardware_detection PRIVATE HAVE_DLFCN_H) + endif() + check_symbol_exists(getauxval "sys/auxv.h" HAVE_STRONG_GETAUXVAL) + if(HAVE_STRONG_GETAUXVAL) + target_compile_definitions(unix_based_hardware_detection PRIVATE HAVE_STRONG_GETAUXVAL) + endif() +endif() + +# +# library : cpu_features +# +set (CPU_FEATURES_HDRS) +set (CPU_FEATURES_SRCS) +add_cpu_features_headers_and_sources(CPU_FEATURES_HDRS CPU_FEATURES_SRCS) +list(APPEND CPU_FEATURES_SRCS $) +if(NOT PROCESSOR_IS_X86 AND UNIX) + list(APPEND CPU_FEATURES_SRCS $) +endif() +add_library(cpu_features ${CPU_FEATURES_HDRS} ${CPU_FEATURES_SRCS}) +set_target_properties(cpu_features PROPERTIES PUBLIC_HEADER "${CPU_FEATURES_HDRS}") +setup_include_and_definitions(cpu_features) +target_link_libraries(cpu_features PUBLIC ${CMAKE_DL_LIBS}) +target_include_directories(cpu_features + PUBLIC $ +) +if(PROCESSOR_IS_X86) + if(APPLE) + target_compile_definitions(cpu_features PRIVATE HAVE_SYSCTLBYNAME) + endif() +endif() +add_library(CpuFeature::cpu_features ALIAS cpu_features) + +# +# Install cpu_features and list_cpu_features +# + +include(GNUInstallDirs) +install(TARGETS cpu_features + EXPORT CpuFeaturesTargets + PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/cpu_features + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + BUNDLE DESTINATION ${CMAKE_INSTALL_BINDIR} +) +install(EXPORT CpuFeaturesTargets + NAMESPACE CpuFeatures:: + DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/CpuFeatures + COMPONENT Devel +) +include(CMakePackageConfigHelpers) +configure_package_config_file(../../cpu_features/cmake/CpuFeaturesConfig.cmake.in + "${PROJECT_BINARY_DIR}/CpuFeaturesConfig.cmake" + INSTALL_DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/CpuFeatures" + NO_SET_AND_CHECK_MACRO + NO_CHECK_REQUIRED_COMPONENTS_MACRO +) +write_basic_package_version_file( + "${PROJECT_BINARY_DIR}/CpuFeaturesConfigVersion.cmake" + COMPATIBILITY SameMajorVersion +) +install( + FILES + "${PROJECT_BINARY_DIR}/CpuFeaturesConfig.cmake" + "${PROJECT_BINARY_DIR}/CpuFeaturesConfigVersion.cmake" + DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/CpuFeatures" + COMPONENT Devel +) diff --git a/ext/cpu_features b/ext/cpu_features new file mode 160000 index 0000000000..c74a85d64a --- /dev/null +++ b/ext/cpu_features @@ -0,0 +1 @@ +Subproject commit c74a85d64a64594fab865c8fd86865be8ac2bf87 diff --git a/ext/cpu_features.vcxproj b/ext/cpu_features.vcxproj new file mode 100644 index 0000000000..0588cb55a9 --- /dev/null +++ b/ext/cpu_features.vcxproj @@ -0,0 +1,364 @@ + + + + + Debug + ARM + + + Debug + ARM64 + + + Debug + Win32 + + + Release + ARM + + + Release + ARM64 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + 15.0 + {C249F016-7F82-45CF-BB6E-0642A988C4D3} + cpufeatures + 10.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + StaticLibrary + true + $(DefaultPlatformToolset) + Unicode + + + StaticLibrary + false + $(DefaultPlatformToolset) + true + Unicode + + + StaticLibrary + true + $(DefaultPlatformToolset) + Unicode + + + StaticLibrary + true + $(DefaultPlatformToolset) + Unicode + + + StaticLibrary + true + $(DefaultPlatformToolset) + Unicode + + + StaticLibrary + false + $(DefaultPlatformToolset) + true + Unicode + + + StaticLibrary + false + $(DefaultPlatformToolset) + true + Unicode + + + StaticLibrary + false + $(DefaultPlatformToolset) + true + Unicode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $(Platform)\cpu_features$(Configuration)\ + $(SolutionDir)$(Platform)\cpu_features$(Configuration)\ + + + $(Platform)\cpu_features$(Configuration)\ + $(SolutionDir)$(Platform)\cpu_features$(Configuration)\ + + + $(Platform)\cpu_features$(Configuration)\ + $(SolutionDir)$(Platform)\cpu_features$(Configuration)\ + + + $(Platform)\cpu_features$(Configuration)\ + $(SolutionDir)$(Platform)\cpu_features$(Configuration)\ + + + $(Platform)\cpu_features$(Configuration)\ + $(SolutionDir)$(Platform)\cpu_features$(Configuration)\ + + + $(Platform)\cpu_features$(Configuration)\ + $(SolutionDir)$(Platform)\cpu_features$(Configuration)\ + + + $(Platform)\cpu_features$(Configuration)\ + $(SolutionDir)$(Platform)\cpu_features$(Configuration)\ + + + $(Platform)\cpu_features$(Configuration)\ + $(SolutionDir)$(Platform)\cpu_features$(Configuration)\ + + + + Level3 + MaxSpeed + true + true + MultiThreaded + true + stdcpp17 + cpu_features/include + STACK_LINE_READER_BUFFER_SIZE=1024;%(PreprocessorDefinitions) + + + Windows + true + true + + + + + Level3 + MaxSpeed + true + true + MultiThreaded + true + stdcpp17 + cpu_features/include + STACK_LINE_READER_BUFFER_SIZE=1024;%(PreprocessorDefinitions) + + + Windows + true + true + + + + + Level3 + MaxSpeed + true + true + MultiThreaded + true + stdcpp17 + cpu_features/include + STACK_LINE_READER_BUFFER_SIZE=1024;%(PreprocessorDefinitions) + + + Windows + true + true + + + + + Level3 + Disabled + MultiThreadedDebug + true + stdcpp17 + cpu_features/include + STACK_LINE_READER_BUFFER_SIZE=1024;%(PreprocessorDefinitions) + + + Windows + + + + + Level3 + Disabled + MultiThreadedDebug + true + stdcpp17 + cpu_features/include + STACK_LINE_READER_BUFFER_SIZE=1024;%(PreprocessorDefinitions) + + + Windows + + + + + Level3 + Disabled + MultiThreadedDebug + true + stdcpp17 + cpu_features/include + STACK_LINE_READER_BUFFER_SIZE=1024;%(PreprocessorDefinitions) + + + Windows + + + + + Level3 + Disabled + MultiThreadedDebug + true + stdcpp17 + cpu_features/include + STACK_LINE_READER_BUFFER_SIZE=1024;%(PreprocessorDefinitions) + + + Windows + + + + + Level3 + MaxSpeed + true + true + MultiThreaded + true + stdcpp17 + cpu_features/include + STACK_LINE_READER_BUFFER_SIZE=1024;%(PreprocessorDefinitions) + + + Windows + true + true + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ext/cpu_features.vcxproj.filters b/ext/cpu_features.vcxproj.filters new file mode 100644 index 0000000000..b3ea5f4452 --- /dev/null +++ b/ext/cpu_features.vcxproj.filters @@ -0,0 +1,130 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;hm;inl;inc;ipp;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + {530543f7-fdda-43c7-8982-427e4d69e74d} + + + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files\internal + + + Header Files\internal + + + Header Files\internal + + + Header Files\internal + + + Header Files\internal + + + Header Files\internal + + + + + Resource Files + + + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + \ No newline at end of file diff --git a/ext/vulkan/vk_enum_string_helper.h b/ext/vulkan/vk_enum_string_helper.h index 2df2d9e4d7..ff6ab7ecae 100644 --- a/ext/vulkan/vk_enum_string_helper.h +++ b/ext/vulkan/vk_enum_string_helper.h @@ -4,10 +4,10 @@ /*************************************************************************** * - * Copyright (c) 2015-2022 The Khronos Group Inc. - * Copyright (c) 2015-2022 Valve Corporation - * Copyright (c) 2015-2022 LunarG, Inc. - * Copyright (c) 2015-2022 Google Inc. + * Copyright (c) 2015-2023 The Khronos Group Inc. + * Copyright (c) 2015-2023 Valve Corporation + * Copyright (c) 2015-2023 LunarG, Inc. + * Copyright (c) 2015-2023 Google Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -60,10 +60,8 @@ static inline const char* string_VkResult(VkResult input_value) return "VK_ERROR_FRAGMENTED_POOL"; case VK_ERROR_FULL_SCREEN_EXCLUSIVE_MODE_LOST_EXT: return "VK_ERROR_FULL_SCREEN_EXCLUSIVE_MODE_LOST_EXT"; -#ifdef VK_ENABLE_BETA_EXTENSIONS case VK_ERROR_IMAGE_USAGE_NOT_SUPPORTED_KHR: return "VK_ERROR_IMAGE_USAGE_NOT_SUPPORTED_KHR"; -#endif // VK_ENABLE_BETA_EXTENSIONS case VK_ERROR_INCOMPATIBLE_DISPLAY_KHR: return "VK_ERROR_INCOMPATIBLE_DISPLAY_KHR"; case VK_ERROR_INCOMPATIBLE_DRIVER: @@ -102,26 +100,16 @@ static inline const char* string_VkResult(VkResult input_value) return "VK_ERROR_UNKNOWN"; case VK_ERROR_VALIDATION_FAILED_EXT: return "VK_ERROR_VALIDATION_FAILED_EXT"; -#ifdef VK_ENABLE_BETA_EXTENSIONS case VK_ERROR_VIDEO_PICTURE_LAYOUT_NOT_SUPPORTED_KHR: return "VK_ERROR_VIDEO_PICTURE_LAYOUT_NOT_SUPPORTED_KHR"; -#endif // VK_ENABLE_BETA_EXTENSIONS -#ifdef VK_ENABLE_BETA_EXTENSIONS case VK_ERROR_VIDEO_PROFILE_CODEC_NOT_SUPPORTED_KHR: return "VK_ERROR_VIDEO_PROFILE_CODEC_NOT_SUPPORTED_KHR"; -#endif // VK_ENABLE_BETA_EXTENSIONS -#ifdef VK_ENABLE_BETA_EXTENSIONS case VK_ERROR_VIDEO_PROFILE_FORMAT_NOT_SUPPORTED_KHR: return "VK_ERROR_VIDEO_PROFILE_FORMAT_NOT_SUPPORTED_KHR"; -#endif // VK_ENABLE_BETA_EXTENSIONS -#ifdef VK_ENABLE_BETA_EXTENSIONS case VK_ERROR_VIDEO_PROFILE_OPERATION_NOT_SUPPORTED_KHR: return "VK_ERROR_VIDEO_PROFILE_OPERATION_NOT_SUPPORTED_KHR"; -#endif // VK_ENABLE_BETA_EXTENSIONS -#ifdef VK_ENABLE_BETA_EXTENSIONS case VK_ERROR_VIDEO_STD_VERSION_NOT_SUPPORTED_KHR: return "VK_ERROR_VIDEO_STD_VERSION_NOT_SUPPORTED_KHR"; -#endif // VK_ENABLE_BETA_EXTENSIONS case VK_EVENT_RESET: return "VK_EVENT_RESET"; case VK_EVENT_SET: @@ -231,10 +219,8 @@ static inline const char* string_VkStructureType(VkStructureType input_value) return "VK_STRUCTURE_TYPE_BIND_IMAGE_PLANE_MEMORY_INFO"; case VK_STRUCTURE_TYPE_BIND_SPARSE_INFO: return "VK_STRUCTURE_TYPE_BIND_SPARSE_INFO"; -#ifdef VK_ENABLE_BETA_EXTENSIONS case VK_STRUCTURE_TYPE_BIND_VIDEO_SESSION_MEMORY_INFO_KHR: return "VK_STRUCTURE_TYPE_BIND_VIDEO_SESSION_MEMORY_INFO_KHR"; -#endif // VK_ENABLE_BETA_EXTENSIONS case VK_STRUCTURE_TYPE_BLIT_IMAGE_INFO_2: return "VK_STRUCTURE_TYPE_BLIT_IMAGE_INFO_2"; case VK_STRUCTURE_TYPE_BUFFER_CAPTURE_DESCRIPTOR_DATA_INFO_EXT: @@ -783,6 +769,10 @@ static inline const char* string_VkStructureType(VkStructureType input_value) return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES"; case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES_EXT: return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES_EXT"; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CLUSTER_CULLING_SHADER_FEATURES_HUAWEI: + return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CLUSTER_CULLING_SHADER_FEATURES_HUAWEI"; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CLUSTER_CULLING_SHADER_PROPERTIES_HUAWEI: + return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CLUSTER_CULLING_SHADER_PROPERTIES_HUAWEI"; case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COHERENT_MEMORY_FEATURES_AMD: return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COHERENT_MEMORY_FEATURES_AMD"; case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COLOR_WRITE_ENABLE_FEATURES_EXT: @@ -1163,6 +1153,8 @@ static inline const char* string_VkStructureType(VkStructureType input_value) return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBPASS_SHADING_PROPERTIES_HUAWEI"; case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SURFACE_INFO_2_KHR: return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SURFACE_INFO_2_KHR"; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SWAPCHAIN_MAINTENANCE_1_FEATURES_EXT: + return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SWAPCHAIN_MAINTENANCE_1_FEATURES_EXT"; case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SYNCHRONIZATION_2_FEATURES: return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SYNCHRONIZATION_2_FEATURES"; case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_FEATURES_EXT: @@ -1193,10 +1185,8 @@ static inline const char* string_VkStructureType(VkStructureType input_value) return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_PROPERTIES_EXT"; case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_INPUT_DYNAMIC_STATE_FEATURES_EXT: return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_INPUT_DYNAMIC_STATE_FEATURES_EXT"; -#ifdef VK_ENABLE_BETA_EXTENSIONS case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VIDEO_FORMAT_INFO_KHR: return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VIDEO_FORMAT_INFO_KHR"; -#endif // VK_ENABLE_BETA_EXTENSIONS case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES: return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES"; case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES: @@ -1345,14 +1335,10 @@ static inline const char* string_VkStructureType(VkStructureType input_value) return "VK_STRUCTURE_TYPE_QUEUE_FAMILY_GLOBAL_PRIORITY_PROPERTIES_KHR"; case VK_STRUCTURE_TYPE_QUEUE_FAMILY_PROPERTIES_2: return "VK_STRUCTURE_TYPE_QUEUE_FAMILY_PROPERTIES_2"; -#ifdef VK_ENABLE_BETA_EXTENSIONS case VK_STRUCTURE_TYPE_QUEUE_FAMILY_QUERY_RESULT_STATUS_PROPERTIES_KHR: return "VK_STRUCTURE_TYPE_QUEUE_FAMILY_QUERY_RESULT_STATUS_PROPERTIES_KHR"; -#endif // VK_ENABLE_BETA_EXTENSIONS -#ifdef VK_ENABLE_BETA_EXTENSIONS case VK_STRUCTURE_TYPE_QUEUE_FAMILY_VIDEO_PROPERTIES_KHR: return "VK_STRUCTURE_TYPE_QUEUE_FAMILY_VIDEO_PROPERTIES_KHR"; -#endif // VK_ENABLE_BETA_EXTENSIONS case VK_STRUCTURE_TYPE_RAY_TRACING_PIPELINE_CREATE_INFO_KHR: return "VK_STRUCTURE_TYPE_RAY_TRACING_PIPELINE_CREATE_INFO_KHR"; case VK_STRUCTURE_TYPE_RAY_TRACING_PIPELINE_CREATE_INFO_NV: @@ -1363,6 +1349,8 @@ static inline const char* string_VkStructureType(VkStructureType input_value) return "VK_STRUCTURE_TYPE_RAY_TRACING_SHADER_GROUP_CREATE_INFO_KHR"; case VK_STRUCTURE_TYPE_RAY_TRACING_SHADER_GROUP_CREATE_INFO_NV: return "VK_STRUCTURE_TYPE_RAY_TRACING_SHADER_GROUP_CREATE_INFO_NV"; + case VK_STRUCTURE_TYPE_RELEASE_SWAPCHAIN_IMAGES_INFO_EXT: + return "VK_STRUCTURE_TYPE_RELEASE_SWAPCHAIN_IMAGES_INFO_EXT"; case VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_INFO: return "VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_INFO"; case VK_STRUCTURE_TYPE_RENDERING_FRAGMENT_DENSITY_MAP_ATTACHMENT_INFO_EXT: @@ -1483,6 +1471,12 @@ static inline const char* string_VkStructureType(VkStructureType input_value) return "VK_STRUCTURE_TYPE_SURFACE_FULL_SCREEN_EXCLUSIVE_INFO_EXT"; case VK_STRUCTURE_TYPE_SURFACE_FULL_SCREEN_EXCLUSIVE_WIN32_INFO_EXT: return "VK_STRUCTURE_TYPE_SURFACE_FULL_SCREEN_EXCLUSIVE_WIN32_INFO_EXT"; + case VK_STRUCTURE_TYPE_SURFACE_PRESENT_MODE_COMPATIBILITY_EXT: + return "VK_STRUCTURE_TYPE_SURFACE_PRESENT_MODE_COMPATIBILITY_EXT"; + case VK_STRUCTURE_TYPE_SURFACE_PRESENT_MODE_EXT: + return "VK_STRUCTURE_TYPE_SURFACE_PRESENT_MODE_EXT"; + case VK_STRUCTURE_TYPE_SURFACE_PRESENT_SCALING_CAPABILITIES_EXT: + return "VK_STRUCTURE_TYPE_SURFACE_PRESENT_SCALING_CAPABILITIES_EXT"; case VK_STRUCTURE_TYPE_SURFACE_PROTECTED_CAPABILITIES_KHR: return "VK_STRUCTURE_TYPE_SURFACE_PROTECTED_CAPABILITIES_KHR"; case VK_STRUCTURE_TYPE_SWAPCHAIN_COUNTER_CREATE_INFO_EXT: @@ -1493,6 +1487,14 @@ static inline const char* string_VkStructureType(VkStructureType input_value) return "VK_STRUCTURE_TYPE_SWAPCHAIN_DISPLAY_NATIVE_HDR_CREATE_INFO_AMD"; case VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_BARRIER_CREATE_INFO_NV: return "VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_BARRIER_CREATE_INFO_NV"; + case VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_FENCE_INFO_EXT: + return "VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_FENCE_INFO_EXT"; + case VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_MODES_CREATE_INFO_EXT: + return "VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_MODES_CREATE_INFO_EXT"; + case VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_MODE_INFO_EXT: + return "VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_MODE_INFO_EXT"; + case VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_SCALING_CREATE_INFO_EXT: + return "VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_SCALING_CREATE_INFO_EXT"; case VK_STRUCTURE_TYPE_SYSMEM_COLOR_SPACE_FUCHSIA: return "VK_STRUCTURE_TYPE_SYSMEM_COLOR_SPACE_FUCHSIA"; case VK_STRUCTURE_TYPE_TEXTURE_LOD_GATHER_FORMAT_PROPERTIES_AMD: @@ -1511,78 +1513,42 @@ static inline const char* string_VkStructureType(VkStructureType input_value) return "VK_STRUCTURE_TYPE_VERTEX_INPUT_ATTRIBUTE_DESCRIPTION_2_EXT"; case VK_STRUCTURE_TYPE_VERTEX_INPUT_BINDING_DESCRIPTION_2_EXT: return "VK_STRUCTURE_TYPE_VERTEX_INPUT_BINDING_DESCRIPTION_2_EXT"; -#ifdef VK_ENABLE_BETA_EXTENSIONS case VK_STRUCTURE_TYPE_VIDEO_BEGIN_CODING_INFO_KHR: return "VK_STRUCTURE_TYPE_VIDEO_BEGIN_CODING_INFO_KHR"; -#endif // VK_ENABLE_BETA_EXTENSIONS -#ifdef VK_ENABLE_BETA_EXTENSIONS case VK_STRUCTURE_TYPE_VIDEO_CAPABILITIES_KHR: return "VK_STRUCTURE_TYPE_VIDEO_CAPABILITIES_KHR"; -#endif // VK_ENABLE_BETA_EXTENSIONS -#ifdef VK_ENABLE_BETA_EXTENSIONS case VK_STRUCTURE_TYPE_VIDEO_CODING_CONTROL_INFO_KHR: return "VK_STRUCTURE_TYPE_VIDEO_CODING_CONTROL_INFO_KHR"; -#endif // VK_ENABLE_BETA_EXTENSIONS -#ifdef VK_ENABLE_BETA_EXTENSIONS case VK_STRUCTURE_TYPE_VIDEO_DECODE_CAPABILITIES_KHR: return "VK_STRUCTURE_TYPE_VIDEO_DECODE_CAPABILITIES_KHR"; -#endif // VK_ENABLE_BETA_EXTENSIONS -#ifdef VK_ENABLE_BETA_EXTENSIONS - case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_CAPABILITIES_EXT: - return "VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_CAPABILITIES_EXT"; -#endif // VK_ENABLE_BETA_EXTENSIONS -#ifdef VK_ENABLE_BETA_EXTENSIONS - case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_DPB_SLOT_INFO_EXT: - return "VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_DPB_SLOT_INFO_EXT"; -#endif // VK_ENABLE_BETA_EXTENSIONS -#ifdef VK_ENABLE_BETA_EXTENSIONS - case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_PICTURE_INFO_EXT: - return "VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_PICTURE_INFO_EXT"; -#endif // VK_ENABLE_BETA_EXTENSIONS -#ifdef VK_ENABLE_BETA_EXTENSIONS - case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_PROFILE_INFO_EXT: - return "VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_PROFILE_INFO_EXT"; -#endif // VK_ENABLE_BETA_EXTENSIONS -#ifdef VK_ENABLE_BETA_EXTENSIONS - case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_PARAMETERS_ADD_INFO_EXT: - return "VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_PARAMETERS_ADD_INFO_EXT"; -#endif // VK_ENABLE_BETA_EXTENSIONS -#ifdef VK_ENABLE_BETA_EXTENSIONS - case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_PARAMETERS_CREATE_INFO_EXT: - return "VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_PARAMETERS_CREATE_INFO_EXT"; -#endif // VK_ENABLE_BETA_EXTENSIONS -#ifdef VK_ENABLE_BETA_EXTENSIONS - case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_CAPABILITIES_EXT: - return "VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_CAPABILITIES_EXT"; -#endif // VK_ENABLE_BETA_EXTENSIONS -#ifdef VK_ENABLE_BETA_EXTENSIONS - case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_DPB_SLOT_INFO_EXT: - return "VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_DPB_SLOT_INFO_EXT"; -#endif // VK_ENABLE_BETA_EXTENSIONS -#ifdef VK_ENABLE_BETA_EXTENSIONS - case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_PICTURE_INFO_EXT: - return "VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_PICTURE_INFO_EXT"; -#endif // VK_ENABLE_BETA_EXTENSIONS -#ifdef VK_ENABLE_BETA_EXTENSIONS - case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_PROFILE_INFO_EXT: - return "VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_PROFILE_INFO_EXT"; -#endif // VK_ENABLE_BETA_EXTENSIONS -#ifdef VK_ENABLE_BETA_EXTENSIONS - case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_PARAMETERS_ADD_INFO_EXT: - return "VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_PARAMETERS_ADD_INFO_EXT"; -#endif // VK_ENABLE_BETA_EXTENSIONS -#ifdef VK_ENABLE_BETA_EXTENSIONS - case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_PARAMETERS_CREATE_INFO_EXT: - return "VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_PARAMETERS_CREATE_INFO_EXT"; -#endif // VK_ENABLE_BETA_EXTENSIONS -#ifdef VK_ENABLE_BETA_EXTENSIONS + case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_CAPABILITIES_KHR: + return "VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_CAPABILITIES_KHR"; + case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_DPB_SLOT_INFO_KHR: + return "VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_DPB_SLOT_INFO_KHR"; + case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_PICTURE_INFO_KHR: + return "VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_PICTURE_INFO_KHR"; + case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_PROFILE_INFO_KHR: + return "VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_PROFILE_INFO_KHR"; + case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_PARAMETERS_ADD_INFO_KHR: + return "VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_PARAMETERS_ADD_INFO_KHR"; + case VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_PARAMETERS_CREATE_INFO_KHR: + return "VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_PARAMETERS_CREATE_INFO_KHR"; + case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_CAPABILITIES_KHR: + return "VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_CAPABILITIES_KHR"; + case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_DPB_SLOT_INFO_KHR: + return "VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_DPB_SLOT_INFO_KHR"; + case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_PICTURE_INFO_KHR: + return "VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_PICTURE_INFO_KHR"; + case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_PROFILE_INFO_KHR: + return "VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_PROFILE_INFO_KHR"; + case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_PARAMETERS_ADD_INFO_KHR: + return "VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_PARAMETERS_ADD_INFO_KHR"; + case VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_PARAMETERS_CREATE_INFO_KHR: + return "VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_PARAMETERS_CREATE_INFO_KHR"; case VK_STRUCTURE_TYPE_VIDEO_DECODE_INFO_KHR: return "VK_STRUCTURE_TYPE_VIDEO_DECODE_INFO_KHR"; -#endif // VK_ENABLE_BETA_EXTENSIONS -#ifdef VK_ENABLE_BETA_EXTENSIONS case VK_STRUCTURE_TYPE_VIDEO_DECODE_USAGE_INFO_KHR: return "VK_STRUCTURE_TYPE_VIDEO_DECODE_USAGE_INFO_KHR"; -#endif // VK_ENABLE_BETA_EXTENSIONS #ifdef VK_ENABLE_BETA_EXTENSIONS case VK_STRUCTURE_TYPE_VIDEO_ENCODE_CAPABILITIES_KHR: return "VK_STRUCTURE_TYPE_VIDEO_ENCODE_CAPABILITIES_KHR"; @@ -1691,46 +1657,26 @@ static inline const char* string_VkStructureType(VkStructureType input_value) case VK_STRUCTURE_TYPE_VIDEO_ENCODE_USAGE_INFO_KHR: return "VK_STRUCTURE_TYPE_VIDEO_ENCODE_USAGE_INFO_KHR"; #endif // VK_ENABLE_BETA_EXTENSIONS -#ifdef VK_ENABLE_BETA_EXTENSIONS case VK_STRUCTURE_TYPE_VIDEO_END_CODING_INFO_KHR: return "VK_STRUCTURE_TYPE_VIDEO_END_CODING_INFO_KHR"; -#endif // VK_ENABLE_BETA_EXTENSIONS -#ifdef VK_ENABLE_BETA_EXTENSIONS case VK_STRUCTURE_TYPE_VIDEO_FORMAT_PROPERTIES_KHR: return "VK_STRUCTURE_TYPE_VIDEO_FORMAT_PROPERTIES_KHR"; -#endif // VK_ENABLE_BETA_EXTENSIONS -#ifdef VK_ENABLE_BETA_EXTENSIONS case VK_STRUCTURE_TYPE_VIDEO_PICTURE_RESOURCE_INFO_KHR: return "VK_STRUCTURE_TYPE_VIDEO_PICTURE_RESOURCE_INFO_KHR"; -#endif // VK_ENABLE_BETA_EXTENSIONS -#ifdef VK_ENABLE_BETA_EXTENSIONS case VK_STRUCTURE_TYPE_VIDEO_PROFILE_INFO_KHR: return "VK_STRUCTURE_TYPE_VIDEO_PROFILE_INFO_KHR"; -#endif // VK_ENABLE_BETA_EXTENSIONS -#ifdef VK_ENABLE_BETA_EXTENSIONS case VK_STRUCTURE_TYPE_VIDEO_PROFILE_LIST_INFO_KHR: return "VK_STRUCTURE_TYPE_VIDEO_PROFILE_LIST_INFO_KHR"; -#endif // VK_ENABLE_BETA_EXTENSIONS -#ifdef VK_ENABLE_BETA_EXTENSIONS case VK_STRUCTURE_TYPE_VIDEO_REFERENCE_SLOT_INFO_KHR: return "VK_STRUCTURE_TYPE_VIDEO_REFERENCE_SLOT_INFO_KHR"; -#endif // VK_ENABLE_BETA_EXTENSIONS -#ifdef VK_ENABLE_BETA_EXTENSIONS case VK_STRUCTURE_TYPE_VIDEO_SESSION_CREATE_INFO_KHR: return "VK_STRUCTURE_TYPE_VIDEO_SESSION_CREATE_INFO_KHR"; -#endif // VK_ENABLE_BETA_EXTENSIONS -#ifdef VK_ENABLE_BETA_EXTENSIONS case VK_STRUCTURE_TYPE_VIDEO_SESSION_MEMORY_REQUIREMENTS_KHR: return "VK_STRUCTURE_TYPE_VIDEO_SESSION_MEMORY_REQUIREMENTS_KHR"; -#endif // VK_ENABLE_BETA_EXTENSIONS -#ifdef VK_ENABLE_BETA_EXTENSIONS case VK_STRUCTURE_TYPE_VIDEO_SESSION_PARAMETERS_CREATE_INFO_KHR: return "VK_STRUCTURE_TYPE_VIDEO_SESSION_PARAMETERS_CREATE_INFO_KHR"; -#endif // VK_ENABLE_BETA_EXTENSIONS -#ifdef VK_ENABLE_BETA_EXTENSIONS case VK_STRUCTURE_TYPE_VIDEO_SESSION_PARAMETERS_UPDATE_INFO_KHR: return "VK_STRUCTURE_TYPE_VIDEO_SESSION_PARAMETERS_UPDATE_INFO_KHR"; -#endif // VK_ENABLE_BETA_EXTENSIONS case VK_STRUCTURE_TYPE_VI_SURFACE_CREATE_INFO_NN: return "VK_STRUCTURE_TYPE_VI_SURFACE_CREATE_INFO_NN"; case VK_STRUCTURE_TYPE_WAYLAND_SURFACE_CREATE_INFO_KHR: @@ -1900,18 +1846,12 @@ static inline const char* string_VkImageLayout(VkImageLayout input_value) return "VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL"; case VK_IMAGE_LAYOUT_UNDEFINED: return "VK_IMAGE_LAYOUT_UNDEFINED"; -#ifdef VK_ENABLE_BETA_EXTENSIONS case VK_IMAGE_LAYOUT_VIDEO_DECODE_DPB_KHR: return "VK_IMAGE_LAYOUT_VIDEO_DECODE_DPB_KHR"; -#endif // VK_ENABLE_BETA_EXTENSIONS -#ifdef VK_ENABLE_BETA_EXTENSIONS case VK_IMAGE_LAYOUT_VIDEO_DECODE_DST_KHR: return "VK_IMAGE_LAYOUT_VIDEO_DECODE_DST_KHR"; -#endif // VK_ENABLE_BETA_EXTENSIONS -#ifdef VK_ENABLE_BETA_EXTENSIONS case VK_IMAGE_LAYOUT_VIDEO_DECODE_SRC_KHR: return "VK_IMAGE_LAYOUT_VIDEO_DECODE_SRC_KHR"; -#endif // VK_ENABLE_BETA_EXTENSIONS #ifdef VK_ENABLE_BETA_EXTENSIONS case VK_IMAGE_LAYOUT_VIDEO_ENCODE_DPB_KHR: return "VK_IMAGE_LAYOUT_VIDEO_ENCODE_DPB_KHR"; @@ -2074,14 +2014,10 @@ static inline const char* string_VkObjectType(VkObjectType input_value) return "VK_OBJECT_TYPE_UNKNOWN"; case VK_OBJECT_TYPE_VALIDATION_CACHE_EXT: return "VK_OBJECT_TYPE_VALIDATION_CACHE_EXT"; -#ifdef VK_ENABLE_BETA_EXTENSIONS case VK_OBJECT_TYPE_VIDEO_SESSION_KHR: return "VK_OBJECT_TYPE_VIDEO_SESSION_KHR"; -#endif // VK_ENABLE_BETA_EXTENSIONS -#ifdef VK_ENABLE_BETA_EXTENSIONS case VK_OBJECT_TYPE_VIDEO_SESSION_PARAMETERS_KHR: return "VK_OBJECT_TYPE_VIDEO_SESSION_PARAMETERS_KHR"; -#endif // VK_ENABLE_BETA_EXTENSIONS default: return "Unhandled VkObjectType"; } @@ -2701,14 +2637,10 @@ static inline const char* string_VkFormatFeatureFlagBits(VkFormatFeatureFlagBits return "VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT"; case VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT: return "VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT"; -#ifdef VK_ENABLE_BETA_EXTENSIONS case VK_FORMAT_FEATURE_VIDEO_DECODE_DPB_BIT_KHR: return "VK_FORMAT_FEATURE_VIDEO_DECODE_DPB_BIT_KHR"; -#endif // VK_ENABLE_BETA_EXTENSIONS -#ifdef VK_ENABLE_BETA_EXTENSIONS case VK_FORMAT_FEATURE_VIDEO_DECODE_OUTPUT_BIT_KHR: return "VK_FORMAT_FEATURE_VIDEO_DECODE_OUTPUT_BIT_KHR"; -#endif // VK_ENABLE_BETA_EXTENSIONS #ifdef VK_ENABLE_BETA_EXTENSIONS case VK_FORMAT_FEATURE_VIDEO_ENCODE_DPB_BIT_KHR: return "VK_FORMAT_FEATURE_VIDEO_ENCODE_DPB_BIT_KHR"; @@ -2902,18 +2834,12 @@ static inline const char* string_VkImageUsageFlagBits(VkImageUsageFlagBits input return "VK_IMAGE_USAGE_TRANSFER_SRC_BIT"; case VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT: return "VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT"; -#ifdef VK_ENABLE_BETA_EXTENSIONS case VK_IMAGE_USAGE_VIDEO_DECODE_DPB_BIT_KHR: return "VK_IMAGE_USAGE_VIDEO_DECODE_DPB_BIT_KHR"; -#endif // VK_ENABLE_BETA_EXTENSIONS -#ifdef VK_ENABLE_BETA_EXTENSIONS case VK_IMAGE_USAGE_VIDEO_DECODE_DST_BIT_KHR: return "VK_IMAGE_USAGE_VIDEO_DECODE_DST_BIT_KHR"; -#endif // VK_ENABLE_BETA_EXTENSIONS -#ifdef VK_ENABLE_BETA_EXTENSIONS case VK_IMAGE_USAGE_VIDEO_DECODE_SRC_BIT_KHR: return "VK_IMAGE_USAGE_VIDEO_DECODE_SRC_BIT_KHR"; -#endif // VK_ENABLE_BETA_EXTENSIONS #ifdef VK_ENABLE_BETA_EXTENSIONS case VK_IMAGE_USAGE_VIDEO_ENCODE_DPB_BIT_KHR: return "VK_IMAGE_USAGE_VIDEO_ENCODE_DPB_BIT_KHR"; @@ -3081,10 +3007,8 @@ static inline const char* string_VkQueueFlagBits(VkQueueFlagBits input_value) return "VK_QUEUE_SPARSE_BINDING_BIT"; case VK_QUEUE_TRANSFER_BIT: return "VK_QUEUE_TRANSFER_BIT"; -#ifdef VK_ENABLE_BETA_EXTENSIONS case VK_QUEUE_VIDEO_DECODE_BIT_KHR: return "VK_QUEUE_VIDEO_DECODE_BIT_KHR"; -#endif // VK_ENABLE_BETA_EXTENSIONS #ifdef VK_ENABLE_BETA_EXTENSIONS case VK_QUEUE_VIDEO_ENCODE_BIT_KHR: return "VK_QUEUE_VIDEO_ENCODE_BIT_KHR"; @@ -3336,6 +3260,8 @@ static inline const char* string_VkQueryPipelineStatisticFlagBits(VkQueryPipelin return "VK_QUERY_PIPELINE_STATISTIC_CLIPPING_INVOCATIONS_BIT"; case VK_QUERY_PIPELINE_STATISTIC_CLIPPING_PRIMITIVES_BIT: return "VK_QUERY_PIPELINE_STATISTIC_CLIPPING_PRIMITIVES_BIT"; + case VK_QUERY_PIPELINE_STATISTIC_CLUSTER_CULLING_SHADER_INVOCATIONS_BIT_HUAWEI: + return "VK_QUERY_PIPELINE_STATISTIC_CLUSTER_CULLING_SHADER_INVOCATIONS_BIT_HUAWEI"; case VK_QUERY_PIPELINE_STATISTIC_COMPUTE_SHADER_INVOCATIONS_BIT: return "VK_QUERY_PIPELINE_STATISTIC_COMPUTE_SHADER_INVOCATIONS_BIT"; case VK_QUERY_PIPELINE_STATISTIC_FRAGMENT_SHADER_INVOCATIONS_BIT: @@ -3409,10 +3335,8 @@ static inline const char* string_VkQueryType(VkQueryType input_value) return "VK_QUERY_TYPE_PIPELINE_STATISTICS"; case VK_QUERY_TYPE_PRIMITIVES_GENERATED_EXT: return "VK_QUERY_TYPE_PRIMITIVES_GENERATED_EXT"; -#ifdef VK_ENABLE_BETA_EXTENSIONS case VK_QUERY_TYPE_RESULT_STATUS_ONLY_KHR: return "VK_QUERY_TYPE_RESULT_STATUS_ONLY_KHR"; -#endif // VK_ENABLE_BETA_EXTENSIONS case VK_QUERY_TYPE_TIMESTAMP: return "VK_QUERY_TYPE_TIMESTAMP"; case VK_QUERY_TYPE_TRANSFORM_FEEDBACK_STREAM_EXT: @@ -3438,10 +3362,8 @@ static inline const char* string_VkQueryResultFlagBits(VkQueryResultFlagBits inp return "VK_QUERY_RESULT_WAIT_BIT"; case VK_QUERY_RESULT_WITH_AVAILABILITY_BIT: return "VK_QUERY_RESULT_WITH_AVAILABILITY_BIT"; -#ifdef VK_ENABLE_BETA_EXTENSIONS case VK_QUERY_RESULT_WITH_STATUS_BIT_KHR: return "VK_QUERY_RESULT_WITH_STATUS_BIT_KHR"; -#endif // VK_ENABLE_BETA_EXTENSIONS default: return "Unhandled VkQueryResultFlagBits"; } @@ -3546,14 +3468,10 @@ static inline const char* string_VkBufferUsageFlagBits(VkBufferUsageFlagBits inp return "VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT"; case VK_BUFFER_USAGE_VERTEX_BUFFER_BIT: return "VK_BUFFER_USAGE_VERTEX_BUFFER_BIT"; -#ifdef VK_ENABLE_BETA_EXTENSIONS case VK_BUFFER_USAGE_VIDEO_DECODE_DST_BIT_KHR: return "VK_BUFFER_USAGE_VIDEO_DECODE_DST_BIT_KHR"; -#endif // VK_ENABLE_BETA_EXTENSIONS -#ifdef VK_ENABLE_BETA_EXTENSIONS case VK_BUFFER_USAGE_VIDEO_DECODE_SRC_BIT_KHR: return "VK_BUFFER_USAGE_VIDEO_DECODE_SRC_BIT_KHR"; -#endif // VK_ENABLE_BETA_EXTENSIONS #ifdef VK_ENABLE_BETA_EXTENSIONS case VK_BUFFER_USAGE_VIDEO_ENCODE_DST_BIT_KHR: return "VK_BUFFER_USAGE_VIDEO_ENCODE_DST_BIT_KHR"; @@ -4044,6 +3962,8 @@ static inline const char* string_VkShaderStageFlagBits(VkShaderStageFlagBits inp return "VK_SHADER_STAGE_CALLABLE_BIT_KHR"; case VK_SHADER_STAGE_CLOSEST_HIT_BIT_KHR: return "VK_SHADER_STAGE_CLOSEST_HIT_BIT_KHR"; + case VK_SHADER_STAGE_CLUSTER_CULLING_BIT_HUAWEI: + return "VK_SHADER_STAGE_CLUSTER_CULLING_BIT_HUAWEI"; case VK_SHADER_STAGE_COMPUTE_BIT: return "VK_SHADER_STAGE_COMPUTE_BIT"; case VK_SHADER_STAGE_FRAGMENT_BIT: @@ -5602,6 +5522,8 @@ static inline const char* string_VkDriverId(VkDriverId input_value) return "VK_DRIVER_ID_GGP_PROPRIETARY"; case VK_DRIVER_ID_GOOGLE_SWIFTSHADER: return "VK_DRIVER_ID_GOOGLE_SWIFTSHADER"; + case VK_DRIVER_ID_IMAGINATION_OPEN_SOURCE_MESA: + return "VK_DRIVER_ID_IMAGINATION_OPEN_SOURCE_MESA"; case VK_DRIVER_ID_IMAGINATION_PROPRIETARY: return "VK_DRIVER_ID_IMAGINATION_PROPRIETARY"; case VK_DRIVER_ID_INTEL_OPEN_SOURCE_MESA: @@ -5869,6 +5791,8 @@ static inline const char* string_VkPipelineStageFlagBits2(uint64_t input_value) return "VK_PIPELINE_STAGE_2_BOTTOM_OF_PIPE_BIT"; case VK_PIPELINE_STAGE_2_CLEAR_BIT: return "VK_PIPELINE_STAGE_2_CLEAR_BIT"; + case VK_PIPELINE_STAGE_2_CLUSTER_CULLING_SHADER_BIT_HUAWEI: + return "VK_PIPELINE_STAGE_2_CLUSTER_CULLING_SHADER_BIT_HUAWEI"; case VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BIT: return "VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BIT"; case VK_PIPELINE_STAGE_2_COMMAND_PREPROCESS_BIT_NV: @@ -5931,10 +5855,8 @@ static inline const char* string_VkPipelineStageFlagBits2(uint64_t input_value) return "VK_PIPELINE_STAGE_2_VERTEX_INPUT_BIT"; case VK_PIPELINE_STAGE_2_VERTEX_SHADER_BIT: return "VK_PIPELINE_STAGE_2_VERTEX_SHADER_BIT"; -#ifdef VK_ENABLE_BETA_EXTENSIONS case VK_PIPELINE_STAGE_2_VIDEO_DECODE_BIT_KHR: return "VK_PIPELINE_STAGE_2_VIDEO_DECODE_BIT_KHR"; -#endif // VK_ENABLE_BETA_EXTENSIONS #ifdef VK_ENABLE_BETA_EXTENSIONS case VK_PIPELINE_STAGE_2_VIDEO_ENCODE_BIT_KHR: return "VK_PIPELINE_STAGE_2_VIDEO_ENCODE_BIT_KHR"; @@ -6042,14 +5964,10 @@ static inline const char* string_VkAccessFlagBits2(uint64_t input_value) return "VK_ACCESS_2_UNIFORM_READ_BIT"; case VK_ACCESS_2_VERTEX_ATTRIBUTE_READ_BIT: return "VK_ACCESS_2_VERTEX_ATTRIBUTE_READ_BIT"; -#ifdef VK_ENABLE_BETA_EXTENSIONS case VK_ACCESS_2_VIDEO_DECODE_READ_BIT_KHR: return "VK_ACCESS_2_VIDEO_DECODE_READ_BIT_KHR"; -#endif // VK_ENABLE_BETA_EXTENSIONS -#ifdef VK_ENABLE_BETA_EXTENSIONS case VK_ACCESS_2_VIDEO_DECODE_WRITE_BIT_KHR: return "VK_ACCESS_2_VIDEO_DECODE_WRITE_BIT_KHR"; -#endif // VK_ENABLE_BETA_EXTENSIONS #ifdef VK_ENABLE_BETA_EXTENSIONS case VK_ACCESS_2_VIDEO_ENCODE_READ_BIT_KHR: return "VK_ACCESS_2_VIDEO_ENCODE_READ_BIT_KHR"; @@ -6215,14 +6133,10 @@ static inline const char* string_VkFormatFeatureFlagBits2(uint64_t input_value) return "VK_FORMAT_FEATURE_2_UNIFORM_TEXEL_BUFFER_BIT"; case VK_FORMAT_FEATURE_2_VERTEX_BUFFER_BIT: return "VK_FORMAT_FEATURE_2_VERTEX_BUFFER_BIT"; -#ifdef VK_ENABLE_BETA_EXTENSIONS case VK_FORMAT_FEATURE_2_VIDEO_DECODE_DPB_BIT_KHR: return "VK_FORMAT_FEATURE_2_VIDEO_DECODE_DPB_BIT_KHR"; -#endif // VK_ENABLE_BETA_EXTENSIONS -#ifdef VK_ENABLE_BETA_EXTENSIONS case VK_FORMAT_FEATURE_2_VIDEO_DECODE_OUTPUT_BIT_KHR: return "VK_FORMAT_FEATURE_2_VIDEO_DECODE_OUTPUT_BIT_KHR"; -#endif // VK_ENABLE_BETA_EXTENSIONS #ifdef VK_ENABLE_BETA_EXTENSIONS case VK_FORMAT_FEATURE_2_VIDEO_ENCODE_DPB_BIT_KHR: return "VK_FORMAT_FEATURE_2_VIDEO_ENCODE_DPB_BIT_KHR"; @@ -6398,6 +6312,8 @@ static inline const char* string_VkSwapchainCreateFlagBitsKHR(VkSwapchainCreateF { switch (input_value) { + case VK_SWAPCHAIN_CREATE_DEFERRED_MEMORY_ALLOCATION_BIT_EXT: + return "VK_SWAPCHAIN_CREATE_DEFERRED_MEMORY_ALLOCATION_BIT_EXT"; case VK_SWAPCHAIN_CREATE_MUTABLE_FORMAT_BIT_KHR: return "VK_SWAPCHAIN_CREATE_MUTABLE_FORMAT_BIT_KHR"; case VK_SWAPCHAIN_CREATE_PROTECTED_BIT_KHR: @@ -6491,21 +6407,14 @@ static inline std::string string_VkDisplayPlaneAlphaFlagsKHR(VkDisplayPlaneAlpha return ret; } - -#ifdef VK_ENABLE_BETA_EXTENSIONS - static inline const char* string_VkVideoCodecOperationFlagBitsKHR(VkVideoCodecOperationFlagBitsKHR input_value) { switch (input_value) { -#ifdef VK_ENABLE_BETA_EXTENSIONS - case VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_EXT: - return "VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_EXT"; -#endif // VK_ENABLE_BETA_EXTENSIONS -#ifdef VK_ENABLE_BETA_EXTENSIONS - case VK_VIDEO_CODEC_OPERATION_DECODE_H265_BIT_EXT: - return "VK_VIDEO_CODEC_OPERATION_DECODE_H265_BIT_EXT"; -#endif // VK_ENABLE_BETA_EXTENSIONS + case VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_KHR: + return "VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_KHR"; + case VK_VIDEO_CODEC_OPERATION_DECODE_H265_BIT_KHR: + return "VK_VIDEO_CODEC_OPERATION_DECODE_H265_BIT_KHR"; #ifdef VK_ENABLE_BETA_EXTENSIONS case VK_VIDEO_CODEC_OPERATION_ENCODE_H264_BIT_EXT: return "VK_VIDEO_CODEC_OPERATION_ENCODE_H264_BIT_EXT"; @@ -6536,10 +6445,6 @@ static inline std::string string_VkVideoCodecOperationFlagsKHR(VkVideoCodecOpera if( ret.empty()) ret.append(string_VkVideoCodecOperationFlagBitsKHR(static_cast(0))); return ret; } -#endif // VK_ENABLE_BETA_EXTENSIONS - - -#ifdef VK_ENABLE_BETA_EXTENSIONS static inline const char* string_VkVideoChromaSubsamplingFlagBitsKHR(VkVideoChromaSubsamplingFlagBitsKHR input_value) { @@ -6575,10 +6480,6 @@ static inline std::string string_VkVideoChromaSubsamplingFlagsKHR(VkVideoChromaS if( ret.empty()) ret.append(string_VkVideoChromaSubsamplingFlagBitsKHR(static_cast(0))); return ret; } -#endif // VK_ENABLE_BETA_EXTENSIONS - - -#ifdef VK_ENABLE_BETA_EXTENSIONS static inline const char* string_VkVideoComponentBitDepthFlagBitsKHR(VkVideoComponentBitDepthFlagBitsKHR input_value) { @@ -6612,10 +6513,6 @@ static inline std::string string_VkVideoComponentBitDepthFlagsKHR(VkVideoCompone if( ret.empty()) ret.append(string_VkVideoComponentBitDepthFlagBitsKHR(static_cast(0))); return ret; } -#endif // VK_ENABLE_BETA_EXTENSIONS - - -#ifdef VK_ENABLE_BETA_EXTENSIONS static inline const char* string_VkVideoCapabilityFlagBitsKHR(VkVideoCapabilityFlagBitsKHR input_value) { @@ -6645,10 +6542,6 @@ static inline std::string string_VkVideoCapabilityFlagsKHR(VkVideoCapabilityFlag if( ret.empty()) ret.append(string_VkVideoCapabilityFlagBitsKHR(static_cast(0))); return ret; } -#endif // VK_ENABLE_BETA_EXTENSIONS - - -#ifdef VK_ENABLE_BETA_EXTENSIONS static inline const char* string_VkVideoSessionCreateFlagBitsKHR(VkVideoSessionCreateFlagBitsKHR input_value) { @@ -6676,10 +6569,6 @@ static inline std::string string_VkVideoSessionCreateFlagsKHR(VkVideoSessionCrea if( ret.empty()) ret.append(string_VkVideoSessionCreateFlagBitsKHR(static_cast(0))); return ret; } -#endif // VK_ENABLE_BETA_EXTENSIONS - - -#ifdef VK_ENABLE_BETA_EXTENSIONS static inline const char* string_VkVideoCodingControlFlagBitsKHR(VkVideoCodingControlFlagBitsKHR input_value) { @@ -6715,10 +6604,6 @@ static inline std::string string_VkVideoCodingControlFlagsKHR(VkVideoCodingContr if( ret.empty()) ret.append(string_VkVideoCodingControlFlagBitsKHR(static_cast(0))); return ret; } -#endif // VK_ENABLE_BETA_EXTENSIONS - - -#ifdef VK_ENABLE_BETA_EXTENSIONS static inline const char* string_VkQueryResultStatusKHR(VkQueryResultStatusKHR input_value) { @@ -6734,10 +6619,6 @@ static inline const char* string_VkQueryResultStatusKHR(VkQueryResultStatusKHR i return "Unhandled VkQueryResultStatusKHR"; } } -#endif // VK_ENABLE_BETA_EXTENSIONS - - -#ifdef VK_ENABLE_BETA_EXTENSIONS static inline const char* string_VkVideoDecodeCapabilityFlagBitsKHR(VkVideoDecodeCapabilityFlagBitsKHR input_value) { @@ -6767,10 +6648,6 @@ static inline std::string string_VkVideoDecodeCapabilityFlagsKHR(VkVideoDecodeCa if( ret.empty()) ret.append(string_VkVideoDecodeCapabilityFlagBitsKHR(static_cast(0))); return ret; } -#endif // VK_ENABLE_BETA_EXTENSIONS - - -#ifdef VK_ENABLE_BETA_EXTENSIONS static inline const char* string_VkVideoDecodeUsageFlagBitsKHR(VkVideoDecodeUsageFlagBitsKHR input_value) { @@ -6804,7 +6681,37 @@ static inline std::string string_VkVideoDecodeUsageFlagsKHR(VkVideoDecodeUsageFl if( ret.empty()) ret.append(string_VkVideoDecodeUsageFlagBitsKHR(static_cast(0))); return ret; } -#endif // VK_ENABLE_BETA_EXTENSIONS + +static inline const char* string_VkVideoDecodeH264PictureLayoutFlagBitsKHR(VkVideoDecodeH264PictureLayoutFlagBitsKHR input_value) +{ + switch (input_value) + { + case VK_VIDEO_DECODE_H264_PICTURE_LAYOUT_INTERLACED_INTERLEAVED_LINES_BIT_KHR: + return "VK_VIDEO_DECODE_H264_PICTURE_LAYOUT_INTERLACED_INTERLEAVED_LINES_BIT_KHR"; + case VK_VIDEO_DECODE_H264_PICTURE_LAYOUT_INTERLACED_SEPARATE_PLANES_BIT_KHR: + return "VK_VIDEO_DECODE_H264_PICTURE_LAYOUT_INTERLACED_SEPARATE_PLANES_BIT_KHR"; + case VK_VIDEO_DECODE_H264_PICTURE_LAYOUT_PROGRESSIVE_KHR: + return "VK_VIDEO_DECODE_H264_PICTURE_LAYOUT_PROGRESSIVE_KHR"; + default: + return "Unhandled VkVideoDecodeH264PictureLayoutFlagBitsKHR"; + } +} + +static inline std::string string_VkVideoDecodeH264PictureLayoutFlagsKHR(VkVideoDecodeH264PictureLayoutFlagsKHR input_value) +{ + std::string ret; + int index = 0; + while(input_value) { + if (input_value & 1) { + if( !ret.empty()) ret.append("|"); + ret.append(string_VkVideoDecodeH264PictureLayoutFlagBitsKHR(static_cast(1U << index))); + } + ++index; + input_value >>= 1; + } + if( ret.empty()) ret.append(string_VkVideoDecodeH264PictureLayoutFlagBitsKHR(static_cast(0))); + return ret; +} static inline const char* string_VkRenderingFlagBitsKHR(VkRenderingFlagBitsKHR input_value) { @@ -7382,6 +7289,8 @@ static inline const char* string_VkDriverIdKHR(VkDriverIdKHR input_value) return "VK_DRIVER_ID_GGP_PROPRIETARY"; case VK_DRIVER_ID_GOOGLE_SWIFTSHADER: return "VK_DRIVER_ID_GOOGLE_SWIFTSHADER"; + case VK_DRIVER_ID_IMAGINATION_OPEN_SOURCE_MESA: + return "VK_DRIVER_ID_IMAGINATION_OPEN_SOURCE_MESA"; case VK_DRIVER_ID_IMAGINATION_PROPRIETARY: return "VK_DRIVER_ID_IMAGINATION_PROPRIETARY"; case VK_DRIVER_ID_INTEL_OPEN_SOURCE_MESA: @@ -7732,6 +7641,8 @@ static inline const char* string_VkPipelineStageFlagBits2KHR(uint64_t input_valu return "VK_PIPELINE_STAGE_2_BOTTOM_OF_PIPE_BIT"; case VK_PIPELINE_STAGE_2_CLEAR_BIT: return "VK_PIPELINE_STAGE_2_CLEAR_BIT"; + case VK_PIPELINE_STAGE_2_CLUSTER_CULLING_SHADER_BIT_HUAWEI: + return "VK_PIPELINE_STAGE_2_CLUSTER_CULLING_SHADER_BIT_HUAWEI"; case VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BIT: return "VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BIT"; case VK_PIPELINE_STAGE_2_COMMAND_PREPROCESS_BIT_NV: @@ -7794,10 +7705,8 @@ static inline const char* string_VkPipelineStageFlagBits2KHR(uint64_t input_valu return "VK_PIPELINE_STAGE_2_VERTEX_INPUT_BIT"; case VK_PIPELINE_STAGE_2_VERTEX_SHADER_BIT: return "VK_PIPELINE_STAGE_2_VERTEX_SHADER_BIT"; -#ifdef VK_ENABLE_BETA_EXTENSIONS case VK_PIPELINE_STAGE_2_VIDEO_DECODE_BIT_KHR: return "VK_PIPELINE_STAGE_2_VIDEO_DECODE_BIT_KHR"; -#endif // VK_ENABLE_BETA_EXTENSIONS #ifdef VK_ENABLE_BETA_EXTENSIONS case VK_PIPELINE_STAGE_2_VIDEO_ENCODE_BIT_KHR: return "VK_PIPELINE_STAGE_2_VIDEO_ENCODE_BIT_KHR"; @@ -7905,14 +7814,10 @@ static inline const char* string_VkAccessFlagBits2KHR(uint64_t input_value) return "VK_ACCESS_2_UNIFORM_READ_BIT"; case VK_ACCESS_2_VERTEX_ATTRIBUTE_READ_BIT: return "VK_ACCESS_2_VERTEX_ATTRIBUTE_READ_BIT"; -#ifdef VK_ENABLE_BETA_EXTENSIONS case VK_ACCESS_2_VIDEO_DECODE_READ_BIT_KHR: return "VK_ACCESS_2_VIDEO_DECODE_READ_BIT_KHR"; -#endif // VK_ENABLE_BETA_EXTENSIONS -#ifdef VK_ENABLE_BETA_EXTENSIONS case VK_ACCESS_2_VIDEO_DECODE_WRITE_BIT_KHR: return "VK_ACCESS_2_VIDEO_DECODE_WRITE_BIT_KHR"; -#endif // VK_ENABLE_BETA_EXTENSIONS #ifdef VK_ENABLE_BETA_EXTENSIONS case VK_ACCESS_2_VIDEO_ENCODE_READ_BIT_KHR: return "VK_ACCESS_2_VIDEO_ENCODE_READ_BIT_KHR"; @@ -8045,14 +7950,10 @@ static inline const char* string_VkFormatFeatureFlagBits2KHR(uint64_t input_valu return "VK_FORMAT_FEATURE_2_UNIFORM_TEXEL_BUFFER_BIT"; case VK_FORMAT_FEATURE_2_VERTEX_BUFFER_BIT: return "VK_FORMAT_FEATURE_2_VERTEX_BUFFER_BIT"; -#ifdef VK_ENABLE_BETA_EXTENSIONS case VK_FORMAT_FEATURE_2_VIDEO_DECODE_DPB_BIT_KHR: return "VK_FORMAT_FEATURE_2_VIDEO_DECODE_DPB_BIT_KHR"; -#endif // VK_ENABLE_BETA_EXTENSIONS -#ifdef VK_ENABLE_BETA_EXTENSIONS case VK_FORMAT_FEATURE_2_VIDEO_DECODE_OUTPUT_BIT_KHR: return "VK_FORMAT_FEATURE_2_VIDEO_DECODE_OUTPUT_BIT_KHR"; -#endif // VK_ENABLE_BETA_EXTENSIONS #ifdef VK_ENABLE_BETA_EXTENSIONS case VK_FORMAT_FEATURE_2_VIDEO_ENCODE_DPB_BIT_KHR: return "VK_FORMAT_FEATURE_2_VIDEO_ENCODE_DPB_BIT_KHR"; @@ -8631,41 +8532,6 @@ static inline const char* string_VkVideoEncodeH265RateControlStructureEXT(VkVide } #endif // VK_ENABLE_BETA_EXTENSIONS - -#ifdef VK_ENABLE_BETA_EXTENSIONS - -static inline const char* string_VkVideoDecodeH264PictureLayoutFlagBitsEXT(VkVideoDecodeH264PictureLayoutFlagBitsEXT input_value) -{ - switch (input_value) - { - case VK_VIDEO_DECODE_H264_PICTURE_LAYOUT_INTERLACED_INTERLEAVED_LINES_BIT_EXT: - return "VK_VIDEO_DECODE_H264_PICTURE_LAYOUT_INTERLACED_INTERLEAVED_LINES_BIT_EXT"; - case VK_VIDEO_DECODE_H264_PICTURE_LAYOUT_INTERLACED_SEPARATE_PLANES_BIT_EXT: - return "VK_VIDEO_DECODE_H264_PICTURE_LAYOUT_INTERLACED_SEPARATE_PLANES_BIT_EXT"; - case VK_VIDEO_DECODE_H264_PICTURE_LAYOUT_PROGRESSIVE_EXT: - return "VK_VIDEO_DECODE_H264_PICTURE_LAYOUT_PROGRESSIVE_EXT"; - default: - return "Unhandled VkVideoDecodeH264PictureLayoutFlagBitsEXT"; - } -} - -static inline std::string string_VkVideoDecodeH264PictureLayoutFlagsEXT(VkVideoDecodeH264PictureLayoutFlagsEXT input_value) -{ - std::string ret; - int index = 0; - while(input_value) { - if (input_value & 1) { - if( !ret.empty()) ret.append("|"); - ret.append(string_VkVideoDecodeH264PictureLayoutFlagBitsEXT(static_cast(1U << index))); - } - ++index; - input_value >>= 1; - } - if( ret.empty()) ret.append(string_VkVideoDecodeH264PictureLayoutFlagBitsEXT(static_cast(0))); - return ret; -} -#endif // VK_ENABLE_BETA_EXTENSIONS - static inline const char* string_VkShaderInfoTypeAMD(VkShaderInfoTypeAMD input_value) { switch (input_value) @@ -9842,6 +9708,68 @@ static inline const char* string_VkLineRasterizationModeEXT(VkLineRasterizationM } } +static inline const char* string_VkPresentScalingFlagBitsEXT(VkPresentScalingFlagBitsEXT input_value) +{ + switch (input_value) + { + case VK_PRESENT_SCALING_ASPECT_RATIO_STRETCH_BIT_EXT: + return "VK_PRESENT_SCALING_ASPECT_RATIO_STRETCH_BIT_EXT"; + case VK_PRESENT_SCALING_ONE_TO_ONE_BIT_EXT: + return "VK_PRESENT_SCALING_ONE_TO_ONE_BIT_EXT"; + case VK_PRESENT_SCALING_STRETCH_BIT_EXT: + return "VK_PRESENT_SCALING_STRETCH_BIT_EXT"; + default: + return "Unhandled VkPresentScalingFlagBitsEXT"; + } +} + +static inline std::string string_VkPresentScalingFlagsEXT(VkPresentScalingFlagsEXT input_value) +{ + std::string ret; + int index = 0; + while(input_value) { + if (input_value & 1) { + if( !ret.empty()) ret.append("|"); + ret.append(string_VkPresentScalingFlagBitsEXT(static_cast(1U << index))); + } + ++index; + input_value >>= 1; + } + if( ret.empty()) ret.append(string_VkPresentScalingFlagBitsEXT(static_cast(0))); + return ret; +} + +static inline const char* string_VkPresentGravityFlagBitsEXT(VkPresentGravityFlagBitsEXT input_value) +{ + switch (input_value) + { + case VK_PRESENT_GRAVITY_CENTERED_BIT_EXT: + return "VK_PRESENT_GRAVITY_CENTERED_BIT_EXT"; + case VK_PRESENT_GRAVITY_MAX_BIT_EXT: + return "VK_PRESENT_GRAVITY_MAX_BIT_EXT"; + case VK_PRESENT_GRAVITY_MIN_BIT_EXT: + return "VK_PRESENT_GRAVITY_MIN_BIT_EXT"; + default: + return "Unhandled VkPresentGravityFlagBitsEXT"; + } +} + +static inline std::string string_VkPresentGravityFlagsEXT(VkPresentGravityFlagsEXT input_value) +{ + std::string ret; + int index = 0; + while(input_value) { + if (input_value & 1) { + if( !ret.empty()) ret.append("|"); + ret.append(string_VkPresentGravityFlagBitsEXT(static_cast(1U << index))); + } + ++index; + input_value >>= 1; + } + if( ret.empty()) ret.append(string_VkPresentGravityFlagBitsEXT(static_cast(0))); + return ret; +} + static inline const char* string_VkIndirectStateFlagBitsNV(VkIndirectStateFlagBitsNV input_value) { switch (input_value) diff --git a/ext/vulkan/vk_icd.h b/ext/vulkan/vk_icd.h index fa90fcf75d..1133fa3670 100644 --- a/ext/vulkan/vk_icd.h +++ b/ext/vulkan/vk_icd.h @@ -2,9 +2,9 @@ // File: vk_icd.h // /* - * Copyright (c) 2015-2016, 2022 The Khronos Group Inc. - * Copyright (c) 2015-2016, 2022 Valve Corporation - * Copyright (c) 2015-2016, 2022 LunarG, Inc. + * Copyright (c) 2015-2023 LunarG, Inc. + * Copyright (c) 2015-2023 The Khronos Group Inc. + * Copyright (c) 2015-2023 Valve Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -19,9 +19,7 @@ * limitations under the License. * */ - -#ifndef VKICD_H -#define VKICD_H +#pragma once #include "vulkan.h" #include @@ -258,5 +256,3 @@ typedef struct { VkIcdSurfaceBase base; } VkIcdSurfaceImagePipe; #endif // VK_USE_PLATFORM_FUCHSIA - -#endif // VKICD_H diff --git a/ext/vulkan/vk_layer.h b/ext/vulkan/vk_layer.h index 0651870c70..6bd1c9a03f 100644 --- a/ext/vulkan/vk_layer.h +++ b/ext/vulkan/vk_layer.h @@ -2,9 +2,9 @@ // File: vk_layer.h // /* - * Copyright (c) 2015-2017 The Khronos Group Inc. - * Copyright (c) 2015-2017 Valve Corporation - * Copyright (c) 2015-2017 LunarG, Inc. + * Copyright (c) 2015-2023 LunarG, Inc. + * Copyright (c) 2015-2023 The Khronos Group Inc. + * Copyright (c) 2015-2023 Valve Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -19,14 +19,15 @@ * limitations under the License. * */ +#pragma once /* Need to define dispatch table * Core struct can then have ptr to dispatch table at the top * Along with object ptrs for current and next OBJ */ -#pragma once -#include "vulkan.h" +#include "vulkan_core.h" + #if defined(__GNUC__) && __GNUC__ >= 4 #define VK_LAYER_EXPORT __attribute__((visibility("default"))) #elif defined(__SUNPRO_C) && (__SUNPRO_C >= 0x590) diff --git a/ext/vulkan/vk_sdk_platform.h b/ext/vulkan/vk_sdk_platform.h index f192c1c619..3bdf5057bf 100644 --- a/ext/vulkan/vk_sdk_platform.h +++ b/ext/vulkan/vk_sdk_platform.h @@ -2,9 +2,9 @@ // File: vk_sdk_platform.h // /* - * Copyright (c) 2015-2016 The Khronos Group Inc. - * Copyright (c) 2015-2016 Valve Corporation - * Copyright (c) 2015-2016 LunarG, Inc. + * Copyright (c) 2015-2023 LunarG, Inc. + * Copyright (c) 2015-2023 The Khronos Group Inc. + * Copyright (c) 2015-2023 Valve Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,9 +18,21 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +#pragma once -#ifndef VK_SDK_PLATFORM_H -#define VK_SDK_PLATFORM_H +// Allow users to suppress warnings generated by this header file by defining VK_SDK_PLATFORM_SUPRRESS_DEPRECATION_WARNING +#ifndef VK_SDK_PLATFORM_SUPRRESS_DEPRECATION_WARNING + +#if defined(__GNUC__) && __GNUC__ >= 4 +#warning "vk_sdk_platform.h is deprecated and will be removed in future release! Use VK_SDK_PLATFORM_SUPRRESS_DEPRECATION_WARNING to suppress warning!" +#endif + +// MSVC doesn't support warning directive +#if defined(_MSC_VER) +#pragma message("vk_sdk_platform.h is deprecated and will be removed in future release! Use VK_SDK_PLATFORM_SUPRRESS_DEPRECATION_WARNING to suppress warning!") +#endif + +#endif #if defined(_WIN32) #ifndef NOMINMAX @@ -67,5 +79,3 @@ #define NOEXCEPT #endif #endif - -#endif // VK_SDK_PLATFORM_H diff --git a/ext/vulkan/vk_video/vulkan_video_codec_h264std.h b/ext/vulkan/vk_video/vulkan_video_codec_h264std.h new file mode 100644 index 0000000000..d3ebec6a14 --- /dev/null +++ b/ext/vulkan/vk_video/vulkan_video_codec_h264std.h @@ -0,0 +1,310 @@ +#ifndef VULKAN_VIDEO_CODEC_H264STD_H_ +#define VULKAN_VIDEO_CODEC_H264STD_H_ 1 + +/* +** Copyright 2015-2022 The Khronos Group Inc. +** +** SPDX-License-Identifier: Apache-2.0 +*/ + +/* +** This header is generated from the Khronos Vulkan XML API Registry. +** +*/ + + +#ifdef __cplusplus +extern "C" { +#endif + + + +#define vulkan_video_codec_h264std 1 +#include +#define STD_VIDEO_H264_CPB_CNT_LIST_SIZE 32 +#define STD_VIDEO_H264_SCALING_LIST_4X4_NUM_LISTS 6 +#define STD_VIDEO_H264_SCALING_LIST_4X4_NUM_ELEMENTS 16 +#define STD_VIDEO_H264_SCALING_LIST_8X8_NUM_LISTS 6 +#define STD_VIDEO_H264_SCALING_LIST_8X8_NUM_ELEMENTS 64 +#define STD_VIDEO_H264_MAX_NUM_LIST_REF 32 +#define STD_VIDEO_H264_MAX_CHROMA_PLANES 2 + +typedef enum StdVideoH264ChromaFormatIdc { + STD_VIDEO_H264_CHROMA_FORMAT_IDC_MONOCHROME = 0, + STD_VIDEO_H264_CHROMA_FORMAT_IDC_420 = 1, + STD_VIDEO_H264_CHROMA_FORMAT_IDC_422 = 2, + STD_VIDEO_H264_CHROMA_FORMAT_IDC_444 = 3, + STD_VIDEO_H264_CHROMA_FORMAT_IDC_INVALID = 0x7FFFFFFF, + STD_VIDEO_H264_CHROMA_FORMAT_IDC_MAX_ENUM = 0x7FFFFFFF +} StdVideoH264ChromaFormatIdc; + +typedef enum StdVideoH264ProfileIdc { + STD_VIDEO_H264_PROFILE_IDC_BASELINE = 66, + STD_VIDEO_H264_PROFILE_IDC_MAIN = 77, + STD_VIDEO_H264_PROFILE_IDC_HIGH = 100, + STD_VIDEO_H264_PROFILE_IDC_HIGH_444_PREDICTIVE = 244, + STD_VIDEO_H264_PROFILE_IDC_INVALID = 0x7FFFFFFF, + STD_VIDEO_H264_PROFILE_IDC_MAX_ENUM = 0x7FFFFFFF +} StdVideoH264ProfileIdc; + +typedef enum StdVideoH264LevelIdc { + STD_VIDEO_H264_LEVEL_IDC_1_0 = 0, + STD_VIDEO_H264_LEVEL_IDC_1_1 = 1, + STD_VIDEO_H264_LEVEL_IDC_1_2 = 2, + STD_VIDEO_H264_LEVEL_IDC_1_3 = 3, + STD_VIDEO_H264_LEVEL_IDC_2_0 = 4, + STD_VIDEO_H264_LEVEL_IDC_2_1 = 5, + STD_VIDEO_H264_LEVEL_IDC_2_2 = 6, + STD_VIDEO_H264_LEVEL_IDC_3_0 = 7, + STD_VIDEO_H264_LEVEL_IDC_3_1 = 8, + STD_VIDEO_H264_LEVEL_IDC_3_2 = 9, + STD_VIDEO_H264_LEVEL_IDC_4_0 = 10, + STD_VIDEO_H264_LEVEL_IDC_4_1 = 11, + STD_VIDEO_H264_LEVEL_IDC_4_2 = 12, + STD_VIDEO_H264_LEVEL_IDC_5_0 = 13, + STD_VIDEO_H264_LEVEL_IDC_5_1 = 14, + STD_VIDEO_H264_LEVEL_IDC_5_2 = 15, + STD_VIDEO_H264_LEVEL_IDC_6_0 = 16, + STD_VIDEO_H264_LEVEL_IDC_6_1 = 17, + STD_VIDEO_H264_LEVEL_IDC_6_2 = 18, + STD_VIDEO_H264_LEVEL_IDC_INVALID = 0x7FFFFFFF, + STD_VIDEO_H264_LEVEL_IDC_MAX_ENUM = 0x7FFFFFFF +} StdVideoH264LevelIdc; + +typedef enum StdVideoH264PocType { + STD_VIDEO_H264_POC_TYPE_0 = 0, + STD_VIDEO_H264_POC_TYPE_1 = 1, + STD_VIDEO_H264_POC_TYPE_2 = 2, + STD_VIDEO_H264_POC_TYPE_INVALID = 0x7FFFFFFF, + STD_VIDEO_H264_POC_TYPE_MAX_ENUM = 0x7FFFFFFF +} StdVideoH264PocType; + +typedef enum StdVideoH264AspectRatioIdc { + STD_VIDEO_H264_ASPECT_RATIO_IDC_UNSPECIFIED = 0, + STD_VIDEO_H264_ASPECT_RATIO_IDC_SQUARE = 1, + STD_VIDEO_H264_ASPECT_RATIO_IDC_12_11 = 2, + STD_VIDEO_H264_ASPECT_RATIO_IDC_10_11 = 3, + STD_VIDEO_H264_ASPECT_RATIO_IDC_16_11 = 4, + STD_VIDEO_H264_ASPECT_RATIO_IDC_40_33 = 5, + STD_VIDEO_H264_ASPECT_RATIO_IDC_24_11 = 6, + STD_VIDEO_H264_ASPECT_RATIO_IDC_20_11 = 7, + STD_VIDEO_H264_ASPECT_RATIO_IDC_32_11 = 8, + STD_VIDEO_H264_ASPECT_RATIO_IDC_80_33 = 9, + STD_VIDEO_H264_ASPECT_RATIO_IDC_18_11 = 10, + STD_VIDEO_H264_ASPECT_RATIO_IDC_15_11 = 11, + STD_VIDEO_H264_ASPECT_RATIO_IDC_64_33 = 12, + STD_VIDEO_H264_ASPECT_RATIO_IDC_160_99 = 13, + STD_VIDEO_H264_ASPECT_RATIO_IDC_4_3 = 14, + STD_VIDEO_H264_ASPECT_RATIO_IDC_3_2 = 15, + STD_VIDEO_H264_ASPECT_RATIO_IDC_2_1 = 16, + STD_VIDEO_H264_ASPECT_RATIO_IDC_EXTENDED_SAR = 255, + STD_VIDEO_H264_ASPECT_RATIO_IDC_INVALID = 0x7FFFFFFF, + STD_VIDEO_H264_ASPECT_RATIO_IDC_MAX_ENUM = 0x7FFFFFFF +} StdVideoH264AspectRatioIdc; + +typedef enum StdVideoH264WeightedBipredIdc { + STD_VIDEO_H264_WEIGHTED_BIPRED_IDC_DEFAULT = 0, + STD_VIDEO_H264_WEIGHTED_BIPRED_IDC_EXPLICIT = 1, + STD_VIDEO_H264_WEIGHTED_BIPRED_IDC_IMPLICIT = 2, + STD_VIDEO_H264_WEIGHTED_BIPRED_IDC_INVALID = 0x7FFFFFFF, + STD_VIDEO_H264_WEIGHTED_BIPRED_IDC_MAX_ENUM = 0x7FFFFFFF +} StdVideoH264WeightedBipredIdc; + +typedef enum StdVideoH264ModificationOfPicNumsIdc { + STD_VIDEO_H264_MODIFICATION_OF_PIC_NUMS_IDC_SHORT_TERM_SUBTRACT = 0, + STD_VIDEO_H264_MODIFICATION_OF_PIC_NUMS_IDC_SHORT_TERM_ADD = 1, + STD_VIDEO_H264_MODIFICATION_OF_PIC_NUMS_IDC_LONG_TERM = 2, + STD_VIDEO_H264_MODIFICATION_OF_PIC_NUMS_IDC_END = 3, + STD_VIDEO_H264_MODIFICATION_OF_PIC_NUMS_IDC_INVALID = 0x7FFFFFFF, + STD_VIDEO_H264_MODIFICATION_OF_PIC_NUMS_IDC_MAX_ENUM = 0x7FFFFFFF +} StdVideoH264ModificationOfPicNumsIdc; + +typedef enum StdVideoH264MemMgmtControlOp { + STD_VIDEO_H264_MEM_MGMT_CONTROL_OP_END = 0, + STD_VIDEO_H264_MEM_MGMT_CONTROL_OP_UNMARK_SHORT_TERM = 1, + STD_VIDEO_H264_MEM_MGMT_CONTROL_OP_UNMARK_LONG_TERM = 2, + STD_VIDEO_H264_MEM_MGMT_CONTROL_OP_MARK_LONG_TERM = 3, + STD_VIDEO_H264_MEM_MGMT_CONTROL_OP_SET_MAX_LONG_TERM_INDEX = 4, + STD_VIDEO_H264_MEM_MGMT_CONTROL_OP_UNMARK_ALL = 5, + STD_VIDEO_H264_MEM_MGMT_CONTROL_OP_MARK_CURRENT_AS_LONG_TERM = 6, + STD_VIDEO_H264_MEM_MGMT_CONTROL_OP_INVALID = 0x7FFFFFFF, + STD_VIDEO_H264_MEM_MGMT_CONTROL_OP_MAX_ENUM = 0x7FFFFFFF +} StdVideoH264MemMgmtControlOp; + +typedef enum StdVideoH264CabacInitIdc { + STD_VIDEO_H264_CABAC_INIT_IDC_0 = 0, + STD_VIDEO_H264_CABAC_INIT_IDC_1 = 1, + STD_VIDEO_H264_CABAC_INIT_IDC_2 = 2, + STD_VIDEO_H264_CABAC_INIT_IDC_INVALID = 0x7FFFFFFF, + STD_VIDEO_H264_CABAC_INIT_IDC_MAX_ENUM = 0x7FFFFFFF +} StdVideoH264CabacInitIdc; + +typedef enum StdVideoH264DisableDeblockingFilterIdc { + STD_VIDEO_H264_DISABLE_DEBLOCKING_FILTER_IDC_DISABLED = 0, + STD_VIDEO_H264_DISABLE_DEBLOCKING_FILTER_IDC_ENABLED = 1, + STD_VIDEO_H264_DISABLE_DEBLOCKING_FILTER_IDC_PARTIAL = 2, + STD_VIDEO_H264_DISABLE_DEBLOCKING_FILTER_IDC_INVALID = 0x7FFFFFFF, + STD_VIDEO_H264_DISABLE_DEBLOCKING_FILTER_IDC_MAX_ENUM = 0x7FFFFFFF +} StdVideoH264DisableDeblockingFilterIdc; + +typedef enum StdVideoH264SliceType { + STD_VIDEO_H264_SLICE_TYPE_P = 0, + STD_VIDEO_H264_SLICE_TYPE_B = 1, + STD_VIDEO_H264_SLICE_TYPE_I = 2, + STD_VIDEO_H264_SLICE_TYPE_INVALID = 0x7FFFFFFF, + STD_VIDEO_H264_SLICE_TYPE_MAX_ENUM = 0x7FFFFFFF +} StdVideoH264SliceType; + +typedef enum StdVideoH264PictureType { + STD_VIDEO_H264_PICTURE_TYPE_P = 0, + STD_VIDEO_H264_PICTURE_TYPE_B = 1, + STD_VIDEO_H264_PICTURE_TYPE_I = 2, + STD_VIDEO_H264_PICTURE_TYPE_IDR = 5, + STD_VIDEO_H264_PICTURE_TYPE_INVALID = 0x7FFFFFFF, + STD_VIDEO_H264_PICTURE_TYPE_MAX_ENUM = 0x7FFFFFFF +} StdVideoH264PictureType; + +typedef enum StdVideoH264NonVclNaluType { + STD_VIDEO_H264_NON_VCL_NALU_TYPE_SPS = 0, + STD_VIDEO_H264_NON_VCL_NALU_TYPE_PPS = 1, + STD_VIDEO_H264_NON_VCL_NALU_TYPE_AUD = 2, + STD_VIDEO_H264_NON_VCL_NALU_TYPE_PREFIX = 3, + STD_VIDEO_H264_NON_VCL_NALU_TYPE_END_OF_SEQUENCE = 4, + STD_VIDEO_H264_NON_VCL_NALU_TYPE_END_OF_STREAM = 5, + STD_VIDEO_H264_NON_VCL_NALU_TYPE_PRECODED = 6, + STD_VIDEO_H264_NON_VCL_NALU_TYPE_INVALID = 0x7FFFFFFF, + STD_VIDEO_H264_NON_VCL_NALU_TYPE_MAX_ENUM = 0x7FFFFFFF +} StdVideoH264NonVclNaluType; +typedef struct StdVideoH264SpsVuiFlags { + uint32_t aspect_ratio_info_present_flag : 1; + uint32_t overscan_info_present_flag : 1; + uint32_t overscan_appropriate_flag : 1; + uint32_t video_signal_type_present_flag : 1; + uint32_t video_full_range_flag : 1; + uint32_t color_description_present_flag : 1; + uint32_t chroma_loc_info_present_flag : 1; + uint32_t timing_info_present_flag : 1; + uint32_t fixed_frame_rate_flag : 1; + uint32_t bitstream_restriction_flag : 1; + uint32_t nal_hrd_parameters_present_flag : 1; + uint32_t vcl_hrd_parameters_present_flag : 1; +} StdVideoH264SpsVuiFlags; + +typedef struct StdVideoH264HrdParameters { + uint8_t cpb_cnt_minus1; + uint8_t bit_rate_scale; + uint8_t cpb_size_scale; + uint8_t reserved1; + uint32_t bit_rate_value_minus1[STD_VIDEO_H264_CPB_CNT_LIST_SIZE]; + uint32_t cpb_size_value_minus1[STD_VIDEO_H264_CPB_CNT_LIST_SIZE]; + uint8_t cbr_flag[STD_VIDEO_H264_CPB_CNT_LIST_SIZE]; + uint32_t initial_cpb_removal_delay_length_minus1; + uint32_t cpb_removal_delay_length_minus1; + uint32_t dpb_output_delay_length_minus1; + uint32_t time_offset_length; +} StdVideoH264HrdParameters; + +typedef struct StdVideoH264SequenceParameterSetVui { + StdVideoH264SpsVuiFlags flags; + StdVideoH264AspectRatioIdc aspect_ratio_idc; + uint16_t sar_width; + uint16_t sar_height; + uint8_t video_format; + uint8_t colour_primaries; + uint8_t transfer_characteristics; + uint8_t matrix_coefficients; + uint32_t num_units_in_tick; + uint32_t time_scale; + uint8_t max_num_reorder_frames; + uint8_t max_dec_frame_buffering; + uint8_t chroma_sample_loc_type_top_field; + uint8_t chroma_sample_loc_type_bottom_field; + uint32_t reserved1; + const StdVideoH264HrdParameters* pHrdParameters; +} StdVideoH264SequenceParameterSetVui; + +typedef struct StdVideoH264SpsFlags { + uint32_t constraint_set0_flag : 1; + uint32_t constraint_set1_flag : 1; + uint32_t constraint_set2_flag : 1; + uint32_t constraint_set3_flag : 1; + uint32_t constraint_set4_flag : 1; + uint32_t constraint_set5_flag : 1; + uint32_t direct_8x8_inference_flag : 1; + uint32_t mb_adaptive_frame_field_flag : 1; + uint32_t frame_mbs_only_flag : 1; + uint32_t delta_pic_order_always_zero_flag : 1; + uint32_t separate_colour_plane_flag : 1; + uint32_t gaps_in_frame_num_value_allowed_flag : 1; + uint32_t qpprime_y_zero_transform_bypass_flag : 1; + uint32_t frame_cropping_flag : 1; + uint32_t seq_scaling_matrix_present_flag : 1; + uint32_t vui_parameters_present_flag : 1; +} StdVideoH264SpsFlags; + +typedef struct StdVideoH264ScalingLists { + uint16_t scaling_list_present_mask; + uint16_t use_default_scaling_matrix_mask; + uint8_t ScalingList4x4[STD_VIDEO_H264_SCALING_LIST_4X4_NUM_LISTS][STD_VIDEO_H264_SCALING_LIST_4X4_NUM_ELEMENTS]; + uint8_t ScalingList8x8[STD_VIDEO_H264_SCALING_LIST_8X8_NUM_LISTS][STD_VIDEO_H264_SCALING_LIST_8X8_NUM_ELEMENTS]; +} StdVideoH264ScalingLists; + +typedef struct StdVideoH264SequenceParameterSet { + StdVideoH264SpsFlags flags; + StdVideoH264ProfileIdc profile_idc; + StdVideoH264LevelIdc level_idc; + StdVideoH264ChromaFormatIdc chroma_format_idc; + uint8_t seq_parameter_set_id; + uint8_t bit_depth_luma_minus8; + uint8_t bit_depth_chroma_minus8; + uint8_t log2_max_frame_num_minus4; + StdVideoH264PocType pic_order_cnt_type; + int32_t offset_for_non_ref_pic; + int32_t offset_for_top_to_bottom_field; + uint8_t log2_max_pic_order_cnt_lsb_minus4; + uint8_t num_ref_frames_in_pic_order_cnt_cycle; + uint8_t max_num_ref_frames; + uint8_t reserved1; + uint32_t pic_width_in_mbs_minus1; + uint32_t pic_height_in_map_units_minus1; + uint32_t frame_crop_left_offset; + uint32_t frame_crop_right_offset; + uint32_t frame_crop_top_offset; + uint32_t frame_crop_bottom_offset; + uint32_t reserved2; + const int32_t* pOffsetForRefFrame; + const StdVideoH264ScalingLists* pScalingLists; + const StdVideoH264SequenceParameterSetVui* pSequenceParameterSetVui; +} StdVideoH264SequenceParameterSet; + +typedef struct StdVideoH264PpsFlags { + uint32_t transform_8x8_mode_flag : 1; + uint32_t redundant_pic_cnt_present_flag : 1; + uint32_t constrained_intra_pred_flag : 1; + uint32_t deblocking_filter_control_present_flag : 1; + uint32_t weighted_pred_flag : 1; + uint32_t bottom_field_pic_order_in_frame_present_flag : 1; + uint32_t entropy_coding_mode_flag : 1; + uint32_t pic_scaling_matrix_present_flag : 1; +} StdVideoH264PpsFlags; + +typedef struct StdVideoH264PictureParameterSet { + StdVideoH264PpsFlags flags; + uint8_t seq_parameter_set_id; + uint8_t pic_parameter_set_id; + uint8_t num_ref_idx_l0_default_active_minus1; + uint8_t num_ref_idx_l1_default_active_minus1; + StdVideoH264WeightedBipredIdc weighted_bipred_idc; + int8_t pic_init_qp_minus26; + int8_t pic_init_qs_minus26; + int8_t chroma_qp_index_offset; + int8_t second_chroma_qp_index_offset; + const StdVideoH264ScalingLists* pScalingLists; +} StdVideoH264PictureParameterSet; + + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/ext/vulkan/vk_video/vulkan_video_codec_h264std_decode.h b/ext/vulkan/vk_video/vulkan_video_codec_h264std_decode.h new file mode 100644 index 0000000000..b1e79429d8 --- /dev/null +++ b/ext/vulkan/vk_video/vulkan_video_codec_h264std_decode.h @@ -0,0 +1,75 @@ +#ifndef VULKAN_VIDEO_CODEC_H264STD_DECODE_H_ +#define VULKAN_VIDEO_CODEC_H264STD_DECODE_H_ 1 + +/* +** Copyright 2015-2022 The Khronos Group Inc. +** +** SPDX-License-Identifier: Apache-2.0 +*/ + +/* +** This header is generated from the Khronos Vulkan XML API Registry. +** +*/ + + +#ifdef __cplusplus +extern "C" { +#endif + + + +#define vulkan_video_codec_h264std_decode 1 + +#define VK_STD_VULKAN_VIDEO_CODEC_H264_DECODE_API_VERSION_1_0_0 VK_MAKE_VIDEO_STD_VERSION(1, 0, 0) + +#define STD_VIDEO_DECODE_H264_FIELD_ORDER_COUNT_LIST_SIZE 2 +#define VK_STD_VULKAN_VIDEO_CODEC_H264_DECODE_SPEC_VERSION VK_STD_VULKAN_VIDEO_CODEC_H264_DECODE_API_VERSION_1_0_0 +#define VK_STD_VULKAN_VIDEO_CODEC_H264_DECODE_EXTENSION_NAME "VK_STD_vulkan_video_codec_h264_decode" + +typedef enum StdVideoDecodeH264FieldOrderCount { + STD_VIDEO_DECODE_H264_FIELD_ORDER_COUNT_TOP = 0, + STD_VIDEO_DECODE_H264_FIELD_ORDER_COUNT_BOTTOM = 1, + STD_VIDEO_DECODE_H264_FIELD_ORDER_COUNT_INVALID = 0x7FFFFFFF, + STD_VIDEO_DECODE_H264_FIELD_ORDER_COUNT_MAX_ENUM = 0x7FFFFFFF +} StdVideoDecodeH264FieldOrderCount; +typedef struct StdVideoDecodeH264PictureInfoFlags { + uint32_t field_pic_flag : 1; + uint32_t is_intra : 1; + uint32_t IdrPicFlag : 1; + uint32_t bottom_field_flag : 1; + uint32_t is_reference : 1; + uint32_t complementary_field_pair : 1; +} StdVideoDecodeH264PictureInfoFlags; + +typedef struct StdVideoDecodeH264PictureInfo { + StdVideoDecodeH264PictureInfoFlags flags; + uint8_t seq_parameter_set_id; + uint8_t pic_parameter_set_id; + uint8_t reserved1; + uint8_t reserved2; + uint16_t frame_num; + uint16_t idr_pic_id; + int32_t PicOrderCnt[STD_VIDEO_DECODE_H264_FIELD_ORDER_COUNT_LIST_SIZE]; +} StdVideoDecodeH264PictureInfo; + +typedef struct StdVideoDecodeH264ReferenceInfoFlags { + uint32_t top_field_flag : 1; + uint32_t bottom_field_flag : 1; + uint32_t used_for_long_term_reference : 1; + uint32_t is_non_existing : 1; +} StdVideoDecodeH264ReferenceInfoFlags; + +typedef struct StdVideoDecodeH264ReferenceInfo { + StdVideoDecodeH264ReferenceInfoFlags flags; + uint16_t FrameNum; + uint16_t reserved; + int32_t PicOrderCnt[STD_VIDEO_DECODE_H264_FIELD_ORDER_COUNT_LIST_SIZE]; +} StdVideoDecodeH264ReferenceInfo; + + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/ext/vulkan/vk_video/vulkan_video_codec_h264std_encode.h b/ext/vulkan/vk_video/vulkan_video_codec_h264std_encode.h new file mode 100644 index 0000000000..7bd96aa7bc --- /dev/null +++ b/ext/vulkan/vk_video/vulkan_video_codec_h264std_encode.h @@ -0,0 +1,132 @@ +#ifndef VULKAN_VIDEO_CODEC_H264STD_ENCODE_H_ +#define VULKAN_VIDEO_CODEC_H264STD_ENCODE_H_ 1 + +/* +** Copyright 2015-2022 The Khronos Group Inc. +** +** SPDX-License-Identifier: Apache-2.0 +*/ + +/* +** This header is generated from the Khronos Vulkan XML API Registry. +** +*/ + + +#ifdef __cplusplus +extern "C" { +#endif + + + +#define vulkan_video_codec_h264std_encode 1 +// Vulkan 0.9 provisional Vulkan video H.264 encode std specification version number +#define VK_STD_VULKAN_VIDEO_CODEC_H264_ENCODE_API_VERSION_0_9_8 VK_MAKE_VIDEO_STD_VERSION(0, 9, 8) + +#define VK_STD_VULKAN_VIDEO_CODEC_H264_ENCODE_SPEC_VERSION VK_STD_VULKAN_VIDEO_CODEC_H264_ENCODE_API_VERSION_0_9_8 +#define VK_STD_VULKAN_VIDEO_CODEC_H264_ENCODE_EXTENSION_NAME "VK_STD_vulkan_video_codec_h264_encode" +typedef struct StdVideoEncodeH264WeightTableFlags { + uint32_t luma_weight_l0_flag; + uint32_t chroma_weight_l0_flag; + uint32_t luma_weight_l1_flag; + uint32_t chroma_weight_l1_flag; +} StdVideoEncodeH264WeightTableFlags; + +typedef struct StdVideoEncodeH264WeightTable { + StdVideoEncodeH264WeightTableFlags flags; + uint8_t luma_log2_weight_denom; + uint8_t chroma_log2_weight_denom; + int8_t luma_weight_l0[STD_VIDEO_H264_MAX_NUM_LIST_REF]; + int8_t luma_offset_l0[STD_VIDEO_H264_MAX_NUM_LIST_REF]; + int8_t chroma_weight_l0[STD_VIDEO_H264_MAX_NUM_LIST_REF][STD_VIDEO_H264_MAX_CHROMA_PLANES]; + int8_t chroma_offset_l0[STD_VIDEO_H264_MAX_NUM_LIST_REF][STD_VIDEO_H264_MAX_CHROMA_PLANES]; + int8_t luma_weight_l1[STD_VIDEO_H264_MAX_NUM_LIST_REF]; + int8_t luma_offset_l1[STD_VIDEO_H264_MAX_NUM_LIST_REF]; + int8_t chroma_weight_l1[STD_VIDEO_H264_MAX_NUM_LIST_REF][STD_VIDEO_H264_MAX_CHROMA_PLANES]; + int8_t chroma_offset_l1[STD_VIDEO_H264_MAX_NUM_LIST_REF][STD_VIDEO_H264_MAX_CHROMA_PLANES]; +} StdVideoEncodeH264WeightTable; + +typedef struct StdVideoEncodeH264SliceHeaderFlags { + uint32_t direct_spatial_mv_pred_flag : 1; + uint32_t num_ref_idx_active_override_flag : 1; + uint32_t no_output_of_prior_pics_flag : 1; + uint32_t adaptive_ref_pic_marking_mode_flag : 1; + uint32_t no_prior_references_available_flag : 1; +} StdVideoEncodeH264SliceHeaderFlags; + +typedef struct StdVideoEncodeH264PictureInfoFlags { + uint32_t idr_flag : 1; + uint32_t is_reference_flag : 1; + uint32_t used_for_long_term_reference : 1; +} StdVideoEncodeH264PictureInfoFlags; + +typedef struct StdVideoEncodeH264ReferenceInfoFlags { + uint32_t used_for_long_term_reference : 1; +} StdVideoEncodeH264ReferenceInfoFlags; + +typedef struct StdVideoEncodeH264RefMgmtFlags { + uint32_t ref_pic_list_modification_l0_flag : 1; + uint32_t ref_pic_list_modification_l1_flag : 1; +} StdVideoEncodeH264RefMgmtFlags; + +typedef struct StdVideoEncodeH264RefListModEntry { + StdVideoH264ModificationOfPicNumsIdc modification_of_pic_nums_idc; + uint16_t abs_diff_pic_num_minus1; + uint16_t long_term_pic_num; +} StdVideoEncodeH264RefListModEntry; + +typedef struct StdVideoEncodeH264RefPicMarkingEntry { + StdVideoH264MemMgmtControlOp operation; + uint16_t difference_of_pic_nums_minus1; + uint16_t long_term_pic_num; + uint16_t long_term_frame_idx; + uint16_t max_long_term_frame_idx_plus1; +} StdVideoEncodeH264RefPicMarkingEntry; + +typedef struct StdVideoEncodeH264RefMemMgmtCtrlOperations { + StdVideoEncodeH264RefMgmtFlags flags; + uint8_t refList0ModOpCount; + const StdVideoEncodeH264RefListModEntry* pRefList0ModOperations; + uint8_t refList1ModOpCount; + const StdVideoEncodeH264RefListModEntry* pRefList1ModOperations; + uint8_t refPicMarkingOpCount; + const StdVideoEncodeH264RefPicMarkingEntry* pRefPicMarkingOperations; +} StdVideoEncodeH264RefMemMgmtCtrlOperations; + +typedef struct StdVideoEncodeH264PictureInfo { + StdVideoEncodeH264PictureInfoFlags flags; + uint8_t seq_parameter_set_id; + uint8_t pic_parameter_set_id; + StdVideoH264PictureType pictureType; + uint32_t frame_num; + int32_t PicOrderCnt; +} StdVideoEncodeH264PictureInfo; + +typedef struct StdVideoEncodeH264ReferenceInfo { + StdVideoEncodeH264ReferenceInfoFlags flags; + uint32_t FrameNum; + int32_t PicOrderCnt; + uint16_t long_term_pic_num; + uint16_t long_term_frame_idx; +} StdVideoEncodeH264ReferenceInfo; + +typedef struct StdVideoEncodeH264SliceHeader { + StdVideoEncodeH264SliceHeaderFlags flags; + uint32_t first_mb_in_slice; + StdVideoH264SliceType slice_type; + uint16_t idr_pic_id; + uint8_t num_ref_idx_l0_active_minus1; + uint8_t num_ref_idx_l1_active_minus1; + StdVideoH264CabacInitIdc cabac_init_idc; + StdVideoH264DisableDeblockingFilterIdc disable_deblocking_filter_idc; + int8_t slice_alpha_c0_offset_div2; + int8_t slice_beta_offset_div2; + const StdVideoEncodeH264WeightTable* pWeightTable; +} StdVideoEncodeH264SliceHeader; + + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/ext/vulkan/vk_video/vulkan_video_codec_h265std.h b/ext/vulkan/vk_video/vulkan_video_codec_h265std.h new file mode 100644 index 0000000000..862f8817f6 --- /dev/null +++ b/ext/vulkan/vk_video/vulkan_video_codec_h265std.h @@ -0,0 +1,443 @@ +#ifndef VULKAN_VIDEO_CODEC_H265STD_H_ +#define VULKAN_VIDEO_CODEC_H265STD_H_ 1 + +/* +** Copyright 2015-2022 The Khronos Group Inc. +** +** SPDX-License-Identifier: Apache-2.0 +*/ + +/* +** This header is generated from the Khronos Vulkan XML API Registry. +** +*/ + + +#ifdef __cplusplus +extern "C" { +#endif + + + +#define vulkan_video_codec_h265std 1 +#define STD_VIDEO_H265_SUBLAYERS_LIST_SIZE 7 +#define STD_VIDEO_H265_CPB_CNT_LIST_SIZE 32 +#define STD_VIDEO_H265_SCALING_LIST_4X4_NUM_LISTS 6 +#define STD_VIDEO_H265_SCALING_LIST_4X4_NUM_ELEMENTS 16 +#define STD_VIDEO_H265_SCALING_LIST_8X8_NUM_LISTS 6 +#define STD_VIDEO_H265_SCALING_LIST_8X8_NUM_ELEMENTS 64 +#define STD_VIDEO_H265_SCALING_LIST_16X16_NUM_LISTS 6 +#define STD_VIDEO_H265_SCALING_LIST_16X16_NUM_ELEMENTS 64 +#define STD_VIDEO_H265_SCALING_LIST_32X32_NUM_LISTS 2 +#define STD_VIDEO_H265_SCALING_LIST_32X32_NUM_ELEMENTS 64 +#define STD_VIDEO_H265_PREDICTOR_PALETTE_COMPONENTS_LIST_SIZE 3 +#define STD_VIDEO_H265_PREDICTOR_PALETTE_COMP_ENTRIES_LIST_SIZE 128 +#define STD_VIDEO_H265_MAX_DPB_SIZE 16 +#define STD_VIDEO_H265_MAX_LONG_TERM_REF_PICS_SPS 32 +#define STD_VIDEO_H265_CHROMA_QP_OFFSET_LIST_SIZE 6 +#define STD_VIDEO_H265_CHROMA_QP_OFFSET_TILE_COLS_LIST_SIZE 19 +#define STD_VIDEO_H265_CHROMA_QP_OFFSET_TILE_ROWS_LIST_SIZE 21 +#define STD_VIDEO_H265_MAX_NUM_LIST_REF 15 +#define STD_VIDEO_H265_MAX_CHROMA_PLANES 2 +#define STD_VIDEO_H265_MAX_SHORT_TERM_REF_PIC_SETS 64 +#define STD_VIDEO_H265_MAX_LONG_TERM_PICS 16 +#define STD_VIDEO_H265_MAX_DELTA_POC 48 + +typedef enum StdVideoH265ChromaFormatIdc { + STD_VIDEO_H265_CHROMA_FORMAT_IDC_MONOCHROME = 0, + STD_VIDEO_H265_CHROMA_FORMAT_IDC_420 = 1, + STD_VIDEO_H265_CHROMA_FORMAT_IDC_422 = 2, + STD_VIDEO_H265_CHROMA_FORMAT_IDC_444 = 3, + STD_VIDEO_H265_CHROMA_FORMAT_IDC_INVALID = 0x7FFFFFFF, + STD_VIDEO_H265_CHROMA_FORMAT_IDC_MAX_ENUM = 0x7FFFFFFF +} StdVideoH265ChromaFormatIdc; + +typedef enum StdVideoH265ProfileIdc { + STD_VIDEO_H265_PROFILE_IDC_MAIN = 1, + STD_VIDEO_H265_PROFILE_IDC_MAIN_10 = 2, + STD_VIDEO_H265_PROFILE_IDC_MAIN_STILL_PICTURE = 3, + STD_VIDEO_H265_PROFILE_IDC_FORMAT_RANGE_EXTENSIONS = 4, + STD_VIDEO_H265_PROFILE_IDC_SCC_EXTENSIONS = 9, + STD_VIDEO_H265_PROFILE_IDC_INVALID = 0x7FFFFFFF, + STD_VIDEO_H265_PROFILE_IDC_MAX_ENUM = 0x7FFFFFFF +} StdVideoH265ProfileIdc; + +typedef enum StdVideoH265LevelIdc { + STD_VIDEO_H265_LEVEL_IDC_1_0 = 0, + STD_VIDEO_H265_LEVEL_IDC_2_0 = 1, + STD_VIDEO_H265_LEVEL_IDC_2_1 = 2, + STD_VIDEO_H265_LEVEL_IDC_3_0 = 3, + STD_VIDEO_H265_LEVEL_IDC_3_1 = 4, + STD_VIDEO_H265_LEVEL_IDC_4_0 = 5, + STD_VIDEO_H265_LEVEL_IDC_4_1 = 6, + STD_VIDEO_H265_LEVEL_IDC_5_0 = 7, + STD_VIDEO_H265_LEVEL_IDC_5_1 = 8, + STD_VIDEO_H265_LEVEL_IDC_5_2 = 9, + STD_VIDEO_H265_LEVEL_IDC_6_0 = 10, + STD_VIDEO_H265_LEVEL_IDC_6_1 = 11, + STD_VIDEO_H265_LEVEL_IDC_6_2 = 12, + STD_VIDEO_H265_LEVEL_IDC_INVALID = 0x7FFFFFFF, + STD_VIDEO_H265_LEVEL_IDC_MAX_ENUM = 0x7FFFFFFF +} StdVideoH265LevelIdc; + +typedef enum StdVideoH265SliceType { + STD_VIDEO_H265_SLICE_TYPE_B = 0, + STD_VIDEO_H265_SLICE_TYPE_P = 1, + STD_VIDEO_H265_SLICE_TYPE_I = 2, + STD_VIDEO_H265_SLICE_TYPE_INVALID = 0x7FFFFFFF, + STD_VIDEO_H265_SLICE_TYPE_MAX_ENUM = 0x7FFFFFFF +} StdVideoH265SliceType; + +typedef enum StdVideoH265PictureType { + STD_VIDEO_H265_PICTURE_TYPE_P = 0, + STD_VIDEO_H265_PICTURE_TYPE_B = 1, + STD_VIDEO_H265_PICTURE_TYPE_I = 2, + STD_VIDEO_H265_PICTURE_TYPE_IDR = 3, + STD_VIDEO_H265_PICTURE_TYPE_INVALID = 0x7FFFFFFF, + STD_VIDEO_H265_PICTURE_TYPE_MAX_ENUM = 0x7FFFFFFF +} StdVideoH265PictureType; + +typedef enum StdVideoH265AspectRatioIdc { + STD_VIDEO_H265_ASPECT_RATIO_IDC_UNSPECIFIED = 0, + STD_VIDEO_H265_ASPECT_RATIO_IDC_SQUARE = 1, + STD_VIDEO_H265_ASPECT_RATIO_IDC_12_11 = 2, + STD_VIDEO_H265_ASPECT_RATIO_IDC_10_11 = 3, + STD_VIDEO_H265_ASPECT_RATIO_IDC_16_11 = 4, + STD_VIDEO_H265_ASPECT_RATIO_IDC_40_33 = 5, + STD_VIDEO_H265_ASPECT_RATIO_IDC_24_11 = 6, + STD_VIDEO_H265_ASPECT_RATIO_IDC_20_11 = 7, + STD_VIDEO_H265_ASPECT_RATIO_IDC_32_11 = 8, + STD_VIDEO_H265_ASPECT_RATIO_IDC_80_33 = 9, + STD_VIDEO_H265_ASPECT_RATIO_IDC_18_11 = 10, + STD_VIDEO_H265_ASPECT_RATIO_IDC_15_11 = 11, + STD_VIDEO_H265_ASPECT_RATIO_IDC_64_33 = 12, + STD_VIDEO_H265_ASPECT_RATIO_IDC_160_99 = 13, + STD_VIDEO_H265_ASPECT_RATIO_IDC_4_3 = 14, + STD_VIDEO_H265_ASPECT_RATIO_IDC_3_2 = 15, + STD_VIDEO_H265_ASPECT_RATIO_IDC_2_1 = 16, + STD_VIDEO_H265_ASPECT_RATIO_IDC_EXTENDED_SAR = 255, + STD_VIDEO_H265_ASPECT_RATIO_IDC_INVALID = 0x7FFFFFFF, + STD_VIDEO_H265_ASPECT_RATIO_IDC_MAX_ENUM = 0x7FFFFFFF +} StdVideoH265AspectRatioIdc; +typedef struct StdVideoH265DecPicBufMgr { + uint32_t max_latency_increase_plus1[STD_VIDEO_H265_SUBLAYERS_LIST_SIZE]; + uint8_t max_dec_pic_buffering_minus1[STD_VIDEO_H265_SUBLAYERS_LIST_SIZE]; + uint8_t max_num_reorder_pics[STD_VIDEO_H265_SUBLAYERS_LIST_SIZE]; +} StdVideoH265DecPicBufMgr; + +typedef struct StdVideoH265SubLayerHrdParameters { + uint32_t bit_rate_value_minus1[STD_VIDEO_H265_CPB_CNT_LIST_SIZE]; + uint32_t cpb_size_value_minus1[STD_VIDEO_H265_CPB_CNT_LIST_SIZE]; + uint32_t cpb_size_du_value_minus1[STD_VIDEO_H265_CPB_CNT_LIST_SIZE]; + uint32_t bit_rate_du_value_minus1[STD_VIDEO_H265_CPB_CNT_LIST_SIZE]; + uint32_t cbr_flag; +} StdVideoH265SubLayerHrdParameters; + +typedef struct StdVideoH265HrdFlags { + uint32_t nal_hrd_parameters_present_flag : 1; + uint32_t vcl_hrd_parameters_present_flag : 1; + uint32_t sub_pic_hrd_params_present_flag : 1; + uint32_t sub_pic_cpb_params_in_pic_timing_sei_flag : 1; + uint32_t fixed_pic_rate_general_flag : 8; + uint32_t fixed_pic_rate_within_cvs_flag : 8; + uint32_t low_delay_hrd_flag : 8; +} StdVideoH265HrdFlags; + +typedef struct StdVideoH265HrdParameters { + StdVideoH265HrdFlags flags; + uint8_t tick_divisor_minus2; + uint8_t du_cpb_removal_delay_increment_length_minus1; + uint8_t dpb_output_delay_du_length_minus1; + uint8_t bit_rate_scale; + uint8_t cpb_size_scale; + uint8_t cpb_size_du_scale; + uint8_t initial_cpb_removal_delay_length_minus1; + uint8_t au_cpb_removal_delay_length_minus1; + uint8_t dpb_output_delay_length_minus1; + uint8_t cpb_cnt_minus1[STD_VIDEO_H265_SUBLAYERS_LIST_SIZE]; + uint16_t elemental_duration_in_tc_minus1[STD_VIDEO_H265_SUBLAYERS_LIST_SIZE]; + uint16_t reserved[3]; + const StdVideoH265SubLayerHrdParameters* pSubLayerHrdParametersNal; + const StdVideoH265SubLayerHrdParameters* pSubLayerHrdParametersVcl; +} StdVideoH265HrdParameters; + +typedef struct StdVideoH265VpsFlags { + uint32_t vps_temporal_id_nesting_flag : 1; + uint32_t vps_sub_layer_ordering_info_present_flag : 1; + uint32_t vps_timing_info_present_flag : 1; + uint32_t vps_poc_proportional_to_timing_flag : 1; +} StdVideoH265VpsFlags; + +typedef struct StdVideoH265ProfileTierLevelFlags { + uint32_t general_tier_flag : 1; + uint32_t general_progressive_source_flag : 1; + uint32_t general_interlaced_source_flag : 1; + uint32_t general_non_packed_constraint_flag : 1; + uint32_t general_frame_only_constraint_flag : 1; +} StdVideoH265ProfileTierLevelFlags; + +typedef struct StdVideoH265ProfileTierLevel { + StdVideoH265ProfileTierLevelFlags flags; + StdVideoH265ProfileIdc general_profile_idc; + StdVideoH265LevelIdc general_level_idc; +} StdVideoH265ProfileTierLevel; + +typedef struct StdVideoH265VideoParameterSet { + StdVideoH265VpsFlags flags; + uint8_t vps_video_parameter_set_id; + uint8_t vps_max_sub_layers_minus1; + uint8_t reserved1; + uint8_t reserved2; + uint32_t vps_num_units_in_tick; + uint32_t vps_time_scale; + uint32_t vps_num_ticks_poc_diff_one_minus1; + uint32_t reserved3; + const StdVideoH265DecPicBufMgr* pDecPicBufMgr; + const StdVideoH265HrdParameters* pHrdParameters; + const StdVideoH265ProfileTierLevel* pProfileTierLevel; +} StdVideoH265VideoParameterSet; + +typedef struct StdVideoH265ScalingLists { + uint8_t ScalingList4x4[STD_VIDEO_H265_SCALING_LIST_4X4_NUM_LISTS][STD_VIDEO_H265_SCALING_LIST_4X4_NUM_ELEMENTS]; + uint8_t ScalingList8x8[STD_VIDEO_H265_SCALING_LIST_8X8_NUM_LISTS][STD_VIDEO_H265_SCALING_LIST_8X8_NUM_ELEMENTS]; + uint8_t ScalingList16x16[STD_VIDEO_H265_SCALING_LIST_16X16_NUM_LISTS][STD_VIDEO_H265_SCALING_LIST_16X16_NUM_ELEMENTS]; + uint8_t ScalingList32x32[STD_VIDEO_H265_SCALING_LIST_32X32_NUM_LISTS][STD_VIDEO_H265_SCALING_LIST_32X32_NUM_ELEMENTS]; + uint8_t ScalingListDCCoef16x16[STD_VIDEO_H265_SCALING_LIST_16X16_NUM_LISTS]; + uint8_t ScalingListDCCoef32x32[STD_VIDEO_H265_SCALING_LIST_32X32_NUM_LISTS]; +} StdVideoH265ScalingLists; + +typedef struct StdVideoH265SpsVuiFlags { + uint32_t aspect_ratio_info_present_flag : 1; + uint32_t overscan_info_present_flag : 1; + uint32_t overscan_appropriate_flag : 1; + uint32_t video_signal_type_present_flag : 1; + uint32_t video_full_range_flag : 1; + uint32_t colour_description_present_flag : 1; + uint32_t chroma_loc_info_present_flag : 1; + uint32_t neutral_chroma_indication_flag : 1; + uint32_t field_seq_flag : 1; + uint32_t frame_field_info_present_flag : 1; + uint32_t default_display_window_flag : 1; + uint32_t vui_timing_info_present_flag : 1; + uint32_t vui_poc_proportional_to_timing_flag : 1; + uint32_t vui_hrd_parameters_present_flag : 1; + uint32_t bitstream_restriction_flag : 1; + uint32_t tiles_fixed_structure_flag : 1; + uint32_t motion_vectors_over_pic_boundaries_flag : 1; + uint32_t restricted_ref_pic_lists_flag : 1; +} StdVideoH265SpsVuiFlags; + +typedef struct StdVideoH265SequenceParameterSetVui { + StdVideoH265SpsVuiFlags flags; + StdVideoH265AspectRatioIdc aspect_ratio_idc; + uint16_t sar_width; + uint16_t sar_height; + uint8_t video_format; + uint8_t colour_primaries; + uint8_t transfer_characteristics; + uint8_t matrix_coeffs; + uint8_t chroma_sample_loc_type_top_field; + uint8_t chroma_sample_loc_type_bottom_field; + uint8_t reserved1; + uint8_t reserved2; + uint16_t def_disp_win_left_offset; + uint16_t def_disp_win_right_offset; + uint16_t def_disp_win_top_offset; + uint16_t def_disp_win_bottom_offset; + uint32_t vui_num_units_in_tick; + uint32_t vui_time_scale; + uint32_t vui_num_ticks_poc_diff_one_minus1; + uint16_t min_spatial_segmentation_idc; + uint16_t reserved3; + uint8_t max_bytes_per_pic_denom; + uint8_t max_bits_per_min_cu_denom; + uint8_t log2_max_mv_length_horizontal; + uint8_t log2_max_mv_length_vertical; + const StdVideoH265HrdParameters* pHrdParameters; +} StdVideoH265SequenceParameterSetVui; + +typedef struct StdVideoH265PredictorPaletteEntries { + uint16_t PredictorPaletteEntries[STD_VIDEO_H265_PREDICTOR_PALETTE_COMPONENTS_LIST_SIZE][STD_VIDEO_H265_PREDICTOR_PALETTE_COMP_ENTRIES_LIST_SIZE]; +} StdVideoH265PredictorPaletteEntries; + +typedef struct StdVideoH265SpsFlags { + uint32_t sps_temporal_id_nesting_flag : 1; + uint32_t separate_colour_plane_flag : 1; + uint32_t conformance_window_flag : 1; + uint32_t sps_sub_layer_ordering_info_present_flag : 1; + uint32_t scaling_list_enabled_flag : 1; + uint32_t sps_scaling_list_data_present_flag : 1; + uint32_t amp_enabled_flag : 1; + uint32_t sample_adaptive_offset_enabled_flag : 1; + uint32_t pcm_enabled_flag : 1; + uint32_t pcm_loop_filter_disabled_flag : 1; + uint32_t long_term_ref_pics_present_flag : 1; + uint32_t sps_temporal_mvp_enabled_flag : 1; + uint32_t strong_intra_smoothing_enabled_flag : 1; + uint32_t vui_parameters_present_flag : 1; + uint32_t sps_extension_present_flag : 1; + uint32_t sps_range_extension_flag : 1; + uint32_t transform_skip_rotation_enabled_flag : 1; + uint32_t transform_skip_context_enabled_flag : 1; + uint32_t implicit_rdpcm_enabled_flag : 1; + uint32_t explicit_rdpcm_enabled_flag : 1; + uint32_t extended_precision_processing_flag : 1; + uint32_t intra_smoothing_disabled_flag : 1; + uint32_t high_precision_offsets_enabled_flag : 1; + uint32_t persistent_rice_adaptation_enabled_flag : 1; + uint32_t cabac_bypass_alignment_enabled_flag : 1; + uint32_t sps_scc_extension_flag : 1; + uint32_t sps_curr_pic_ref_enabled_flag : 1; + uint32_t palette_mode_enabled_flag : 1; + uint32_t sps_palette_predictor_initializers_present_flag : 1; + uint32_t intra_boundary_filtering_disabled_flag : 1; +} StdVideoH265SpsFlags; + +typedef struct StdVideoH265ShortTermRefPicSetFlags { + uint32_t inter_ref_pic_set_prediction_flag : 1; + uint32_t delta_rps_sign : 1; +} StdVideoH265ShortTermRefPicSetFlags; + +typedef struct StdVideoH265ShortTermRefPicSet { + StdVideoH265ShortTermRefPicSetFlags flags; + uint32_t delta_idx_minus1; + uint16_t use_delta_flag; + uint16_t abs_delta_rps_minus1; + uint16_t used_by_curr_pic_flag; + uint16_t used_by_curr_pic_s0_flag; + uint16_t used_by_curr_pic_s1_flag; + uint16_t reserved1; + uint8_t reserved2; + uint8_t reserved3; + uint8_t num_negative_pics; + uint8_t num_positive_pics; + uint16_t delta_poc_s0_minus1[STD_VIDEO_H265_MAX_DPB_SIZE]; + uint16_t delta_poc_s1_minus1[STD_VIDEO_H265_MAX_DPB_SIZE]; +} StdVideoH265ShortTermRefPicSet; + +typedef struct StdVideoH265LongTermRefPicsSps { + uint32_t used_by_curr_pic_lt_sps_flag; + uint32_t lt_ref_pic_poc_lsb_sps[STD_VIDEO_H265_MAX_LONG_TERM_REF_PICS_SPS]; +} StdVideoH265LongTermRefPicsSps; + +typedef struct StdVideoH265SequenceParameterSet { + StdVideoH265SpsFlags flags; + StdVideoH265ChromaFormatIdc chroma_format_idc; + uint32_t pic_width_in_luma_samples; + uint32_t pic_height_in_luma_samples; + uint8_t sps_video_parameter_set_id; + uint8_t sps_max_sub_layers_minus1; + uint8_t sps_seq_parameter_set_id; + uint8_t bit_depth_luma_minus8; + uint8_t bit_depth_chroma_minus8; + uint8_t log2_max_pic_order_cnt_lsb_minus4; + uint8_t log2_min_luma_coding_block_size_minus3; + uint8_t log2_diff_max_min_luma_coding_block_size; + uint8_t log2_min_luma_transform_block_size_minus2; + uint8_t log2_diff_max_min_luma_transform_block_size; + uint8_t max_transform_hierarchy_depth_inter; + uint8_t max_transform_hierarchy_depth_intra; + uint8_t num_short_term_ref_pic_sets; + uint8_t num_long_term_ref_pics_sps; + uint8_t pcm_sample_bit_depth_luma_minus1; + uint8_t pcm_sample_bit_depth_chroma_minus1; + uint8_t log2_min_pcm_luma_coding_block_size_minus3; + uint8_t log2_diff_max_min_pcm_luma_coding_block_size; + uint8_t reserved1; + uint8_t reserved2; + uint8_t palette_max_size; + uint8_t delta_palette_max_predictor_size; + uint8_t motion_vector_resolution_control_idc; + uint8_t sps_num_palette_predictor_initializers_minus1; + uint32_t conf_win_left_offset; + uint32_t conf_win_right_offset; + uint32_t conf_win_top_offset; + uint32_t conf_win_bottom_offset; + const StdVideoH265ProfileTierLevel* pProfileTierLevel; + const StdVideoH265DecPicBufMgr* pDecPicBufMgr; + const StdVideoH265ScalingLists* pScalingLists; + const StdVideoH265ShortTermRefPicSet* pShortTermRefPicSet; + const StdVideoH265LongTermRefPicsSps* pLongTermRefPicsSps; + const StdVideoH265SequenceParameterSetVui* pSequenceParameterSetVui; + const StdVideoH265PredictorPaletteEntries* pPredictorPaletteEntries; +} StdVideoH265SequenceParameterSet; + +typedef struct StdVideoH265PpsFlags { + uint32_t dependent_slice_segments_enabled_flag : 1; + uint32_t output_flag_present_flag : 1; + uint32_t sign_data_hiding_enabled_flag : 1; + uint32_t cabac_init_present_flag : 1; + uint32_t constrained_intra_pred_flag : 1; + uint32_t transform_skip_enabled_flag : 1; + uint32_t cu_qp_delta_enabled_flag : 1; + uint32_t pps_slice_chroma_qp_offsets_present_flag : 1; + uint32_t weighted_pred_flag : 1; + uint32_t weighted_bipred_flag : 1; + uint32_t transquant_bypass_enabled_flag : 1; + uint32_t tiles_enabled_flag : 1; + uint32_t entropy_coding_sync_enabled_flag : 1; + uint32_t uniform_spacing_flag : 1; + uint32_t loop_filter_across_tiles_enabled_flag : 1; + uint32_t pps_loop_filter_across_slices_enabled_flag : 1; + uint32_t deblocking_filter_control_present_flag : 1; + uint32_t deblocking_filter_override_enabled_flag : 1; + uint32_t pps_deblocking_filter_disabled_flag : 1; + uint32_t pps_scaling_list_data_present_flag : 1; + uint32_t lists_modification_present_flag : 1; + uint32_t slice_segment_header_extension_present_flag : 1; + uint32_t pps_extension_present_flag : 1; + uint32_t cross_component_prediction_enabled_flag : 1; + uint32_t chroma_qp_offset_list_enabled_flag : 1; + uint32_t pps_curr_pic_ref_enabled_flag : 1; + uint32_t residual_adaptive_colour_transform_enabled_flag : 1; + uint32_t pps_slice_act_qp_offsets_present_flag : 1; + uint32_t pps_palette_predictor_initializers_present_flag : 1; + uint32_t monochrome_palette_flag : 1; + uint32_t pps_range_extension_flag : 1; +} StdVideoH265PpsFlags; + +typedef struct StdVideoH265PictureParameterSet { + StdVideoH265PpsFlags flags; + uint8_t pps_pic_parameter_set_id; + uint8_t pps_seq_parameter_set_id; + uint8_t sps_video_parameter_set_id; + uint8_t num_extra_slice_header_bits; + uint8_t num_ref_idx_l0_default_active_minus1; + uint8_t num_ref_idx_l1_default_active_minus1; + int8_t init_qp_minus26; + uint8_t diff_cu_qp_delta_depth; + int8_t pps_cb_qp_offset; + int8_t pps_cr_qp_offset; + int8_t pps_beta_offset_div2; + int8_t pps_tc_offset_div2; + uint8_t log2_parallel_merge_level_minus2; + uint8_t log2_max_transform_skip_block_size_minus2; + uint8_t diff_cu_chroma_qp_offset_depth; + uint8_t chroma_qp_offset_list_len_minus1; + int8_t cb_qp_offset_list[STD_VIDEO_H265_CHROMA_QP_OFFSET_LIST_SIZE]; + int8_t cr_qp_offset_list[STD_VIDEO_H265_CHROMA_QP_OFFSET_LIST_SIZE]; + uint8_t log2_sao_offset_scale_luma; + uint8_t log2_sao_offset_scale_chroma; + int8_t pps_act_y_qp_offset_plus5; + int8_t pps_act_cb_qp_offset_plus5; + int8_t pps_act_cr_qp_offset_plus3; + uint8_t pps_num_palette_predictor_initializers; + uint8_t luma_bit_depth_entry_minus8; + uint8_t chroma_bit_depth_entry_minus8; + uint8_t num_tile_columns_minus1; + uint8_t num_tile_rows_minus1; + uint8_t reserved1; + uint8_t reserved2; + uint16_t column_width_minus1[STD_VIDEO_H265_CHROMA_QP_OFFSET_TILE_COLS_LIST_SIZE]; + uint16_t row_height_minus1[STD_VIDEO_H265_CHROMA_QP_OFFSET_TILE_ROWS_LIST_SIZE]; + uint32_t reserved3; + const StdVideoH265ScalingLists* pScalingLists; + const StdVideoH265PredictorPaletteEntries* pPredictorPaletteEntries; +} StdVideoH265PictureParameterSet; + + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/ext/vulkan/vk_video/vulkan_video_codec_h265std_decode.h b/ext/vulkan/vk_video/vulkan_video_codec_h265std_decode.h new file mode 100644 index 0000000000..d8660d12e9 --- /dev/null +++ b/ext/vulkan/vk_video/vulkan_video_codec_h265std_decode.h @@ -0,0 +1,65 @@ +#ifndef VULKAN_VIDEO_CODEC_H265STD_DECODE_H_ +#define VULKAN_VIDEO_CODEC_H265STD_DECODE_H_ 1 + +/* +** Copyright 2015-2022 The Khronos Group Inc. +** +** SPDX-License-Identifier: Apache-2.0 +*/ + +/* +** This header is generated from the Khronos Vulkan XML API Registry. +** +*/ + + +#ifdef __cplusplus +extern "C" { +#endif + + + +#define vulkan_video_codec_h265std_decode 1 + +#define VK_STD_VULKAN_VIDEO_CODEC_H265_DECODE_API_VERSION_1_0_0 VK_MAKE_VIDEO_STD_VERSION(1, 0, 0) + +#define STD_VIDEO_DECODE_H265_REF_PIC_SET_LIST_SIZE 8 +#define VK_STD_VULKAN_VIDEO_CODEC_H265_DECODE_SPEC_VERSION VK_STD_VULKAN_VIDEO_CODEC_H265_DECODE_API_VERSION_1_0_0 +#define VK_STD_VULKAN_VIDEO_CODEC_H265_DECODE_EXTENSION_NAME "VK_STD_vulkan_video_codec_h265_decode" +typedef struct StdVideoDecodeH265PictureInfoFlags { + uint32_t IrapPicFlag : 1; + uint32_t IdrPicFlag : 1; + uint32_t IsReference : 1; + uint32_t short_term_ref_pic_set_sps_flag : 1; +} StdVideoDecodeH265PictureInfoFlags; + +typedef struct StdVideoDecodeH265PictureInfo { + StdVideoDecodeH265PictureInfoFlags flags; + uint8_t sps_video_parameter_set_id; + uint8_t pps_seq_parameter_set_id; + uint8_t pps_pic_parameter_set_id; + uint8_t NumDeltaPocsOfRefRpsIdx; + int32_t PicOrderCntVal; + uint16_t NumBitsForSTRefPicSetInSlice; + uint16_t reserved; + uint8_t RefPicSetStCurrBefore[STD_VIDEO_DECODE_H265_REF_PIC_SET_LIST_SIZE]; + uint8_t RefPicSetStCurrAfter[STD_VIDEO_DECODE_H265_REF_PIC_SET_LIST_SIZE]; + uint8_t RefPicSetLtCurr[STD_VIDEO_DECODE_H265_REF_PIC_SET_LIST_SIZE]; +} StdVideoDecodeH265PictureInfo; + +typedef struct StdVideoDecodeH265ReferenceInfoFlags { + uint32_t used_for_long_term_reference : 1; + uint32_t unused_for_reference : 1; +} StdVideoDecodeH265ReferenceInfoFlags; + +typedef struct StdVideoDecodeH265ReferenceInfo { + StdVideoDecodeH265ReferenceInfoFlags flags; + int32_t PicOrderCntVal; +} StdVideoDecodeH265ReferenceInfo; + + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/ext/vulkan/vk_video/vulkan_video_codec_h265std_encode.h b/ext/vulkan/vk_video/vulkan_video_codec_h265std_encode.h new file mode 100644 index 0000000000..5a419b14be --- /dev/null +++ b/ext/vulkan/vk_video/vulkan_video_codec_h265std_encode.h @@ -0,0 +1,146 @@ +#ifndef VULKAN_VIDEO_CODEC_H265STD_ENCODE_H_ +#define VULKAN_VIDEO_CODEC_H265STD_ENCODE_H_ 1 + +/* +** Copyright 2015-2022 The Khronos Group Inc. +** +** SPDX-License-Identifier: Apache-2.0 +*/ + +/* +** This header is generated from the Khronos Vulkan XML API Registry. +** +*/ + + +#ifdef __cplusplus +extern "C" { +#endif + + + +#define vulkan_video_codec_h265std_encode 1 +// Vulkan 0.9 provisional Vulkan video H.265 encode std specification version number +#define VK_STD_VULKAN_VIDEO_CODEC_H265_ENCODE_API_VERSION_0_9_9 VK_MAKE_VIDEO_STD_VERSION(0, 9, 9) + +#define VK_STD_VULKAN_VIDEO_CODEC_H265_ENCODE_SPEC_VERSION VK_STD_VULKAN_VIDEO_CODEC_H265_ENCODE_API_VERSION_0_9_9 +#define VK_STD_VULKAN_VIDEO_CODEC_H265_ENCODE_EXTENSION_NAME "VK_STD_vulkan_video_codec_h265_encode" +typedef struct StdVideoEncodeH265WeightTableFlags { + uint16_t luma_weight_l0_flag; + uint16_t chroma_weight_l0_flag; + uint16_t luma_weight_l1_flag; + uint16_t chroma_weight_l1_flag; +} StdVideoEncodeH265WeightTableFlags; + +typedef struct StdVideoEncodeH265WeightTable { + StdVideoEncodeH265WeightTableFlags flags; + uint8_t luma_log2_weight_denom; + int8_t delta_chroma_log2_weight_denom; + int8_t delta_luma_weight_l0[STD_VIDEO_H265_MAX_NUM_LIST_REF]; + int8_t luma_offset_l0[STD_VIDEO_H265_MAX_NUM_LIST_REF]; + int8_t delta_chroma_weight_l0[STD_VIDEO_H265_MAX_NUM_LIST_REF][STD_VIDEO_H265_MAX_CHROMA_PLANES]; + int8_t delta_chroma_offset_l0[STD_VIDEO_H265_MAX_NUM_LIST_REF][STD_VIDEO_H265_MAX_CHROMA_PLANES]; + int8_t delta_luma_weight_l1[STD_VIDEO_H265_MAX_NUM_LIST_REF]; + int8_t luma_offset_l1[STD_VIDEO_H265_MAX_NUM_LIST_REF]; + int8_t delta_chroma_weight_l1[STD_VIDEO_H265_MAX_NUM_LIST_REF][STD_VIDEO_H265_MAX_CHROMA_PLANES]; + int8_t delta_chroma_offset_l1[STD_VIDEO_H265_MAX_NUM_LIST_REF][STD_VIDEO_H265_MAX_CHROMA_PLANES]; +} StdVideoEncodeH265WeightTable; + +typedef struct StdVideoEncodeH265SliceSegmentHeaderFlags { + uint32_t first_slice_segment_in_pic_flag : 1; + uint32_t no_output_of_prior_pics_flag : 1; + uint32_t dependent_slice_segment_flag : 1; + uint32_t pic_output_flag : 1; + uint32_t short_term_ref_pic_set_sps_flag : 1; + uint32_t slice_temporal_mvp_enable_flag : 1; + uint32_t slice_sao_luma_flag : 1; + uint32_t slice_sao_chroma_flag : 1; + uint32_t num_ref_idx_active_override_flag : 1; + uint32_t mvd_l1_zero_flag : 1; + uint32_t cabac_init_flag : 1; + uint32_t cu_chroma_qp_offset_enabled_flag : 1; + uint32_t deblocking_filter_override_flag : 1; + uint32_t slice_deblocking_filter_disabled_flag : 1; + uint32_t collocated_from_l0_flag : 1; + uint32_t slice_loop_filter_across_slices_enabled_flag : 1; +} StdVideoEncodeH265SliceSegmentHeaderFlags; + +typedef struct StdVideoEncodeH265SliceSegmentLongTermRefPics { + uint8_t num_long_term_sps; + uint8_t num_long_term_pics; + uint8_t lt_idx_sps[STD_VIDEO_H265_MAX_LONG_TERM_REF_PICS_SPS]; + uint8_t poc_lsb_lt[STD_VIDEO_H265_MAX_LONG_TERM_PICS]; + uint16_t used_by_curr_pic_lt_flag; + uint8_t delta_poc_msb_present_flag[STD_VIDEO_H265_MAX_DELTA_POC]; + uint8_t delta_poc_msb_cycle_lt[STD_VIDEO_H265_MAX_DELTA_POC]; +} StdVideoEncodeH265SliceSegmentLongTermRefPics; + +typedef struct StdVideoEncodeH265SliceSegmentHeader { + StdVideoEncodeH265SliceSegmentHeaderFlags flags; + StdVideoH265SliceType slice_type; + uint32_t slice_segment_address; + uint8_t short_term_ref_pic_set_idx; + uint8_t collocated_ref_idx; + uint8_t num_ref_idx_l0_active_minus1; + uint8_t num_ref_idx_l1_active_minus1; + uint8_t MaxNumMergeCand; + int8_t slice_cb_qp_offset; + int8_t slice_cr_qp_offset; + int8_t slice_beta_offset_div2; + int8_t slice_tc_offset_div2; + int8_t slice_act_y_qp_offset; + int8_t slice_act_cb_qp_offset; + int8_t slice_act_cr_qp_offset; + const StdVideoH265ShortTermRefPicSet* pShortTermRefPicSet; + const StdVideoEncodeH265SliceSegmentLongTermRefPics* pLongTermRefPics; + const StdVideoEncodeH265WeightTable* pWeightTable; +} StdVideoEncodeH265SliceSegmentHeader; + +typedef struct StdVideoEncodeH265ReferenceModificationFlags { + uint32_t ref_pic_list_modification_flag_l0 : 1; + uint32_t ref_pic_list_modification_flag_l1 : 1; +} StdVideoEncodeH265ReferenceModificationFlags; + +typedef struct StdVideoEncodeH265ReferenceModifications { + StdVideoEncodeH265ReferenceModificationFlags flags; + uint8_t referenceList0ModificationsCount; + const uint8_t* pReferenceList0Modifications; + uint8_t referenceList1ModificationsCount; + const uint8_t* pReferenceList1Modifications; +} StdVideoEncodeH265ReferenceModifications; + +typedef struct StdVideoEncodeH265PictureInfoFlags { + uint32_t is_reference_flag : 1; + uint32_t IrapPicFlag : 1; + uint32_t long_term_flag : 1; + uint32_t discardable_flag : 1; + uint32_t cross_layer_bla_flag : 1; +} StdVideoEncodeH265PictureInfoFlags; + +typedef struct StdVideoEncodeH265PictureInfo { + StdVideoEncodeH265PictureInfoFlags flags; + StdVideoH265PictureType PictureType; + uint8_t sps_video_parameter_set_id; + uint8_t pps_seq_parameter_set_id; + uint8_t pps_pic_parameter_set_id; + int32_t PicOrderCntVal; + uint8_t TemporalId; +} StdVideoEncodeH265PictureInfo; + +typedef struct StdVideoEncodeH265ReferenceInfoFlags { + uint32_t used_for_long_term_reference : 1; + uint32_t unused_for_reference : 1; +} StdVideoEncodeH265ReferenceInfoFlags; + +typedef struct StdVideoEncodeH265ReferenceInfo { + StdVideoEncodeH265ReferenceInfoFlags flags; + int32_t PicOrderCntVal; + uint8_t TemporalId; +} StdVideoEncodeH265ReferenceInfo; + + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/ext/vulkan/vk_video/vulkan_video_codecs_common.h b/ext/vulkan/vk_video/vulkan_video_codecs_common.h new file mode 100644 index 0000000000..1e498265e1 --- /dev/null +++ b/ext/vulkan/vk_video/vulkan_video_codecs_common.h @@ -0,0 +1,31 @@ +#ifndef VULKAN_VIDEO_CODECS_COMMON_H_ +#define VULKAN_VIDEO_CODECS_COMMON_H_ 1 + +/* +** Copyright 2015-2022 The Khronos Group Inc. +** +** SPDX-License-Identifier: Apache-2.0 +*/ + +/* +** This header is generated from the Khronos Vulkan XML API Registry. +** +*/ + + +#ifdef __cplusplus +extern "C" { +#endif + + + +#define vulkan_video_codecs_common 1 +#define VK_MAKE_VIDEO_STD_VERSION(major, minor, patch) \ + ((((uint32_t)(major)) << 22) | (((uint32_t)(minor)) << 12) | ((uint32_t)(patch))) + + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/ext/vulkan/vulkan_beta.h b/ext/vulkan/vulkan_beta.h index b6c8e9994c..cfeda0eb36 100644 --- a/ext/vulkan/vulkan_beta.h +++ b/ext/vulkan/vulkan_beta.h @@ -19,356 +19,6 @@ extern "C" { -#define VK_KHR_video_queue 1 -VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkVideoSessionKHR) -VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkVideoSessionParametersKHR) -#define VK_KHR_VIDEO_QUEUE_SPEC_VERSION 7 -#define VK_KHR_VIDEO_QUEUE_EXTENSION_NAME "VK_KHR_video_queue" - -typedef enum VkQueryResultStatusKHR { - VK_QUERY_RESULT_STATUS_ERROR_KHR = -1, - VK_QUERY_RESULT_STATUS_NOT_READY_KHR = 0, - VK_QUERY_RESULT_STATUS_COMPLETE_KHR = 1, - VK_QUERY_RESULT_STATUS_MAX_ENUM_KHR = 0x7FFFFFFF -} VkQueryResultStatusKHR; - -typedef enum VkVideoCodecOperationFlagBitsKHR { - VK_VIDEO_CODEC_OPERATION_NONE_KHR = 0, -#ifdef VK_ENABLE_BETA_EXTENSIONS - VK_VIDEO_CODEC_OPERATION_ENCODE_H264_BIT_EXT = 0x00010000, -#endif -#ifdef VK_ENABLE_BETA_EXTENSIONS - VK_VIDEO_CODEC_OPERATION_ENCODE_H265_BIT_EXT = 0x00020000, -#endif -#ifdef VK_ENABLE_BETA_EXTENSIONS - VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_EXT = 0x00000001, -#endif -#ifdef VK_ENABLE_BETA_EXTENSIONS - VK_VIDEO_CODEC_OPERATION_DECODE_H265_BIT_EXT = 0x00000002, -#endif - VK_VIDEO_CODEC_OPERATION_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF -} VkVideoCodecOperationFlagBitsKHR; -typedef VkFlags VkVideoCodecOperationFlagsKHR; - -typedef enum VkVideoChromaSubsamplingFlagBitsKHR { - VK_VIDEO_CHROMA_SUBSAMPLING_INVALID_KHR = 0, - VK_VIDEO_CHROMA_SUBSAMPLING_MONOCHROME_BIT_KHR = 0x00000001, - VK_VIDEO_CHROMA_SUBSAMPLING_420_BIT_KHR = 0x00000002, - VK_VIDEO_CHROMA_SUBSAMPLING_422_BIT_KHR = 0x00000004, - VK_VIDEO_CHROMA_SUBSAMPLING_444_BIT_KHR = 0x00000008, - VK_VIDEO_CHROMA_SUBSAMPLING_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF -} VkVideoChromaSubsamplingFlagBitsKHR; -typedef VkFlags VkVideoChromaSubsamplingFlagsKHR; - -typedef enum VkVideoComponentBitDepthFlagBitsKHR { - VK_VIDEO_COMPONENT_BIT_DEPTH_INVALID_KHR = 0, - VK_VIDEO_COMPONENT_BIT_DEPTH_8_BIT_KHR = 0x00000001, - VK_VIDEO_COMPONENT_BIT_DEPTH_10_BIT_KHR = 0x00000004, - VK_VIDEO_COMPONENT_BIT_DEPTH_12_BIT_KHR = 0x00000010, - VK_VIDEO_COMPONENT_BIT_DEPTH_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF -} VkVideoComponentBitDepthFlagBitsKHR; -typedef VkFlags VkVideoComponentBitDepthFlagsKHR; - -typedef enum VkVideoCapabilityFlagBitsKHR { - VK_VIDEO_CAPABILITY_PROTECTED_CONTENT_BIT_KHR = 0x00000001, - VK_VIDEO_CAPABILITY_SEPARATE_REFERENCE_IMAGES_BIT_KHR = 0x00000002, - VK_VIDEO_CAPABILITY_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF -} VkVideoCapabilityFlagBitsKHR; -typedef VkFlags VkVideoCapabilityFlagsKHR; - -typedef enum VkVideoSessionCreateFlagBitsKHR { - VK_VIDEO_SESSION_CREATE_PROTECTED_CONTENT_BIT_KHR = 0x00000001, - VK_VIDEO_SESSION_CREATE_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF -} VkVideoSessionCreateFlagBitsKHR; -typedef VkFlags VkVideoSessionCreateFlagsKHR; -typedef VkFlags VkVideoSessionParametersCreateFlagsKHR; -typedef VkFlags VkVideoBeginCodingFlagsKHR; -typedef VkFlags VkVideoEndCodingFlagsKHR; - -typedef enum VkVideoCodingControlFlagBitsKHR { - VK_VIDEO_CODING_CONTROL_RESET_BIT_KHR = 0x00000001, -#ifdef VK_ENABLE_BETA_EXTENSIONS - VK_VIDEO_CODING_CONTROL_ENCODE_RATE_CONTROL_BIT_KHR = 0x00000002, -#endif -#ifdef VK_ENABLE_BETA_EXTENSIONS - VK_VIDEO_CODING_CONTROL_ENCODE_RATE_CONTROL_LAYER_BIT_KHR = 0x00000004, -#endif - VK_VIDEO_CODING_CONTROL_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF -} VkVideoCodingControlFlagBitsKHR; -typedef VkFlags VkVideoCodingControlFlagsKHR; -typedef struct VkQueueFamilyQueryResultStatusPropertiesKHR { - VkStructureType sType; - void* pNext; - VkBool32 queryResultStatusSupport; -} VkQueueFamilyQueryResultStatusPropertiesKHR; - -typedef struct VkQueueFamilyVideoPropertiesKHR { - VkStructureType sType; - void* pNext; - VkVideoCodecOperationFlagsKHR videoCodecOperations; -} VkQueueFamilyVideoPropertiesKHR; - -typedef struct VkVideoProfileInfoKHR { - VkStructureType sType; - const void* pNext; - VkVideoCodecOperationFlagBitsKHR videoCodecOperation; - VkVideoChromaSubsamplingFlagsKHR chromaSubsampling; - VkVideoComponentBitDepthFlagsKHR lumaBitDepth; - VkVideoComponentBitDepthFlagsKHR chromaBitDepth; -} VkVideoProfileInfoKHR; - -typedef struct VkVideoProfileListInfoKHR { - VkStructureType sType; - const void* pNext; - uint32_t profileCount; - const VkVideoProfileInfoKHR* pProfiles; -} VkVideoProfileListInfoKHR; - -typedef struct VkVideoCapabilitiesKHR { - VkStructureType sType; - void* pNext; - VkVideoCapabilityFlagsKHR flags; - VkDeviceSize minBitstreamBufferOffsetAlignment; - VkDeviceSize minBitstreamBufferSizeAlignment; - VkExtent2D pictureAccessGranularity; - VkExtent2D minCodedExtent; - VkExtent2D maxCodedExtent; - uint32_t maxDpbSlots; - uint32_t maxActiveReferencePictures; - VkExtensionProperties stdHeaderVersion; -} VkVideoCapabilitiesKHR; - -typedef struct VkPhysicalDeviceVideoFormatInfoKHR { - VkStructureType sType; - const void* pNext; - VkImageUsageFlags imageUsage; -} VkPhysicalDeviceVideoFormatInfoKHR; - -typedef struct VkVideoFormatPropertiesKHR { - VkStructureType sType; - void* pNext; - VkFormat format; - VkComponentMapping componentMapping; - VkImageCreateFlags imageCreateFlags; - VkImageType imageType; - VkImageTiling imageTiling; - VkImageUsageFlags imageUsageFlags; -} VkVideoFormatPropertiesKHR; - -typedef struct VkVideoPictureResourceInfoKHR { - VkStructureType sType; - const void* pNext; - VkOffset2D codedOffset; - VkExtent2D codedExtent; - uint32_t baseArrayLayer; - VkImageView imageViewBinding; -} VkVideoPictureResourceInfoKHR; - -typedef struct VkVideoReferenceSlotInfoKHR { - VkStructureType sType; - const void* pNext; - int32_t slotIndex; - const VkVideoPictureResourceInfoKHR* pPictureResource; -} VkVideoReferenceSlotInfoKHR; - -typedef struct VkVideoSessionMemoryRequirementsKHR { - VkStructureType sType; - void* pNext; - uint32_t memoryBindIndex; - VkMemoryRequirements memoryRequirements; -} VkVideoSessionMemoryRequirementsKHR; - -typedef struct VkBindVideoSessionMemoryInfoKHR { - VkStructureType sType; - const void* pNext; - uint32_t memoryBindIndex; - VkDeviceMemory memory; - VkDeviceSize memoryOffset; - VkDeviceSize memorySize; -} VkBindVideoSessionMemoryInfoKHR; - -typedef struct VkVideoSessionCreateInfoKHR { - VkStructureType sType; - const void* pNext; - uint32_t queueFamilyIndex; - VkVideoSessionCreateFlagsKHR flags; - const VkVideoProfileInfoKHR* pVideoProfile; - VkFormat pictureFormat; - VkExtent2D maxCodedExtent; - VkFormat referencePictureFormat; - uint32_t maxDpbSlots; - uint32_t maxActiveReferencePictures; - const VkExtensionProperties* pStdHeaderVersion; -} VkVideoSessionCreateInfoKHR; - -typedef struct VkVideoSessionParametersCreateInfoKHR { - VkStructureType sType; - const void* pNext; - VkVideoSessionParametersCreateFlagsKHR flags; - VkVideoSessionParametersKHR videoSessionParametersTemplate; - VkVideoSessionKHR videoSession; -} VkVideoSessionParametersCreateInfoKHR; - -typedef struct VkVideoSessionParametersUpdateInfoKHR { - VkStructureType sType; - const void* pNext; - uint32_t updateSequenceCount; -} VkVideoSessionParametersUpdateInfoKHR; - -typedef struct VkVideoBeginCodingInfoKHR { - VkStructureType sType; - const void* pNext; - VkVideoBeginCodingFlagsKHR flags; - VkVideoSessionKHR videoSession; - VkVideoSessionParametersKHR videoSessionParameters; - uint32_t referenceSlotCount; - const VkVideoReferenceSlotInfoKHR* pReferenceSlots; -} VkVideoBeginCodingInfoKHR; - -typedef struct VkVideoEndCodingInfoKHR { - VkStructureType sType; - const void* pNext; - VkVideoEndCodingFlagsKHR flags; -} VkVideoEndCodingInfoKHR; - -typedef struct VkVideoCodingControlInfoKHR { - VkStructureType sType; - const void* pNext; - VkVideoCodingControlFlagsKHR flags; -} VkVideoCodingControlInfoKHR; - -typedef VkResult (VKAPI_PTR *PFN_vkGetPhysicalDeviceVideoCapabilitiesKHR)(VkPhysicalDevice physicalDevice, const VkVideoProfileInfoKHR* pVideoProfile, VkVideoCapabilitiesKHR* pCapabilities); -typedef VkResult (VKAPI_PTR *PFN_vkGetPhysicalDeviceVideoFormatPropertiesKHR)(VkPhysicalDevice physicalDevice, const VkPhysicalDeviceVideoFormatInfoKHR* pVideoFormatInfo, uint32_t* pVideoFormatPropertyCount, VkVideoFormatPropertiesKHR* pVideoFormatProperties); -typedef VkResult (VKAPI_PTR *PFN_vkCreateVideoSessionKHR)(VkDevice device, const VkVideoSessionCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkVideoSessionKHR* pVideoSession); -typedef void (VKAPI_PTR *PFN_vkDestroyVideoSessionKHR)(VkDevice device, VkVideoSessionKHR videoSession, const VkAllocationCallbacks* pAllocator); -typedef VkResult (VKAPI_PTR *PFN_vkGetVideoSessionMemoryRequirementsKHR)(VkDevice device, VkVideoSessionKHR videoSession, uint32_t* pMemoryRequirementsCount, VkVideoSessionMemoryRequirementsKHR* pMemoryRequirements); -typedef VkResult (VKAPI_PTR *PFN_vkBindVideoSessionMemoryKHR)(VkDevice device, VkVideoSessionKHR videoSession, uint32_t bindSessionMemoryInfoCount, const VkBindVideoSessionMemoryInfoKHR* pBindSessionMemoryInfos); -typedef VkResult (VKAPI_PTR *PFN_vkCreateVideoSessionParametersKHR)(VkDevice device, const VkVideoSessionParametersCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkVideoSessionParametersKHR* pVideoSessionParameters); -typedef VkResult (VKAPI_PTR *PFN_vkUpdateVideoSessionParametersKHR)(VkDevice device, VkVideoSessionParametersKHR videoSessionParameters, const VkVideoSessionParametersUpdateInfoKHR* pUpdateInfo); -typedef void (VKAPI_PTR *PFN_vkDestroyVideoSessionParametersKHR)(VkDevice device, VkVideoSessionParametersKHR videoSessionParameters, const VkAllocationCallbacks* pAllocator); -typedef void (VKAPI_PTR *PFN_vkCmdBeginVideoCodingKHR)(VkCommandBuffer commandBuffer, const VkVideoBeginCodingInfoKHR* pBeginInfo); -typedef void (VKAPI_PTR *PFN_vkCmdEndVideoCodingKHR)(VkCommandBuffer commandBuffer, const VkVideoEndCodingInfoKHR* pEndCodingInfo); -typedef void (VKAPI_PTR *PFN_vkCmdControlVideoCodingKHR)(VkCommandBuffer commandBuffer, const VkVideoCodingControlInfoKHR* pCodingControlInfo); - -#ifndef VK_NO_PROTOTYPES -VKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceVideoCapabilitiesKHR( - VkPhysicalDevice physicalDevice, - const VkVideoProfileInfoKHR* pVideoProfile, - VkVideoCapabilitiesKHR* pCapabilities); - -VKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceVideoFormatPropertiesKHR( - VkPhysicalDevice physicalDevice, - const VkPhysicalDeviceVideoFormatInfoKHR* pVideoFormatInfo, - uint32_t* pVideoFormatPropertyCount, - VkVideoFormatPropertiesKHR* pVideoFormatProperties); - -VKAPI_ATTR VkResult VKAPI_CALL vkCreateVideoSessionKHR( - VkDevice device, - const VkVideoSessionCreateInfoKHR* pCreateInfo, - const VkAllocationCallbacks* pAllocator, - VkVideoSessionKHR* pVideoSession); - -VKAPI_ATTR void VKAPI_CALL vkDestroyVideoSessionKHR( - VkDevice device, - VkVideoSessionKHR videoSession, - const VkAllocationCallbacks* pAllocator); - -VKAPI_ATTR VkResult VKAPI_CALL vkGetVideoSessionMemoryRequirementsKHR( - VkDevice device, - VkVideoSessionKHR videoSession, - uint32_t* pMemoryRequirementsCount, - VkVideoSessionMemoryRequirementsKHR* pMemoryRequirements); - -VKAPI_ATTR VkResult VKAPI_CALL vkBindVideoSessionMemoryKHR( - VkDevice device, - VkVideoSessionKHR videoSession, - uint32_t bindSessionMemoryInfoCount, - const VkBindVideoSessionMemoryInfoKHR* pBindSessionMemoryInfos); - -VKAPI_ATTR VkResult VKAPI_CALL vkCreateVideoSessionParametersKHR( - VkDevice device, - const VkVideoSessionParametersCreateInfoKHR* pCreateInfo, - const VkAllocationCallbacks* pAllocator, - VkVideoSessionParametersKHR* pVideoSessionParameters); - -VKAPI_ATTR VkResult VKAPI_CALL vkUpdateVideoSessionParametersKHR( - VkDevice device, - VkVideoSessionParametersKHR videoSessionParameters, - const VkVideoSessionParametersUpdateInfoKHR* pUpdateInfo); - -VKAPI_ATTR void VKAPI_CALL vkDestroyVideoSessionParametersKHR( - VkDevice device, - VkVideoSessionParametersKHR videoSessionParameters, - const VkAllocationCallbacks* pAllocator); - -VKAPI_ATTR void VKAPI_CALL vkCmdBeginVideoCodingKHR( - VkCommandBuffer commandBuffer, - const VkVideoBeginCodingInfoKHR* pBeginInfo); - -VKAPI_ATTR void VKAPI_CALL vkCmdEndVideoCodingKHR( - VkCommandBuffer commandBuffer, - const VkVideoEndCodingInfoKHR* pEndCodingInfo); - -VKAPI_ATTR void VKAPI_CALL vkCmdControlVideoCodingKHR( - VkCommandBuffer commandBuffer, - const VkVideoCodingControlInfoKHR* pCodingControlInfo); -#endif - - -#define VK_KHR_video_decode_queue 1 -#define VK_KHR_VIDEO_DECODE_QUEUE_SPEC_VERSION 6 -#define VK_KHR_VIDEO_DECODE_QUEUE_EXTENSION_NAME "VK_KHR_video_decode_queue" - -typedef enum VkVideoDecodeCapabilityFlagBitsKHR { - VK_VIDEO_DECODE_CAPABILITY_DPB_AND_OUTPUT_COINCIDE_BIT_KHR = 0x00000001, - VK_VIDEO_DECODE_CAPABILITY_DPB_AND_OUTPUT_DISTINCT_BIT_KHR = 0x00000002, - VK_VIDEO_DECODE_CAPABILITY_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF -} VkVideoDecodeCapabilityFlagBitsKHR; -typedef VkFlags VkVideoDecodeCapabilityFlagsKHR; - -typedef enum VkVideoDecodeUsageFlagBitsKHR { - VK_VIDEO_DECODE_USAGE_DEFAULT_KHR = 0, - VK_VIDEO_DECODE_USAGE_TRANSCODING_BIT_KHR = 0x00000001, - VK_VIDEO_DECODE_USAGE_OFFLINE_BIT_KHR = 0x00000002, - VK_VIDEO_DECODE_USAGE_STREAMING_BIT_KHR = 0x00000004, - VK_VIDEO_DECODE_USAGE_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF -} VkVideoDecodeUsageFlagBitsKHR; -typedef VkFlags VkVideoDecodeUsageFlagsKHR; -typedef VkFlags VkVideoDecodeFlagsKHR; -typedef struct VkVideoDecodeCapabilitiesKHR { - VkStructureType sType; - void* pNext; - VkVideoDecodeCapabilityFlagsKHR flags; -} VkVideoDecodeCapabilitiesKHR; - -typedef struct VkVideoDecodeUsageInfoKHR { - VkStructureType sType; - const void* pNext; - VkVideoDecodeUsageFlagsKHR videoUsageHints; -} VkVideoDecodeUsageInfoKHR; - -typedef struct VkVideoDecodeInfoKHR { - VkStructureType sType; - const void* pNext; - VkVideoDecodeFlagsKHR flags; - VkBuffer srcBuffer; - VkDeviceSize srcBufferOffset; - VkDeviceSize srcBufferRange; - VkVideoPictureResourceInfoKHR dstPictureResource; - const VkVideoReferenceSlotInfoKHR* pSetupReferenceSlot; - uint32_t referenceSlotCount; - const VkVideoReferenceSlotInfoKHR* pReferenceSlots; -} VkVideoDecodeInfoKHR; - -typedef void (VKAPI_PTR *PFN_vkCmdDecodeVideoKHR)(VkCommandBuffer commandBuffer, const VkVideoDecodeInfoKHR* pDecodeInfo); - -#ifndef VK_NO_PROTOTYPES -VKAPI_ATTR void VKAPI_CALL vkCmdDecodeVideoKHR( - VkCommandBuffer commandBuffer, - const VkVideoDecodeInfoKHR* pDecodeInfo); -#endif - - #define VK_KHR_portability_subset 1 #define VK_KHR_PORTABILITY_SUBSET_SPEC_VERSION 1 #define VK_KHR_PORTABILITY_SUBSET_EXTENSION_NAME "VK_KHR_portability_subset" @@ -896,117 +546,6 @@ typedef struct VkVideoEncodeH265RateControlLayerInfoEXT { } VkVideoEncodeH265RateControlLayerInfoEXT; - -#define VK_EXT_video_decode_h264 1 -#include "vk_video/vulkan_video_codec_h264std_decode.h" -#define VK_EXT_VIDEO_DECODE_H264_SPEC_VERSION 7 -#define VK_EXT_VIDEO_DECODE_H264_EXTENSION_NAME "VK_EXT_video_decode_h264" - -typedef enum VkVideoDecodeH264PictureLayoutFlagBitsEXT { - VK_VIDEO_DECODE_H264_PICTURE_LAYOUT_PROGRESSIVE_EXT = 0, - VK_VIDEO_DECODE_H264_PICTURE_LAYOUT_INTERLACED_INTERLEAVED_LINES_BIT_EXT = 0x00000001, - VK_VIDEO_DECODE_H264_PICTURE_LAYOUT_INTERLACED_SEPARATE_PLANES_BIT_EXT = 0x00000002, - VK_VIDEO_DECODE_H264_PICTURE_LAYOUT_FLAG_BITS_MAX_ENUM_EXT = 0x7FFFFFFF -} VkVideoDecodeH264PictureLayoutFlagBitsEXT; -typedef VkFlags VkVideoDecodeH264PictureLayoutFlagsEXT; -typedef struct VkVideoDecodeH264ProfileInfoEXT { - VkStructureType sType; - const void* pNext; - StdVideoH264ProfileIdc stdProfileIdc; - VkVideoDecodeH264PictureLayoutFlagBitsEXT pictureLayout; -} VkVideoDecodeH264ProfileInfoEXT; - -typedef struct VkVideoDecodeH264CapabilitiesEXT { - VkStructureType sType; - void* pNext; - StdVideoH264LevelIdc maxLevelIdc; - VkOffset2D fieldOffsetGranularity; -} VkVideoDecodeH264CapabilitiesEXT; - -typedef struct VkVideoDecodeH264SessionParametersAddInfoEXT { - VkStructureType sType; - const void* pNext; - uint32_t stdSPSCount; - const StdVideoH264SequenceParameterSet* pStdSPSs; - uint32_t stdPPSCount; - const StdVideoH264PictureParameterSet* pStdPPSs; -} VkVideoDecodeH264SessionParametersAddInfoEXT; - -typedef struct VkVideoDecodeH264SessionParametersCreateInfoEXT { - VkStructureType sType; - const void* pNext; - uint32_t maxStdSPSCount; - uint32_t maxStdPPSCount; - const VkVideoDecodeH264SessionParametersAddInfoEXT* pParametersAddInfo; -} VkVideoDecodeH264SessionParametersCreateInfoEXT; - -typedef struct VkVideoDecodeH264PictureInfoEXT { - VkStructureType sType; - const void* pNext; - const StdVideoDecodeH264PictureInfo* pStdPictureInfo; - uint32_t sliceCount; - const uint32_t* pSliceOffsets; -} VkVideoDecodeH264PictureInfoEXT; - -typedef struct VkVideoDecodeH264DpbSlotInfoEXT { - VkStructureType sType; - const void* pNext; - const StdVideoDecodeH264ReferenceInfo* pStdReferenceInfo; -} VkVideoDecodeH264DpbSlotInfoEXT; - - - -#define VK_EXT_video_decode_h265 1 -#include "vk_video/vulkan_video_codec_h265std_decode.h" -#define VK_EXT_VIDEO_DECODE_H265_SPEC_VERSION 6 -#define VK_EXT_VIDEO_DECODE_H265_EXTENSION_NAME "VK_EXT_video_decode_h265" -typedef struct VkVideoDecodeH265ProfileInfoEXT { - VkStructureType sType; - const void* pNext; - StdVideoH265ProfileIdc stdProfileIdc; -} VkVideoDecodeH265ProfileInfoEXT; - -typedef struct VkVideoDecodeH265CapabilitiesEXT { - VkStructureType sType; - void* pNext; - StdVideoH265LevelIdc maxLevelIdc; -} VkVideoDecodeH265CapabilitiesEXT; - -typedef struct VkVideoDecodeH265SessionParametersAddInfoEXT { - VkStructureType sType; - const void* pNext; - uint32_t stdVPSCount; - const StdVideoH265VideoParameterSet* pStdVPSs; - uint32_t stdSPSCount; - const StdVideoH265SequenceParameterSet* pStdSPSs; - uint32_t stdPPSCount; - const StdVideoH265PictureParameterSet* pStdPPSs; -} VkVideoDecodeH265SessionParametersAddInfoEXT; - -typedef struct VkVideoDecodeH265SessionParametersCreateInfoEXT { - VkStructureType sType; - const void* pNext; - uint32_t maxStdVPSCount; - uint32_t maxStdSPSCount; - uint32_t maxStdPPSCount; - const VkVideoDecodeH265SessionParametersAddInfoEXT* pParametersAddInfo; -} VkVideoDecodeH265SessionParametersCreateInfoEXT; - -typedef struct VkVideoDecodeH265PictureInfoEXT { - VkStructureType sType; - const void* pNext; - StdVideoDecodeH265PictureInfo* pStdPictureInfo; - uint32_t sliceSegmentCount; - const uint32_t* pSliceSegmentOffsets; -} VkVideoDecodeH265PictureInfoEXT; - -typedef struct VkVideoDecodeH265DpbSlotInfoEXT { - VkStructureType sType; - const void* pNext; - const StdVideoDecodeH265ReferenceInfo* pStdReferenceInfo; -} VkVideoDecodeH265DpbSlotInfoEXT; - - #ifdef __cplusplus } #endif diff --git a/ext/vulkan/vulkan_core.h b/ext/vulkan/vulkan_core.h index fa7b8c971c..4c73571efd 100644 --- a/ext/vulkan/vulkan_core.h +++ b/ext/vulkan/vulkan_core.h @@ -72,7 +72,7 @@ extern "C" { #define VK_API_VERSION_1_0 VK_MAKE_API_VERSION(0, 1, 0, 0)// Patch version should always be set to 0 // Version of this file -#define VK_HEADER_VERSION 236 +#define VK_HEADER_VERSION 239 // Complete version of this file #define VK_HEADER_VERSION_COMPLETE VK_MAKE_API_VERSION(0, 1, 3, VK_HEADER_VERSION) @@ -168,24 +168,12 @@ typedef enum VkResult { VK_ERROR_INCOMPATIBLE_DISPLAY_KHR = -1000003001, VK_ERROR_VALIDATION_FAILED_EXT = -1000011001, VK_ERROR_INVALID_SHADER_NV = -1000012000, -#ifdef VK_ENABLE_BETA_EXTENSIONS VK_ERROR_IMAGE_USAGE_NOT_SUPPORTED_KHR = -1000023000, -#endif -#ifdef VK_ENABLE_BETA_EXTENSIONS VK_ERROR_VIDEO_PICTURE_LAYOUT_NOT_SUPPORTED_KHR = -1000023001, -#endif -#ifdef VK_ENABLE_BETA_EXTENSIONS VK_ERROR_VIDEO_PROFILE_OPERATION_NOT_SUPPORTED_KHR = -1000023002, -#endif -#ifdef VK_ENABLE_BETA_EXTENSIONS VK_ERROR_VIDEO_PROFILE_FORMAT_NOT_SUPPORTED_KHR = -1000023003, -#endif -#ifdef VK_ENABLE_BETA_EXTENSIONS VK_ERROR_VIDEO_PROFILE_CODEC_NOT_SUPPORTED_KHR = -1000023004, -#endif -#ifdef VK_ENABLE_BETA_EXTENSIONS VK_ERROR_VIDEO_STD_VERSION_NOT_SUPPORTED_KHR = -1000023005, -#endif VK_ERROR_INVALID_DRM_FORMAT_MODIFIER_PLANE_LAYOUT_EXT = -1000158000, VK_ERROR_NOT_PERMITTED_KHR = -1000174001, VK_ERROR_FULL_SCREEN_EXCLUSIVE_MODE_LOST_EXT = -1000255000, @@ -443,66 +431,26 @@ typedef enum VkStructureType { VK_STRUCTURE_TYPE_DEBUG_MARKER_OBJECT_NAME_INFO_EXT = 1000022000, VK_STRUCTURE_TYPE_DEBUG_MARKER_OBJECT_TAG_INFO_EXT = 1000022001, VK_STRUCTURE_TYPE_DEBUG_MARKER_MARKER_INFO_EXT = 1000022002, -#ifdef VK_ENABLE_BETA_EXTENSIONS VK_STRUCTURE_TYPE_VIDEO_PROFILE_INFO_KHR = 1000023000, -#endif -#ifdef VK_ENABLE_BETA_EXTENSIONS VK_STRUCTURE_TYPE_VIDEO_CAPABILITIES_KHR = 1000023001, -#endif -#ifdef VK_ENABLE_BETA_EXTENSIONS VK_STRUCTURE_TYPE_VIDEO_PICTURE_RESOURCE_INFO_KHR = 1000023002, -#endif -#ifdef VK_ENABLE_BETA_EXTENSIONS VK_STRUCTURE_TYPE_VIDEO_SESSION_MEMORY_REQUIREMENTS_KHR = 1000023003, -#endif -#ifdef VK_ENABLE_BETA_EXTENSIONS VK_STRUCTURE_TYPE_BIND_VIDEO_SESSION_MEMORY_INFO_KHR = 1000023004, -#endif -#ifdef VK_ENABLE_BETA_EXTENSIONS VK_STRUCTURE_TYPE_VIDEO_SESSION_CREATE_INFO_KHR = 1000023005, -#endif -#ifdef VK_ENABLE_BETA_EXTENSIONS VK_STRUCTURE_TYPE_VIDEO_SESSION_PARAMETERS_CREATE_INFO_KHR = 1000023006, -#endif -#ifdef VK_ENABLE_BETA_EXTENSIONS VK_STRUCTURE_TYPE_VIDEO_SESSION_PARAMETERS_UPDATE_INFO_KHR = 1000023007, -#endif -#ifdef VK_ENABLE_BETA_EXTENSIONS VK_STRUCTURE_TYPE_VIDEO_BEGIN_CODING_INFO_KHR = 1000023008, -#endif -#ifdef VK_ENABLE_BETA_EXTENSIONS VK_STRUCTURE_TYPE_VIDEO_END_CODING_INFO_KHR = 1000023009, -#endif -#ifdef VK_ENABLE_BETA_EXTENSIONS VK_STRUCTURE_TYPE_VIDEO_CODING_CONTROL_INFO_KHR = 1000023010, -#endif -#ifdef VK_ENABLE_BETA_EXTENSIONS VK_STRUCTURE_TYPE_VIDEO_REFERENCE_SLOT_INFO_KHR = 1000023011, -#endif -#ifdef VK_ENABLE_BETA_EXTENSIONS VK_STRUCTURE_TYPE_QUEUE_FAMILY_VIDEO_PROPERTIES_KHR = 1000023012, -#endif -#ifdef VK_ENABLE_BETA_EXTENSIONS VK_STRUCTURE_TYPE_VIDEO_PROFILE_LIST_INFO_KHR = 1000023013, -#endif -#ifdef VK_ENABLE_BETA_EXTENSIONS VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VIDEO_FORMAT_INFO_KHR = 1000023014, -#endif -#ifdef VK_ENABLE_BETA_EXTENSIONS VK_STRUCTURE_TYPE_VIDEO_FORMAT_PROPERTIES_KHR = 1000023015, -#endif -#ifdef VK_ENABLE_BETA_EXTENSIONS VK_STRUCTURE_TYPE_QUEUE_FAMILY_QUERY_RESULT_STATUS_PROPERTIES_KHR = 1000023016, -#endif -#ifdef VK_ENABLE_BETA_EXTENSIONS VK_STRUCTURE_TYPE_VIDEO_DECODE_INFO_KHR = 1000024000, -#endif -#ifdef VK_ENABLE_BETA_EXTENSIONS VK_STRUCTURE_TYPE_VIDEO_DECODE_CAPABILITIES_KHR = 1000024001, -#endif -#ifdef VK_ENABLE_BETA_EXTENSIONS VK_STRUCTURE_TYPE_VIDEO_DECODE_USAGE_INFO_KHR = 1000024002, -#endif VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_IMAGE_CREATE_INFO_NV = 1000026000, VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV = 1000026001, VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_MEMORY_ALLOCATE_INFO_NV = 1000026002, @@ -580,24 +528,12 @@ typedef enum VkStructureType { #ifdef VK_ENABLE_BETA_EXTENSIONS VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_RATE_CONTROL_LAYER_INFO_EXT = 1000039010, #endif -#ifdef VK_ENABLE_BETA_EXTENSIONS - VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_CAPABILITIES_EXT = 1000040000, -#endif -#ifdef VK_ENABLE_BETA_EXTENSIONS - VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_PICTURE_INFO_EXT = 1000040001, -#endif -#ifdef VK_ENABLE_BETA_EXTENSIONS - VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_PROFILE_INFO_EXT = 1000040003, -#endif -#ifdef VK_ENABLE_BETA_EXTENSIONS - VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_PARAMETERS_CREATE_INFO_EXT = 1000040004, -#endif -#ifdef VK_ENABLE_BETA_EXTENSIONS - VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_PARAMETERS_ADD_INFO_EXT = 1000040005, -#endif -#ifdef VK_ENABLE_BETA_EXTENSIONS - VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_DPB_SLOT_INFO_EXT = 1000040006, -#endif + VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_CAPABILITIES_KHR = 1000040000, + VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_PICTURE_INFO_KHR = 1000040001, + VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_PROFILE_INFO_KHR = 1000040003, + VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_PARAMETERS_CREATE_INFO_KHR = 1000040004, + VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_PARAMETERS_ADD_INFO_KHR = 1000040005, + VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_DPB_SLOT_INFO_KHR = 1000040006, VK_STRUCTURE_TYPE_TEXTURE_LOD_GATHER_FORMAT_PROPERTIES_AMD = 1000041000, VK_STRUCTURE_TYPE_RENDERING_FRAGMENT_SHADING_RATE_ATTACHMENT_INFO_KHR = 1000044006, VK_STRUCTURE_TYPE_RENDERING_FRAGMENT_DENSITY_MAP_ATTACHMENT_INFO_EXT = 1000044007, @@ -760,24 +696,12 @@ typedef enum VkStructureType { VK_STRUCTURE_TYPE_PIPELINE_COMPILER_CONTROL_CREATE_INFO_AMD = 1000183000, VK_STRUCTURE_TYPE_CALIBRATED_TIMESTAMP_INFO_EXT = 1000184000, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_AMD = 1000185000, -#ifdef VK_ENABLE_BETA_EXTENSIONS - VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_CAPABILITIES_EXT = 1000187000, -#endif -#ifdef VK_ENABLE_BETA_EXTENSIONS - VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_PARAMETERS_CREATE_INFO_EXT = 1000187001, -#endif -#ifdef VK_ENABLE_BETA_EXTENSIONS - VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_PARAMETERS_ADD_INFO_EXT = 1000187002, -#endif -#ifdef VK_ENABLE_BETA_EXTENSIONS - VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_PROFILE_INFO_EXT = 1000187003, -#endif -#ifdef VK_ENABLE_BETA_EXTENSIONS - VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_PICTURE_INFO_EXT = 1000187004, -#endif -#ifdef VK_ENABLE_BETA_EXTENSIONS - VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_DPB_SLOT_INFO_EXT = 1000187005, -#endif + VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_CAPABILITIES_KHR = 1000187000, + VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_PARAMETERS_CREATE_INFO_KHR = 1000187001, + VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_PARAMETERS_ADD_INFO_KHR = 1000187002, + VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_PROFILE_INFO_KHR = 1000187003, + VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_PICTURE_INFO_KHR = 1000187004, + VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_DPB_SLOT_INFO_KHR = 1000187005, VK_STRUCTURE_TYPE_DEVICE_QUEUE_GLOBAL_PRIORITY_CREATE_INFO_KHR = 1000174000, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GLOBAL_PRIORITY_QUERY_FEATURES_KHR = 1000388000, VK_STRUCTURE_TYPE_QUEUE_FAMILY_GLOBAL_PRIORITY_PROPERTIES_KHR = 1000388001, @@ -854,6 +778,15 @@ typedef enum VkStructureType { VK_STRUCTURE_TYPE_PIPELINE_EXECUTABLE_STATISTIC_KHR = 1000269004, VK_STRUCTURE_TYPE_PIPELINE_EXECUTABLE_INTERNAL_REPRESENTATION_KHR = 1000269005, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_2_FEATURES_EXT = 1000273000, + VK_STRUCTURE_TYPE_SURFACE_PRESENT_MODE_EXT = 1000274000, + VK_STRUCTURE_TYPE_SURFACE_PRESENT_SCALING_CAPABILITIES_EXT = 1000274001, + VK_STRUCTURE_TYPE_SURFACE_PRESENT_MODE_COMPATIBILITY_EXT = 1000274002, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SWAPCHAIN_MAINTENANCE_1_FEATURES_EXT = 1000275000, + VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_FENCE_INFO_EXT = 1000275001, + VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_MODES_CREATE_INFO_EXT = 1000275002, + VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_MODE_INFO_EXT = 1000275003, + VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_SCALING_CREATE_INFO_EXT = 1000275004, + VK_STRUCTURE_TYPE_RELEASE_SWAPCHAIN_IMAGES_INFO_EXT = 1000275005, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_PROPERTIES_NV = 1000277000, VK_STRUCTURE_TYPE_GRAPHICS_SHADER_GROUP_CREATE_INFO_NV = 1000277001, VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_SHADER_GROUPS_CREATE_INFO_NV = 1000277002, @@ -1013,6 +946,8 @@ typedef enum VkStructureType { VK_STRUCTURE_TYPE_MICROMAP_CREATE_INFO_EXT = 1000396007, VK_STRUCTURE_TYPE_MICROMAP_BUILD_SIZES_INFO_EXT = 1000396008, VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_TRIANGLES_OPACITY_MICROMAP_EXT = 1000396009, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CLUSTER_CULLING_SHADER_FEATURES_HUAWEI = 1000404000, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CLUSTER_CULLING_SHADER_PROPERTIES_HUAWEI = 1000404001, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BORDER_COLOR_SWIZZLE_FEATURES_EXT = 1000411000, VK_STRUCTURE_TYPE_SAMPLER_BORDER_COLOR_COMPONENT_MAPPING_CREATE_INFO_EXT = 1000411001, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PAGEABLE_DEVICE_LOCAL_MEMORY_FEATURES_EXT = 1000412000, @@ -1266,15 +1201,9 @@ typedef enum VkImageLayout { VK_IMAGE_LAYOUT_READ_ONLY_OPTIMAL = 1000314000, VK_IMAGE_LAYOUT_ATTACHMENT_OPTIMAL = 1000314001, VK_IMAGE_LAYOUT_PRESENT_SRC_KHR = 1000001002, -#ifdef VK_ENABLE_BETA_EXTENSIONS VK_IMAGE_LAYOUT_VIDEO_DECODE_DST_KHR = 1000024000, -#endif -#ifdef VK_ENABLE_BETA_EXTENSIONS VK_IMAGE_LAYOUT_VIDEO_DECODE_SRC_KHR = 1000024001, -#endif -#ifdef VK_ENABLE_BETA_EXTENSIONS VK_IMAGE_LAYOUT_VIDEO_DECODE_DPB_KHR = 1000024002, -#endif VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR = 1000111000, VK_IMAGE_LAYOUT_FRAGMENT_DENSITY_MAP_OPTIMAL_EXT = 1000218000, VK_IMAGE_LAYOUT_FRAGMENT_SHADING_RATE_ATTACHMENT_OPTIMAL_KHR = 1000164003, @@ -1335,12 +1264,8 @@ typedef enum VkObjectType { VK_OBJECT_TYPE_DISPLAY_KHR = 1000002000, VK_OBJECT_TYPE_DISPLAY_MODE_KHR = 1000002001, VK_OBJECT_TYPE_DEBUG_REPORT_CALLBACK_EXT = 1000011000, -#ifdef VK_ENABLE_BETA_EXTENSIONS VK_OBJECT_TYPE_VIDEO_SESSION_KHR = 1000023000, -#endif -#ifdef VK_ENABLE_BETA_EXTENSIONS VK_OBJECT_TYPE_VIDEO_SESSION_PARAMETERS_KHR = 1000023001, -#endif VK_OBJECT_TYPE_CU_MODULE_NVX = 1000029000, VK_OBJECT_TYPE_CU_FUNCTION_NVX = 1000029001, VK_OBJECT_TYPE_DEBUG_UTILS_MESSENGER_EXT = 1000128000, @@ -1716,9 +1641,7 @@ typedef enum VkQueryType { VK_QUERY_TYPE_OCCLUSION = 0, VK_QUERY_TYPE_PIPELINE_STATISTICS = 1, VK_QUERY_TYPE_TIMESTAMP = 2, -#ifdef VK_ENABLE_BETA_EXTENSIONS VK_QUERY_TYPE_RESULT_STATUS_ONLY_KHR = 1000023000, -#endif VK_QUERY_TYPE_TRANSFORM_FEEDBACK_STREAM_EXT = 1000028004, VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR = 1000116000, VK_QUERY_TYPE_ACCELERATION_STRUCTURE_COMPACTED_SIZE_KHR = 1000150000, @@ -2199,12 +2122,8 @@ typedef enum VkFormatFeatureFlagBits { VK_FORMAT_FEATURE_DISJOINT_BIT = 0x00400000, VK_FORMAT_FEATURE_COSITED_CHROMA_SAMPLES_BIT = 0x00800000, VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_MINMAX_BIT = 0x00010000, -#ifdef VK_ENABLE_BETA_EXTENSIONS VK_FORMAT_FEATURE_VIDEO_DECODE_OUTPUT_BIT_KHR = 0x02000000, -#endif -#ifdef VK_ENABLE_BETA_EXTENSIONS VK_FORMAT_FEATURE_VIDEO_DECODE_DPB_BIT_KHR = 0x04000000, -#endif VK_FORMAT_FEATURE_ACCELERATION_STRUCTURE_VERTEX_BUFFER_BIT_KHR = 0x20000000, VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_EXT = 0x00002000, VK_FORMAT_FEATURE_FRAGMENT_DENSITY_MAP_BIT_EXT = 0x01000000, @@ -2281,15 +2200,9 @@ typedef enum VkImageUsageFlagBits { VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT = 0x00000020, VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT = 0x00000040, VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT = 0x00000080, -#ifdef VK_ENABLE_BETA_EXTENSIONS VK_IMAGE_USAGE_VIDEO_DECODE_DST_BIT_KHR = 0x00000400, -#endif -#ifdef VK_ENABLE_BETA_EXTENSIONS VK_IMAGE_USAGE_VIDEO_DECODE_SRC_BIT_KHR = 0x00000800, -#endif -#ifdef VK_ENABLE_BETA_EXTENSIONS VK_IMAGE_USAGE_VIDEO_DECODE_DPB_BIT_KHR = 0x00001000, -#endif VK_IMAGE_USAGE_FRAGMENT_DENSITY_MAP_BIT_EXT = 0x00000200, VK_IMAGE_USAGE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR = 0x00000100, #ifdef VK_ENABLE_BETA_EXTENSIONS @@ -2344,9 +2257,7 @@ typedef enum VkQueueFlagBits { VK_QUEUE_TRANSFER_BIT = 0x00000004, VK_QUEUE_SPARSE_BINDING_BIT = 0x00000008, VK_QUEUE_PROTECTED_BIT = 0x00000010, -#ifdef VK_ENABLE_BETA_EXTENSIONS VK_QUEUE_VIDEO_DECODE_BIT_KHR = 0x00000020, -#endif #ifdef VK_ENABLE_BETA_EXTENSIONS VK_QUEUE_VIDEO_ENCODE_BIT_KHR = 0x00000040, #endif @@ -2443,6 +2354,7 @@ typedef enum VkQueryPipelineStatisticFlagBits { VK_QUERY_PIPELINE_STATISTIC_COMPUTE_SHADER_INVOCATIONS_BIT = 0x00000400, VK_QUERY_PIPELINE_STATISTIC_TASK_SHADER_INVOCATIONS_BIT_EXT = 0x00000800, VK_QUERY_PIPELINE_STATISTIC_MESH_SHADER_INVOCATIONS_BIT_EXT = 0x00001000, + VK_QUERY_PIPELINE_STATISTIC_CLUSTER_CULLING_SHADER_INVOCATIONS_BIT_HUAWEI = 0x00002000, VK_QUERY_PIPELINE_STATISTIC_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF } VkQueryPipelineStatisticFlagBits; typedef VkFlags VkQueryPipelineStatisticFlags; @@ -2453,9 +2365,7 @@ typedef enum VkQueryResultFlagBits { VK_QUERY_RESULT_WAIT_BIT = 0x00000002, VK_QUERY_RESULT_WITH_AVAILABILITY_BIT = 0x00000004, VK_QUERY_RESULT_PARTIAL_BIT = 0x00000008, -#ifdef VK_ENABLE_BETA_EXTENSIONS VK_QUERY_RESULT_WITH_STATUS_BIT_KHR = 0x00000010, -#endif VK_QUERY_RESULT_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF } VkQueryResultFlagBits; typedef VkFlags VkQueryResultFlags; @@ -2484,12 +2394,8 @@ typedef enum VkBufferUsageFlagBits { VK_BUFFER_USAGE_VERTEX_BUFFER_BIT = 0x00000080, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT = 0x00000100, VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT = 0x00020000, -#ifdef VK_ENABLE_BETA_EXTENSIONS VK_BUFFER_USAGE_VIDEO_DECODE_SRC_BIT_KHR = 0x00002000, -#endif -#ifdef VK_ENABLE_BETA_EXTENSIONS VK_BUFFER_USAGE_VIDEO_DECODE_DST_BIT_KHR = 0x00004000, -#endif VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT = 0x00000800, VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT = 0x00001000, VK_BUFFER_USAGE_CONDITIONAL_RENDERING_BIT_EXT = 0x00000200, @@ -2609,6 +2515,7 @@ typedef enum VkShaderStageFlagBits { VK_SHADER_STAGE_TASK_BIT_EXT = 0x00000040, VK_SHADER_STAGE_MESH_BIT_EXT = 0x00000080, VK_SHADER_STAGE_SUBPASS_SHADING_BIT_HUAWEI = 0x00004000, + VK_SHADER_STAGE_CLUSTER_CULLING_BIT_HUAWEI = 0x00080000, VK_SHADER_STAGE_RAYGEN_BIT_NV = VK_SHADER_STAGE_RAYGEN_BIT_KHR, VK_SHADER_STAGE_ANY_HIT_BIT_NV = VK_SHADER_STAGE_ANY_HIT_BIT_KHR, VK_SHADER_STAGE_CLOSEST_HIT_BIT_NV = VK_SHADER_STAGE_CLOSEST_HIT_BIT_KHR, @@ -5738,6 +5645,7 @@ typedef enum VkDriverId { VK_DRIVER_ID_MESA_VENUS = 22, VK_DRIVER_ID_MESA_DOZEN = 23, VK_DRIVER_ID_MESA_NVK = 24, + VK_DRIVER_ID_IMAGINATION_OPEN_SOURCE_MESA = 25, VK_DRIVER_ID_AMD_PROPRIETARY_KHR = VK_DRIVER_ID_AMD_PROPRIETARY, VK_DRIVER_ID_AMD_OPEN_SOURCE_KHR = VK_DRIVER_ID_AMD_OPEN_SOURCE, VK_DRIVER_ID_MESA_RADV_KHR = VK_DRIVER_ID_MESA_RADV, @@ -6550,9 +6458,7 @@ static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_VERTEX_ATTRIBUTE_INPUT static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_VERTEX_ATTRIBUTE_INPUT_BIT_KHR = 0x2000000000ULL; static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_PRE_RASTERIZATION_SHADERS_BIT = 0x4000000000ULL; static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_PRE_RASTERIZATION_SHADERS_BIT_KHR = 0x4000000000ULL; -#ifdef VK_ENABLE_BETA_EXTENSIONS static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_VIDEO_DECODE_BIT_KHR = 0x04000000ULL; -#endif #ifdef VK_ENABLE_BETA_EXTENSIONS static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_VIDEO_ENCODE_BIT_KHR = 0x08000000ULL; #endif @@ -6574,6 +6480,7 @@ static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_SUBPASS_SHADING_BIT_HU static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_INVOCATION_MASK_BIT_HUAWEI = 0x10000000000ULL; static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_COPY_BIT_KHR = 0x10000000ULL; static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_MICROMAP_BUILD_BIT_EXT = 0x40000000ULL; +static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_CLUSTER_CULLING_SHADER_BIT_HUAWEI = 0x20000000000ULL; static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_OPTICAL_FLOW_BIT_NV = 0x20000000ULL; typedef VkFlags64 VkAccessFlags2; @@ -6622,12 +6529,8 @@ static const VkAccessFlagBits2 VK_ACCESS_2_SHADER_STORAGE_READ_BIT = 0x200000000 static const VkAccessFlagBits2 VK_ACCESS_2_SHADER_STORAGE_READ_BIT_KHR = 0x200000000ULL; static const VkAccessFlagBits2 VK_ACCESS_2_SHADER_STORAGE_WRITE_BIT = 0x400000000ULL; static const VkAccessFlagBits2 VK_ACCESS_2_SHADER_STORAGE_WRITE_BIT_KHR = 0x400000000ULL; -#ifdef VK_ENABLE_BETA_EXTENSIONS static const VkAccessFlagBits2 VK_ACCESS_2_VIDEO_DECODE_READ_BIT_KHR = 0x800000000ULL; -#endif -#ifdef VK_ENABLE_BETA_EXTENSIONS static const VkAccessFlagBits2 VK_ACCESS_2_VIDEO_DECODE_WRITE_BIT_KHR = 0x1000000000ULL; -#endif #ifdef VK_ENABLE_BETA_EXTENSIONS static const VkAccessFlagBits2 VK_ACCESS_2_VIDEO_ENCODE_READ_BIT_KHR = 0x2000000000ULL; #endif @@ -6733,12 +6636,8 @@ static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_STORAGE_WRITE_WITHOUT_ static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_STORAGE_WRITE_WITHOUT_FORMAT_BIT_KHR = 0x100000000ULL; static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_DEPTH_COMPARISON_BIT = 0x200000000ULL; static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_DEPTH_COMPARISON_BIT_KHR = 0x200000000ULL; -#ifdef VK_ENABLE_BETA_EXTENSIONS static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_VIDEO_DECODE_OUTPUT_BIT_KHR = 0x02000000ULL; -#endif -#ifdef VK_ENABLE_BETA_EXTENSIONS static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_VIDEO_DECODE_DPB_BIT_KHR = 0x04000000ULL; -#endif static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_ACCELERATION_STRUCTURE_VERTEX_BUFFER_BIT_KHR = 0x20000000ULL; static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_FRAGMENT_DENSITY_MAP_BIT_EXT = 0x01000000ULL; static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR = 0x40000000ULL; @@ -7632,6 +7531,7 @@ typedef enum VkSwapchainCreateFlagBitsKHR { VK_SWAPCHAIN_CREATE_SPLIT_INSTANCE_BIND_REGIONS_BIT_KHR = 0x00000001, VK_SWAPCHAIN_CREATE_PROTECTED_BIT_KHR = 0x00000002, VK_SWAPCHAIN_CREATE_MUTABLE_FORMAT_BIT_KHR = 0x00000004, + VK_SWAPCHAIN_CREATE_DEFERRED_MEMORY_ALLOCATION_BIT_EXT = 0x00000008, VK_SWAPCHAIN_CREATE_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF } VkSwapchainCreateFlagBitsKHR; typedef VkFlags VkSwapchainCreateFlagsKHR; @@ -7935,6 +7835,412 @@ VKAPI_ATTR VkResult VKAPI_CALL vkCreateSharedSwapchainsKHR( #define VK_KHR_SAMPLER_MIRROR_CLAMP_TO_EDGE_EXTENSION_NAME "VK_KHR_sampler_mirror_clamp_to_edge" +#define VK_KHR_video_queue 1 +VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkVideoSessionKHR) +VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkVideoSessionParametersKHR) +#define VK_KHR_VIDEO_QUEUE_SPEC_VERSION 8 +#define VK_KHR_VIDEO_QUEUE_EXTENSION_NAME "VK_KHR_video_queue" + +typedef enum VkQueryResultStatusKHR { + VK_QUERY_RESULT_STATUS_ERROR_KHR = -1, + VK_QUERY_RESULT_STATUS_NOT_READY_KHR = 0, + VK_QUERY_RESULT_STATUS_COMPLETE_KHR = 1, + VK_QUERY_RESULT_STATUS_MAX_ENUM_KHR = 0x7FFFFFFF +} VkQueryResultStatusKHR; + +typedef enum VkVideoCodecOperationFlagBitsKHR { + VK_VIDEO_CODEC_OPERATION_NONE_KHR = 0, +#ifdef VK_ENABLE_BETA_EXTENSIONS + VK_VIDEO_CODEC_OPERATION_ENCODE_H264_BIT_EXT = 0x00010000, +#endif +#ifdef VK_ENABLE_BETA_EXTENSIONS + VK_VIDEO_CODEC_OPERATION_ENCODE_H265_BIT_EXT = 0x00020000, +#endif + VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_KHR = 0x00000001, + VK_VIDEO_CODEC_OPERATION_DECODE_H265_BIT_KHR = 0x00000002, + VK_VIDEO_CODEC_OPERATION_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF +} VkVideoCodecOperationFlagBitsKHR; +typedef VkFlags VkVideoCodecOperationFlagsKHR; + +typedef enum VkVideoChromaSubsamplingFlagBitsKHR { + VK_VIDEO_CHROMA_SUBSAMPLING_INVALID_KHR = 0, + VK_VIDEO_CHROMA_SUBSAMPLING_MONOCHROME_BIT_KHR = 0x00000001, + VK_VIDEO_CHROMA_SUBSAMPLING_420_BIT_KHR = 0x00000002, + VK_VIDEO_CHROMA_SUBSAMPLING_422_BIT_KHR = 0x00000004, + VK_VIDEO_CHROMA_SUBSAMPLING_444_BIT_KHR = 0x00000008, + VK_VIDEO_CHROMA_SUBSAMPLING_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF +} VkVideoChromaSubsamplingFlagBitsKHR; +typedef VkFlags VkVideoChromaSubsamplingFlagsKHR; + +typedef enum VkVideoComponentBitDepthFlagBitsKHR { + VK_VIDEO_COMPONENT_BIT_DEPTH_INVALID_KHR = 0, + VK_VIDEO_COMPONENT_BIT_DEPTH_8_BIT_KHR = 0x00000001, + VK_VIDEO_COMPONENT_BIT_DEPTH_10_BIT_KHR = 0x00000004, + VK_VIDEO_COMPONENT_BIT_DEPTH_12_BIT_KHR = 0x00000010, + VK_VIDEO_COMPONENT_BIT_DEPTH_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF +} VkVideoComponentBitDepthFlagBitsKHR; +typedef VkFlags VkVideoComponentBitDepthFlagsKHR; + +typedef enum VkVideoCapabilityFlagBitsKHR { + VK_VIDEO_CAPABILITY_PROTECTED_CONTENT_BIT_KHR = 0x00000001, + VK_VIDEO_CAPABILITY_SEPARATE_REFERENCE_IMAGES_BIT_KHR = 0x00000002, + VK_VIDEO_CAPABILITY_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF +} VkVideoCapabilityFlagBitsKHR; +typedef VkFlags VkVideoCapabilityFlagsKHR; + +typedef enum VkVideoSessionCreateFlagBitsKHR { + VK_VIDEO_SESSION_CREATE_PROTECTED_CONTENT_BIT_KHR = 0x00000001, + VK_VIDEO_SESSION_CREATE_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF +} VkVideoSessionCreateFlagBitsKHR; +typedef VkFlags VkVideoSessionCreateFlagsKHR; +typedef VkFlags VkVideoSessionParametersCreateFlagsKHR; +typedef VkFlags VkVideoBeginCodingFlagsKHR; +typedef VkFlags VkVideoEndCodingFlagsKHR; + +typedef enum VkVideoCodingControlFlagBitsKHR { + VK_VIDEO_CODING_CONTROL_RESET_BIT_KHR = 0x00000001, +#ifdef VK_ENABLE_BETA_EXTENSIONS + VK_VIDEO_CODING_CONTROL_ENCODE_RATE_CONTROL_BIT_KHR = 0x00000002, +#endif +#ifdef VK_ENABLE_BETA_EXTENSIONS + VK_VIDEO_CODING_CONTROL_ENCODE_RATE_CONTROL_LAYER_BIT_KHR = 0x00000004, +#endif + VK_VIDEO_CODING_CONTROL_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF +} VkVideoCodingControlFlagBitsKHR; +typedef VkFlags VkVideoCodingControlFlagsKHR; +typedef struct VkQueueFamilyQueryResultStatusPropertiesKHR { + VkStructureType sType; + void* pNext; + VkBool32 queryResultStatusSupport; +} VkQueueFamilyQueryResultStatusPropertiesKHR; + +typedef struct VkQueueFamilyVideoPropertiesKHR { + VkStructureType sType; + void* pNext; + VkVideoCodecOperationFlagsKHR videoCodecOperations; +} VkQueueFamilyVideoPropertiesKHR; + +typedef struct VkVideoProfileInfoKHR { + VkStructureType sType; + const void* pNext; + VkVideoCodecOperationFlagBitsKHR videoCodecOperation; + VkVideoChromaSubsamplingFlagsKHR chromaSubsampling; + VkVideoComponentBitDepthFlagsKHR lumaBitDepth; + VkVideoComponentBitDepthFlagsKHR chromaBitDepth; +} VkVideoProfileInfoKHR; + +typedef struct VkVideoProfileListInfoKHR { + VkStructureType sType; + const void* pNext; + uint32_t profileCount; + const VkVideoProfileInfoKHR* pProfiles; +} VkVideoProfileListInfoKHR; + +typedef struct VkVideoCapabilitiesKHR { + VkStructureType sType; + void* pNext; + VkVideoCapabilityFlagsKHR flags; + VkDeviceSize minBitstreamBufferOffsetAlignment; + VkDeviceSize minBitstreamBufferSizeAlignment; + VkExtent2D pictureAccessGranularity; + VkExtent2D minCodedExtent; + VkExtent2D maxCodedExtent; + uint32_t maxDpbSlots; + uint32_t maxActiveReferencePictures; + VkExtensionProperties stdHeaderVersion; +} VkVideoCapabilitiesKHR; + +typedef struct VkPhysicalDeviceVideoFormatInfoKHR { + VkStructureType sType; + const void* pNext; + VkImageUsageFlags imageUsage; +} VkPhysicalDeviceVideoFormatInfoKHR; + +typedef struct VkVideoFormatPropertiesKHR { + VkStructureType sType; + void* pNext; + VkFormat format; + VkComponentMapping componentMapping; + VkImageCreateFlags imageCreateFlags; + VkImageType imageType; + VkImageTiling imageTiling; + VkImageUsageFlags imageUsageFlags; +} VkVideoFormatPropertiesKHR; + +typedef struct VkVideoPictureResourceInfoKHR { + VkStructureType sType; + const void* pNext; + VkOffset2D codedOffset; + VkExtent2D codedExtent; + uint32_t baseArrayLayer; + VkImageView imageViewBinding; +} VkVideoPictureResourceInfoKHR; + +typedef struct VkVideoReferenceSlotInfoKHR { + VkStructureType sType; + const void* pNext; + int32_t slotIndex; + const VkVideoPictureResourceInfoKHR* pPictureResource; +} VkVideoReferenceSlotInfoKHR; + +typedef struct VkVideoSessionMemoryRequirementsKHR { + VkStructureType sType; + void* pNext; + uint32_t memoryBindIndex; + VkMemoryRequirements memoryRequirements; +} VkVideoSessionMemoryRequirementsKHR; + +typedef struct VkBindVideoSessionMemoryInfoKHR { + VkStructureType sType; + const void* pNext; + uint32_t memoryBindIndex; + VkDeviceMemory memory; + VkDeviceSize memoryOffset; + VkDeviceSize memorySize; +} VkBindVideoSessionMemoryInfoKHR; + +typedef struct VkVideoSessionCreateInfoKHR { + VkStructureType sType; + const void* pNext; + uint32_t queueFamilyIndex; + VkVideoSessionCreateFlagsKHR flags; + const VkVideoProfileInfoKHR* pVideoProfile; + VkFormat pictureFormat; + VkExtent2D maxCodedExtent; + VkFormat referencePictureFormat; + uint32_t maxDpbSlots; + uint32_t maxActiveReferencePictures; + const VkExtensionProperties* pStdHeaderVersion; +} VkVideoSessionCreateInfoKHR; + +typedef struct VkVideoSessionParametersCreateInfoKHR { + VkStructureType sType; + const void* pNext; + VkVideoSessionParametersCreateFlagsKHR flags; + VkVideoSessionParametersKHR videoSessionParametersTemplate; + VkVideoSessionKHR videoSession; +} VkVideoSessionParametersCreateInfoKHR; + +typedef struct VkVideoSessionParametersUpdateInfoKHR { + VkStructureType sType; + const void* pNext; + uint32_t updateSequenceCount; +} VkVideoSessionParametersUpdateInfoKHR; + +typedef struct VkVideoBeginCodingInfoKHR { + VkStructureType sType; + const void* pNext; + VkVideoBeginCodingFlagsKHR flags; + VkVideoSessionKHR videoSession; + VkVideoSessionParametersKHR videoSessionParameters; + uint32_t referenceSlotCount; + const VkVideoReferenceSlotInfoKHR* pReferenceSlots; +} VkVideoBeginCodingInfoKHR; + +typedef struct VkVideoEndCodingInfoKHR { + VkStructureType sType; + const void* pNext; + VkVideoEndCodingFlagsKHR flags; +} VkVideoEndCodingInfoKHR; + +typedef struct VkVideoCodingControlInfoKHR { + VkStructureType sType; + const void* pNext; + VkVideoCodingControlFlagsKHR flags; +} VkVideoCodingControlInfoKHR; + +typedef VkResult (VKAPI_PTR *PFN_vkGetPhysicalDeviceVideoCapabilitiesKHR)(VkPhysicalDevice physicalDevice, const VkVideoProfileInfoKHR* pVideoProfile, VkVideoCapabilitiesKHR* pCapabilities); +typedef VkResult (VKAPI_PTR *PFN_vkGetPhysicalDeviceVideoFormatPropertiesKHR)(VkPhysicalDevice physicalDevice, const VkPhysicalDeviceVideoFormatInfoKHR* pVideoFormatInfo, uint32_t* pVideoFormatPropertyCount, VkVideoFormatPropertiesKHR* pVideoFormatProperties); +typedef VkResult (VKAPI_PTR *PFN_vkCreateVideoSessionKHR)(VkDevice device, const VkVideoSessionCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkVideoSessionKHR* pVideoSession); +typedef void (VKAPI_PTR *PFN_vkDestroyVideoSessionKHR)(VkDevice device, VkVideoSessionKHR videoSession, const VkAllocationCallbacks* pAllocator); +typedef VkResult (VKAPI_PTR *PFN_vkGetVideoSessionMemoryRequirementsKHR)(VkDevice device, VkVideoSessionKHR videoSession, uint32_t* pMemoryRequirementsCount, VkVideoSessionMemoryRequirementsKHR* pMemoryRequirements); +typedef VkResult (VKAPI_PTR *PFN_vkBindVideoSessionMemoryKHR)(VkDevice device, VkVideoSessionKHR videoSession, uint32_t bindSessionMemoryInfoCount, const VkBindVideoSessionMemoryInfoKHR* pBindSessionMemoryInfos); +typedef VkResult (VKAPI_PTR *PFN_vkCreateVideoSessionParametersKHR)(VkDevice device, const VkVideoSessionParametersCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkVideoSessionParametersKHR* pVideoSessionParameters); +typedef VkResult (VKAPI_PTR *PFN_vkUpdateVideoSessionParametersKHR)(VkDevice device, VkVideoSessionParametersKHR videoSessionParameters, const VkVideoSessionParametersUpdateInfoKHR* pUpdateInfo); +typedef void (VKAPI_PTR *PFN_vkDestroyVideoSessionParametersKHR)(VkDevice device, VkVideoSessionParametersKHR videoSessionParameters, const VkAllocationCallbacks* pAllocator); +typedef void (VKAPI_PTR *PFN_vkCmdBeginVideoCodingKHR)(VkCommandBuffer commandBuffer, const VkVideoBeginCodingInfoKHR* pBeginInfo); +typedef void (VKAPI_PTR *PFN_vkCmdEndVideoCodingKHR)(VkCommandBuffer commandBuffer, const VkVideoEndCodingInfoKHR* pEndCodingInfo); +typedef void (VKAPI_PTR *PFN_vkCmdControlVideoCodingKHR)(VkCommandBuffer commandBuffer, const VkVideoCodingControlInfoKHR* pCodingControlInfo); + +#ifndef VK_NO_PROTOTYPES +VKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceVideoCapabilitiesKHR( + VkPhysicalDevice physicalDevice, + const VkVideoProfileInfoKHR* pVideoProfile, + VkVideoCapabilitiesKHR* pCapabilities); + +VKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceVideoFormatPropertiesKHR( + VkPhysicalDevice physicalDevice, + const VkPhysicalDeviceVideoFormatInfoKHR* pVideoFormatInfo, + uint32_t* pVideoFormatPropertyCount, + VkVideoFormatPropertiesKHR* pVideoFormatProperties); + +VKAPI_ATTR VkResult VKAPI_CALL vkCreateVideoSessionKHR( + VkDevice device, + const VkVideoSessionCreateInfoKHR* pCreateInfo, + const VkAllocationCallbacks* pAllocator, + VkVideoSessionKHR* pVideoSession); + +VKAPI_ATTR void VKAPI_CALL vkDestroyVideoSessionKHR( + VkDevice device, + VkVideoSessionKHR videoSession, + const VkAllocationCallbacks* pAllocator); + +VKAPI_ATTR VkResult VKAPI_CALL vkGetVideoSessionMemoryRequirementsKHR( + VkDevice device, + VkVideoSessionKHR videoSession, + uint32_t* pMemoryRequirementsCount, + VkVideoSessionMemoryRequirementsKHR* pMemoryRequirements); + +VKAPI_ATTR VkResult VKAPI_CALL vkBindVideoSessionMemoryKHR( + VkDevice device, + VkVideoSessionKHR videoSession, + uint32_t bindSessionMemoryInfoCount, + const VkBindVideoSessionMemoryInfoKHR* pBindSessionMemoryInfos); + +VKAPI_ATTR VkResult VKAPI_CALL vkCreateVideoSessionParametersKHR( + VkDevice device, + const VkVideoSessionParametersCreateInfoKHR* pCreateInfo, + const VkAllocationCallbacks* pAllocator, + VkVideoSessionParametersKHR* pVideoSessionParameters); + +VKAPI_ATTR VkResult VKAPI_CALL vkUpdateVideoSessionParametersKHR( + VkDevice device, + VkVideoSessionParametersKHR videoSessionParameters, + const VkVideoSessionParametersUpdateInfoKHR* pUpdateInfo); + +VKAPI_ATTR void VKAPI_CALL vkDestroyVideoSessionParametersKHR( + VkDevice device, + VkVideoSessionParametersKHR videoSessionParameters, + const VkAllocationCallbacks* pAllocator); + +VKAPI_ATTR void VKAPI_CALL vkCmdBeginVideoCodingKHR( + VkCommandBuffer commandBuffer, + const VkVideoBeginCodingInfoKHR* pBeginInfo); + +VKAPI_ATTR void VKAPI_CALL vkCmdEndVideoCodingKHR( + VkCommandBuffer commandBuffer, + const VkVideoEndCodingInfoKHR* pEndCodingInfo); + +VKAPI_ATTR void VKAPI_CALL vkCmdControlVideoCodingKHR( + VkCommandBuffer commandBuffer, + const VkVideoCodingControlInfoKHR* pCodingControlInfo); +#endif + + +#define VK_KHR_video_decode_queue 1 +#define VK_KHR_VIDEO_DECODE_QUEUE_SPEC_VERSION 7 +#define VK_KHR_VIDEO_DECODE_QUEUE_EXTENSION_NAME "VK_KHR_video_decode_queue" + +typedef enum VkVideoDecodeCapabilityFlagBitsKHR { + VK_VIDEO_DECODE_CAPABILITY_DPB_AND_OUTPUT_COINCIDE_BIT_KHR = 0x00000001, + VK_VIDEO_DECODE_CAPABILITY_DPB_AND_OUTPUT_DISTINCT_BIT_KHR = 0x00000002, + VK_VIDEO_DECODE_CAPABILITY_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF +} VkVideoDecodeCapabilityFlagBitsKHR; +typedef VkFlags VkVideoDecodeCapabilityFlagsKHR; + +typedef enum VkVideoDecodeUsageFlagBitsKHR { + VK_VIDEO_DECODE_USAGE_DEFAULT_KHR = 0, + VK_VIDEO_DECODE_USAGE_TRANSCODING_BIT_KHR = 0x00000001, + VK_VIDEO_DECODE_USAGE_OFFLINE_BIT_KHR = 0x00000002, + VK_VIDEO_DECODE_USAGE_STREAMING_BIT_KHR = 0x00000004, + VK_VIDEO_DECODE_USAGE_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF +} VkVideoDecodeUsageFlagBitsKHR; +typedef VkFlags VkVideoDecodeUsageFlagsKHR; +typedef VkFlags VkVideoDecodeFlagsKHR; +typedef struct VkVideoDecodeCapabilitiesKHR { + VkStructureType sType; + void* pNext; + VkVideoDecodeCapabilityFlagsKHR flags; +} VkVideoDecodeCapabilitiesKHR; + +typedef struct VkVideoDecodeUsageInfoKHR { + VkStructureType sType; + const void* pNext; + VkVideoDecodeUsageFlagsKHR videoUsageHints; +} VkVideoDecodeUsageInfoKHR; + +typedef struct VkVideoDecodeInfoKHR { + VkStructureType sType; + const void* pNext; + VkVideoDecodeFlagsKHR flags; + VkBuffer srcBuffer; + VkDeviceSize srcBufferOffset; + VkDeviceSize srcBufferRange; + VkVideoPictureResourceInfoKHR dstPictureResource; + const VkVideoReferenceSlotInfoKHR* pSetupReferenceSlot; + uint32_t referenceSlotCount; + const VkVideoReferenceSlotInfoKHR* pReferenceSlots; +} VkVideoDecodeInfoKHR; + +typedef void (VKAPI_PTR *PFN_vkCmdDecodeVideoKHR)(VkCommandBuffer commandBuffer, const VkVideoDecodeInfoKHR* pDecodeInfo); + +#ifndef VK_NO_PROTOTYPES +VKAPI_ATTR void VKAPI_CALL vkCmdDecodeVideoKHR( + VkCommandBuffer commandBuffer, + const VkVideoDecodeInfoKHR* pDecodeInfo); +#endif + + +#define VK_KHR_video_decode_h264 1 +#include "vk_video/vulkan_video_codec_h264std.h" +#include "vk_video/vulkan_video_codec_h264std_decode.h" +#define VK_KHR_VIDEO_DECODE_H264_SPEC_VERSION 8 +#define VK_KHR_VIDEO_DECODE_H264_EXTENSION_NAME "VK_KHR_video_decode_h264" + +typedef enum VkVideoDecodeH264PictureLayoutFlagBitsKHR { + VK_VIDEO_DECODE_H264_PICTURE_LAYOUT_PROGRESSIVE_KHR = 0, + VK_VIDEO_DECODE_H264_PICTURE_LAYOUT_INTERLACED_INTERLEAVED_LINES_BIT_KHR = 0x00000001, + VK_VIDEO_DECODE_H264_PICTURE_LAYOUT_INTERLACED_SEPARATE_PLANES_BIT_KHR = 0x00000002, + VK_VIDEO_DECODE_H264_PICTURE_LAYOUT_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF +} VkVideoDecodeH264PictureLayoutFlagBitsKHR; +typedef VkFlags VkVideoDecodeH264PictureLayoutFlagsKHR; +typedef struct VkVideoDecodeH264ProfileInfoKHR { + VkStructureType sType; + const void* pNext; + StdVideoH264ProfileIdc stdProfileIdc; + VkVideoDecodeH264PictureLayoutFlagBitsKHR pictureLayout; +} VkVideoDecodeH264ProfileInfoKHR; + +typedef struct VkVideoDecodeH264CapabilitiesKHR { + VkStructureType sType; + void* pNext; + StdVideoH264LevelIdc maxLevelIdc; + VkOffset2D fieldOffsetGranularity; +} VkVideoDecodeH264CapabilitiesKHR; + +typedef struct VkVideoDecodeH264SessionParametersAddInfoKHR { + VkStructureType sType; + const void* pNext; + uint32_t stdSPSCount; + const StdVideoH264SequenceParameterSet* pStdSPSs; + uint32_t stdPPSCount; + const StdVideoH264PictureParameterSet* pStdPPSs; +} VkVideoDecodeH264SessionParametersAddInfoKHR; + +typedef struct VkVideoDecodeH264SessionParametersCreateInfoKHR { + VkStructureType sType; + const void* pNext; + uint32_t maxStdSPSCount; + uint32_t maxStdPPSCount; + const VkVideoDecodeH264SessionParametersAddInfoKHR* pParametersAddInfo; +} VkVideoDecodeH264SessionParametersCreateInfoKHR; + +typedef struct VkVideoDecodeH264PictureInfoKHR { + VkStructureType sType; + const void* pNext; + const StdVideoDecodeH264PictureInfo* pStdPictureInfo; + uint32_t sliceCount; + const uint32_t* pSliceOffsets; +} VkVideoDecodeH264PictureInfoKHR; + +typedef struct VkVideoDecodeH264DpbSlotInfoKHR { + VkStructureType sType; + const void* pNext; + const StdVideoDecodeH264ReferenceInfo* pStdReferenceInfo; +} VkVideoDecodeH264DpbSlotInfoKHR; + + + #define VK_KHR_dynamic_rendering 1 #define VK_KHR_DYNAMIC_RENDERING_SPEC_VERSION 1 #define VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME "VK_KHR_dynamic_rendering" @@ -9048,6 +9354,59 @@ typedef struct VkPhysicalDeviceShaderClockFeaturesKHR { +#define VK_KHR_video_decode_h265 1 +#include "vk_video/vulkan_video_codec_h265std.h" +#include "vk_video/vulkan_video_codec_h265std_decode.h" +#define VK_KHR_VIDEO_DECODE_H265_SPEC_VERSION 7 +#define VK_KHR_VIDEO_DECODE_H265_EXTENSION_NAME "VK_KHR_video_decode_h265" +typedef struct VkVideoDecodeH265ProfileInfoKHR { + VkStructureType sType; + const void* pNext; + StdVideoH265ProfileIdc stdProfileIdc; +} VkVideoDecodeH265ProfileInfoKHR; + +typedef struct VkVideoDecodeH265CapabilitiesKHR { + VkStructureType sType; + void* pNext; + StdVideoH265LevelIdc maxLevelIdc; +} VkVideoDecodeH265CapabilitiesKHR; + +typedef struct VkVideoDecodeH265SessionParametersAddInfoKHR { + VkStructureType sType; + const void* pNext; + uint32_t stdVPSCount; + const StdVideoH265VideoParameterSet* pStdVPSs; + uint32_t stdSPSCount; + const StdVideoH265SequenceParameterSet* pStdSPSs; + uint32_t stdPPSCount; + const StdVideoH265PictureParameterSet* pStdPPSs; +} VkVideoDecodeH265SessionParametersAddInfoKHR; + +typedef struct VkVideoDecodeH265SessionParametersCreateInfoKHR { + VkStructureType sType; + const void* pNext; + uint32_t maxStdVPSCount; + uint32_t maxStdSPSCount; + uint32_t maxStdPPSCount; + const VkVideoDecodeH265SessionParametersAddInfoKHR* pParametersAddInfo; +} VkVideoDecodeH265SessionParametersCreateInfoKHR; + +typedef struct VkVideoDecodeH265PictureInfoKHR { + VkStructureType sType; + const void* pNext; + StdVideoDecodeH265PictureInfo* pStdPictureInfo; + uint32_t sliceSegmentCount; + const uint32_t* pSliceSegmentOffsets; +} VkVideoDecodeH265PictureInfoKHR; + +typedef struct VkVideoDecodeH265DpbSlotInfoKHR { + VkStructureType sType; + const void* pNext; + const StdVideoDecodeH265ReferenceInfo* pStdReferenceInfo; +} VkVideoDecodeH265DpbSlotInfoKHR; + + + #define VK_KHR_global_priority 1 #define VK_MAX_GLOBAL_PRIORITY_SIZE_KHR 16U #define VK_KHR_GLOBAL_PRIORITY_SPEC_VERSION 1 @@ -13112,6 +13471,105 @@ typedef struct VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT { +#define VK_EXT_surface_maintenance1 1 +#define VK_EXT_SURFACE_MAINTENANCE_1_SPEC_VERSION 1 +#define VK_EXT_SURFACE_MAINTENANCE_1_EXTENSION_NAME "VK_EXT_surface_maintenance1" + +typedef enum VkPresentScalingFlagBitsEXT { + VK_PRESENT_SCALING_ONE_TO_ONE_BIT_EXT = 0x00000001, + VK_PRESENT_SCALING_ASPECT_RATIO_STRETCH_BIT_EXT = 0x00000002, + VK_PRESENT_SCALING_STRETCH_BIT_EXT = 0x00000004, + VK_PRESENT_SCALING_FLAG_BITS_MAX_ENUM_EXT = 0x7FFFFFFF +} VkPresentScalingFlagBitsEXT; +typedef VkFlags VkPresentScalingFlagsEXT; + +typedef enum VkPresentGravityFlagBitsEXT { + VK_PRESENT_GRAVITY_MIN_BIT_EXT = 0x00000001, + VK_PRESENT_GRAVITY_MAX_BIT_EXT = 0x00000002, + VK_PRESENT_GRAVITY_CENTERED_BIT_EXT = 0x00000004, + VK_PRESENT_GRAVITY_FLAG_BITS_MAX_ENUM_EXT = 0x7FFFFFFF +} VkPresentGravityFlagBitsEXT; +typedef VkFlags VkPresentGravityFlagsEXT; +typedef struct VkSurfacePresentModeEXT { + VkStructureType sType; + void* pNext; + VkPresentModeKHR presentMode; +} VkSurfacePresentModeEXT; + +typedef struct VkSurfacePresentScalingCapabilitiesEXT { + VkStructureType sType; + void* pNext; + VkPresentScalingFlagsEXT supportedPresentScaling; + VkPresentGravityFlagsEXT supportedPresentGravityX; + VkPresentGravityFlagsEXT supportedPresentGravityY; + VkExtent2D minScaledImageExtent; + VkExtent2D maxScaledImageExtent; +} VkSurfacePresentScalingCapabilitiesEXT; + +typedef struct VkSurfacePresentModeCompatibilityEXT { + VkStructureType sType; + void* pNext; + uint32_t presentModeCount; + VkPresentModeKHR* pPresentModes; +} VkSurfacePresentModeCompatibilityEXT; + + + +#define VK_EXT_swapchain_maintenance1 1 +#define VK_EXT_SWAPCHAIN_MAINTENANCE_1_SPEC_VERSION 1 +#define VK_EXT_SWAPCHAIN_MAINTENANCE_1_EXTENSION_NAME "VK_EXT_swapchain_maintenance1" +typedef struct VkPhysicalDeviceSwapchainMaintenance1FeaturesEXT { + VkStructureType sType; + void* pNext; + VkBool32 swapchainMaintenance1; +} VkPhysicalDeviceSwapchainMaintenance1FeaturesEXT; + +typedef struct VkSwapchainPresentFenceInfoEXT { + VkStructureType sType; + void* pNext; + uint32_t swapchainCount; + const VkFence* pFences; +} VkSwapchainPresentFenceInfoEXT; + +typedef struct VkSwapchainPresentModesCreateInfoEXT { + VkStructureType sType; + void* pNext; + uint32_t presentModeCount; + const VkPresentModeKHR* pPresentModes; +} VkSwapchainPresentModesCreateInfoEXT; + +typedef struct VkSwapchainPresentModeInfoEXT { + VkStructureType sType; + void* pNext; + uint32_t swapchainCount; + const VkPresentModeKHR* pPresentModes; +} VkSwapchainPresentModeInfoEXT; + +typedef struct VkSwapchainPresentScalingCreateInfoEXT { + VkStructureType sType; + const void* pNext; + VkPresentScalingFlagsEXT scalingBehavior; + VkPresentGravityFlagsEXT presentGravityX; + VkPresentGravityFlagsEXT presentGravityY; +} VkSwapchainPresentScalingCreateInfoEXT; + +typedef struct VkReleaseSwapchainImagesInfoEXT { + VkStructureType sType; + const void* pNext; + VkSwapchainKHR swapchain; + uint32_t imageIndexCount; + const uint32_t* pImageIndices; +} VkReleaseSwapchainImagesInfoEXT; + +typedef VkResult (VKAPI_PTR *PFN_vkReleaseSwapchainImagesEXT)(VkDevice device, const VkReleaseSwapchainImagesInfoEXT* pReleaseInfo); + +#ifndef VK_NO_PROTOTYPES +VKAPI_ATTR VkResult VKAPI_CALL vkReleaseSwapchainImagesEXT( + VkDevice device, + const VkReleaseSwapchainImagesInfoEXT* pReleaseInfo); +#endif + + #define VK_EXT_shader_demote_to_helper_invocation 1 #define VK_EXT_SHADER_DEMOTE_TO_HELPER_INVOCATION_SPEC_VERSION 1 #define VK_EXT_SHADER_DEMOTE_TO_HELPER_INVOCATION_EXTENSION_NAME "VK_EXT_shader_demote_to_helper_invocation" @@ -14964,6 +15422,41 @@ VKAPI_ATTR void VKAPI_CALL vkGetMicromapBuildSizesEXT( #define VK_EXT_LOAD_STORE_OP_NONE_EXTENSION_NAME "VK_EXT_load_store_op_none" +#define VK_HUAWEI_cluster_culling_shader 1 +#define VK_HUAWEI_CLUSTER_CULLING_SHADER_SPEC_VERSION 1 +#define VK_HUAWEI_CLUSTER_CULLING_SHADER_EXTENSION_NAME "VK_HUAWEI_cluster_culling_shader" +typedef struct VkPhysicalDeviceClusterCullingShaderFeaturesHUAWEI { + VkStructureType sType; + void* pNext; + VkBool32 clustercullingShader; + VkBool32 multiviewClusterCullingShader; +} VkPhysicalDeviceClusterCullingShaderFeaturesHUAWEI; + +typedef struct VkPhysicalDeviceClusterCullingShaderPropertiesHUAWEI { + VkStructureType sType; + void* pNext; + uint32_t maxWorkGroupCount[3]; + uint32_t maxWorkGroupSize[3]; + uint32_t maxOutputClusterCount; +} VkPhysicalDeviceClusterCullingShaderPropertiesHUAWEI; + +typedef void (VKAPI_PTR *PFN_vkCmdDrawClusterHUAWEI)(VkCommandBuffer commandBuffer, uint32_t groupCountX, uint32_t groupCountY, uint32_t groupCountZ); +typedef void (VKAPI_PTR *PFN_vkCmdDrawClusterIndirectHUAWEI)(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset); + +#ifndef VK_NO_PROTOTYPES +VKAPI_ATTR void VKAPI_CALL vkCmdDrawClusterHUAWEI( + VkCommandBuffer commandBuffer, + uint32_t groupCountX, + uint32_t groupCountY, + uint32_t groupCountZ); + +VKAPI_ATTR void VKAPI_CALL vkCmdDrawClusterIndirectHUAWEI( + VkCommandBuffer commandBuffer, + VkBuffer buffer, + VkDeviceSize offset); +#endif + + #define VK_EXT_border_color_swizzle 1 #define VK_EXT_BORDER_COLOR_SWIZZLE_SPEC_VERSION 1 #define VK_EXT_BORDER_COLOR_SWIZZLE_EXTENSION_NAME "VK_EXT_border_color_swizzle" @@ -15542,14 +16035,14 @@ typedef enum VkDirectDriverLoadingModeLUNARG { VK_DIRECT_DRIVER_LOADING_MODE_MAX_ENUM_LUNARG = 0x7FFFFFFF } VkDirectDriverLoadingModeLUNARG; typedef VkFlags VkDirectDriverLoadingFlagsLUNARG; -typedef PFN_vkVoidFunction (VKAPI_PTR *PFN_vkGetInstanceProcAddr)( +typedef PFN_vkVoidFunction (VKAPI_PTR *PFN_vkGetInstanceProcAddrLUNARG)( VkInstance instance, const char* pName); typedef struct VkDirectDriverLoadingInfoLUNARG { VkStructureType sType; void* pNext; VkDirectDriverLoadingFlagsLUNARG flags; - PFN_vkGetInstanceProcAddr pfnGetInstanceProcAddr; + PFN_vkGetInstanceProcAddrLUNARG pfnGetInstanceProcAddr; } VkDirectDriverLoadingInfoLUNARG; typedef struct VkDirectDriverLoadingListLUNARG { diff --git a/ext/vulkan/vulkan_profiles.h b/ext/vulkan/vulkan_profiles.h index d82b8825f6..9d9e93d36a 100644 --- a/ext/vulkan/vulkan_profiles.h +++ b/ext/vulkan/vulkan_profiles.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2021-2022 LunarG, Inc. + * Copyright (c) 2021-2023 LunarG, Inc. * * Licensed under the Apache License, Version 2.0 (the "License") * you may not use this file except in compliance with the License. @@ -52,10 +52,44 @@ defined(VK_KHR_variable_pointers) #define VP_ANDROID_baseline_2021 1 #define VP_ANDROID_BASELINE_2021_NAME "VP_ANDROID_baseline_2021" -#define VP_ANDROID_BASELINE_2021_SPEC_VERSION 1 +#define VP_ANDROID_BASELINE_2021_SPEC_VERSION 2 #define VP_ANDROID_BASELINE_2021_MIN_API_VERSION VK_MAKE_VERSION(1, 0, 68) #endif +#if defined(VK_VERSION_1_1) && \ + defined(VK_ANDROID_external_memory_android_hardware_buffer) && \ + defined(VK_EXT_queue_family_foreign) && \ + defined(VK_EXT_swapchain_colorspace) && \ + defined(VK_GOOGLE_display_timing) && \ + defined(VK_KHR_android_surface) && \ + defined(VK_KHR_create_renderpass2) && \ + defined(VK_KHR_dedicated_allocation) && \ + defined(VK_KHR_descriptor_update_template) && \ + defined(VK_KHR_driver_properties) && \ + defined(VK_KHR_external_fence) && \ + defined(VK_KHR_external_fence_capabilities) && \ + defined(VK_KHR_external_fence_fd) && \ + defined(VK_KHR_external_memory) && \ + defined(VK_KHR_external_memory_capabilities) && \ + defined(VK_KHR_external_semaphore) && \ + defined(VK_KHR_external_semaphore_capabilities) && \ + defined(VK_KHR_external_semaphore_fd) && \ + defined(VK_KHR_get_memory_requirements2) && \ + defined(VK_KHR_get_physical_device_properties2) && \ + defined(VK_KHR_get_surface_capabilities2) && \ + defined(VK_KHR_incremental_present) && \ + defined(VK_KHR_maintenance1) && \ + defined(VK_KHR_sampler_mirror_clamp_to_edge) && \ + defined(VK_KHR_storage_buffer_storage_class) && \ + defined(VK_KHR_surface) && \ + defined(VK_KHR_swapchain) && \ + defined(VK_KHR_variable_pointers) +#define VP_ANDROID_baseline_2022 1 +#define VP_ANDROID_BASELINE_2022_NAME "VP_ANDROID_baseline_2022" +#define VP_ANDROID_BASELINE_2022_SPEC_VERSION 1 +#define VP_ANDROID_BASELINE_2022_MIN_API_VERSION VK_MAKE_VERSION(1, 1, 106) +#endif + #if defined(VK_VERSION_1_3) && \ defined(VK_KHR_global_priority) #define VP_KHR_roadmap_2022 1 diff --git a/headless/SDLHeadlessHost.cpp b/headless/SDLHeadlessHost.cpp index 13f9ad33fc..9960b01364 100644 --- a/headless/SDLHeadlessHost.cpp +++ b/headless/SDLHeadlessHost.cpp @@ -83,7 +83,6 @@ public: void StopThread() override { if (renderManager_) { - renderManager_->WaitUntilQueueIdle(); renderManager_->StopThread(); } } @@ -167,7 +166,7 @@ bool GLDummyGraphicsContext::InitFromRenderThread(std::string *errorMessage) { _assert_(success); renderManager_->SetSwapFunction([&]() { SDL_GL_SwapWindow(screen_); - }); + }, false); return success; } diff --git a/ios/ViewController.mm b/ios/ViewController.mm index c90c30a22a..ed34f7391f 100644 --- a/ios/ViewController.mm +++ b/ios/ViewController.mm @@ -80,7 +80,6 @@ public: } void StopThread() override { - renderManager_->WaitUntilQueueIdle(); renderManager_->StopThread(); } diff --git a/libretro/CMakeLists.txt b/libretro/CMakeLists.txt index d04cc155e5..da76ff3e02 100644 --- a/libretro/CMakeLists.txt +++ b/libretro/CMakeLists.txt @@ -22,8 +22,8 @@ if(ANDROID) endif() if(NOT MSVC) - if (IOS) - target_link_libraries(ppsspp_libretro "-Wl") + if (APPLE OR IOS) + target_link_libraries(ppsspp_libretro "-Wl,-exported_symbols_list,${CMAKE_CURRENT_SOURCE_DIR}/libretro.osx.def") else() target_link_libraries(ppsspp_libretro "-Wl,-Bsymbolic") endif() diff --git a/libretro/LibretroGLContext.h b/libretro/LibretroGLContext.h index 5c6ded1d6e..66d8d641c7 100644 --- a/libretro/LibretroGLContext.h +++ b/libretro/LibretroGLContext.h @@ -28,7 +28,6 @@ public: bool ThreadFrame() override { return renderManager_->ThreadFrame(); } void ThreadEnd() override { renderManager_->ThreadEnd(); } void StopThread() override { - renderManager_->WaitUntilQueueIdle(); renderManager_->StopThread(); } diff --git a/libretro/LibretroGLCoreContext.h b/libretro/LibretroGLCoreContext.h index bb8d5e460f..dbe65dc4ae 100644 --- a/libretro/LibretroGLCoreContext.h +++ b/libretro/LibretroGLCoreContext.h @@ -24,7 +24,6 @@ public: bool ThreadFrame() override { return renderManager_->ThreadFrame(); } void ThreadEnd() override { renderManager_->ThreadEnd(); } void StopThread() override { - renderManager_->WaitUntilQueueIdle(); renderManager_->StopThread(); } diff --git a/libretro/LibretroVulkanContext.cpp b/libretro/LibretroVulkanContext.cpp index ff9180cecf..c7072df17b 100644 --- a/libretro/LibretroVulkanContext.cpp +++ b/libretro/LibretroVulkanContext.cpp @@ -61,6 +61,8 @@ static bool create_device(retro_vulkan_context *context, VkInstance instance, Vk vk->InitSurface(WINDOWSYSTEM_WIN32, nullptr, nullptr); #elif defined(__ANDROID__) vk->InitSurface(WINDOWSYSTEM_ANDROID, nullptr, nullptr); +#elif defined(VK_USE_PLATFORM_METAL_EXT) + vk->InitSurface(WINDOWSYSTEM_METAL_EXT, nullptr, nullptr); #elif defined(VK_USE_PLATFORM_XLIB_KHR) vk->InitSurface(WINDOWSYSTEM_XLIB, nullptr, nullptr); #elif defined(VK_USE_PLATFORM_XCB_KHR) diff --git a/libretro/Makefile.common b/libretro/Makefile.common index 2d8a9c2ed3..4095102bba 100644 --- a/libretro/Makefile.common +++ b/libretro/Makefile.common @@ -21,6 +21,7 @@ INCFLAGS += \ -I$(EXTDIR)/glslang-build \ -I$(EXTDIR)/native \ -I$(EXTDIR)/zlib \ + -I$(EXTDIR)/cpu_features/include \ -I$(ZSTDDIR) \ -I$(EXTDIR)/snappy \ -I$(FFMPEGDIR) \ @@ -191,6 +192,32 @@ SOURCES_C += \ $(EXTDIR)/libpng17/pngwtran.c \ $(EXTDIR)/libpng17/pngwutil.c +COREFLAGS += -DHAVE_STRONG_GETAUXVAL -DSTACK_LINE_READER_BUFFER_SIZE=1024 +ifneq (,$(findstring osx,$(platform))) +ifneq (,$(findstring x86,$(TARGET_ARCH))) + COREFLAGS += -DHAVE_SYSCTLBYNAME +endif +endif +SOURCES_C += \ + $(EXTDIR)/cpu_features/src/filesystem.c \ + $(EXTDIR)/cpu_features/src/impl_aarch64_linux_or_android.c \ + $(EXTDIR)/cpu_features/src/impl_arm_linux_or_android.c \ + $(EXTDIR)/cpu_features/src/impl_mips_linux_or_android.c \ + $(EXTDIR)/cpu_features/src/impl_ppc_linux.c \ + $(EXTDIR)/cpu_features/src/impl_riscv_linux.c \ + $(EXTDIR)/cpu_features/src/impl_s390x_linux.c \ + $(EXTDIR)/cpu_features/src/impl_x86_freebsd.c \ + $(EXTDIR)/cpu_features/src/impl_x86_linux_or_android.c \ + $(EXTDIR)/cpu_features/src/impl_x86_macos.c \ + $(EXTDIR)/cpu_features/src/impl_x86_windows.c \ + $(EXTDIR)/cpu_features/src/stack_line_reader.c \ + $(EXTDIR)/cpu_features/src/string_view.c + +ifneq ($(PLATFORM_EXT), win32) +SOURCES_C += \ + $(EXTDIR)/cpu_features/src/hwcaps.c +endif + SOURCES_CXX += \ $(EXTDIR)/vma/vk_mem_alloc.cpp diff --git a/libretro/libretro.osx.def b/libretro/libretro.osx.def new file mode 100644 index 0000000000..53a556a601 --- /dev/null +++ b/libretro/libretro.osx.def @@ -0,0 +1,27 @@ +#LIBRARY "libretro" +#EXPORTS +_retro_set_environment +_retro_set_video_refresh +_retro_set_audio_sample +_retro_set_audio_sample_batch +_retro_set_input_poll +_retro_set_input_state +_retro_init +_retro_deinit +_retro_api_version +_retro_get_system_info +_retro_get_system_av_info +_retro_set_controller_port_device +_retro_reset +_retro_run +_retro_serialize_size +_retro_serialize +_retro_unserialize +_retro_cheat_reset +_retro_cheat_set +_retro_load_game +_retro_load_game_special +_retro_unload_game +_retro_get_region +_retro_get_memory_data +_retro_get_memory_size diff --git a/libretro/libretro_vulkan.cpp b/libretro/libretro_vulkan.cpp index 99fe6ee1ee..8fc3faabd3 100644 --- a/libretro/libretro_vulkan.cpp +++ b/libretro/libretro_vulkan.cpp @@ -355,6 +355,9 @@ VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetInstanceProcAddr_libretro(VkInstan #ifdef __ANDROID__ || !strcmp(pName, "vkCreateAndroidSurfaceKHR") #endif +#ifdef VK_USE_PLATFORM_METAL_EXT + || !strcmp(pName, "vkCreateMetalSurfaceEXT") +#endif #ifdef VK_USE_PLATFORM_XLIB_KHR || !strcmp(pName, "vkCreateXlibSurfaceKHR") #endif