mirror of
https://github.com/izzy2lost/WeeU.git
synced 2026-07-06 00:19:59 -07:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b1c70588fe | ||
|
|
4442efa8ac | ||
|
|
e9d10a9581 | ||
|
|
2842615edb | ||
|
|
94b179ef5a | ||
|
|
7f21104b54 | ||
|
|
bbd8d6d5ac | ||
|
|
4d68446f14 | ||
|
|
a0e69ffbbd | ||
|
|
c3d6cad428 | ||
|
|
58c7b56c60 | ||
|
|
be287a1f4e | ||
|
|
5adb1e9618 |
@@ -13,6 +13,7 @@
|
|||||||
*.out
|
*.out
|
||||||
*.app
|
*.app
|
||||||
.vs
|
.vs
|
||||||
|
.vscode
|
||||||
.idea/
|
.idea/
|
||||||
|
|
||||||
build/
|
build/
|
||||||
|
|||||||
@@ -57,21 +57,32 @@ You can use it by replacing the step 3 with the following:
|
|||||||
- If step 3 is still failing or if you're not able to find the cause, please make an issue on our Github about it!
|
- If step 3 is still failing or if you're not able to find the cause, please make an issue on our Github about it!
|
||||||
- If step 4 gives you an error that contains something like `main.cpp.o: in function 'std::__cxx11::basic_string...`, you likely are experiencing a clang-14 issue. This can only be fixed by either lowering the clang version or using GCC, see below.
|
- If step 4 gives you an error that contains something like `main.cpp.o: in function 'std::__cxx11::basic_string...`, you likely are experiencing a clang-14 issue. This can only be fixed by either lowering the clang version or using GCC, see below.
|
||||||
- If step 4 gives you a different error, you could report it to this repo or try using GCC. Just make sure your standard library and compilers are updated since Cemu uses a lot of modern features!
|
- If step 4 gives you a different error, you could report it to this repo or try using GCC. Just make sure your standard library and compilers are updated since Cemu uses a lot of modern features!
|
||||||
- If step 4 gives you undefined libdecor_xx, you are likely experiencing an issue with sdl2 package that comes with vcpkg. Delete sdl2 from vcpkg.json in source file and recompile.
|
- If step 4 gives you undefined libdecor_xx, you are likely experiencing an issue with sdl2 package that comes with vcpkg. Delete sdl2 from vcpkg.json in source file and recompile.
|
||||||
|
- If step 3 fails during rebuild after `git pull` with an error that mentions RPATH, add this to the end of step 3: `-DCMAKE_BUILD_WITH_INSTALL_RPATH=ON`
|
||||||
|
|
||||||
## MacOS
|
## macOS
|
||||||
|
|
||||||
To compile Cemu, a recent enough compiler and STL with C++20 support is required! LLVM 13 and
|
To compile Cemu, a recent enough compiler and STL with C++20 support is required! LLVM 13 and
|
||||||
below, built in LLVM, and Xcode LLVM don't support the C++20 feature set required. Currently,
|
below, built in LLVM, and Xcode LLVM don't support the C++20 feature set required. Currently,
|
||||||
LLVM 15 isn't supported due to compatibility issues with Boost dependency. The OpenGL graphics
|
LLVM 15 isn't supported due to compatibility issues with Boost dependency. The OpenGL graphics
|
||||||
API isn't support on MacOS, Vulkan must be used. Additionally Vulkan must be used through the
|
API isn't support on macOS, Vulkan must be used. Additionally Vulkan must be used through the
|
||||||
Molten-VK compatibility layer.
|
Molten-VK compatibility layer
|
||||||
|
|
||||||
|
### On Apple Silicon Macs, Rosetta 2 and the x86_64 version of Homebrew must be used
|
||||||
|
|
||||||
|
You can skip this section if you have an Intel Mac. Every time you compile, you need to perform steps 2.
|
||||||
|
|
||||||
|
1. `softwareupdate --install-rosetta` # Install Rosetta 2 if you don't have it. This only has to be done once
|
||||||
|
2. `arch -x86_64 zsh` # run an x64 shell
|
||||||
|
|
||||||
### Installing brew
|
### Installing brew
|
||||||
`/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"`
|
|
||||||
|
1. `/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"`
|
||||||
|
2. `eval "$(/usr/local/Homebrew/bin/brew shellenv)"` # set x86_64 brew env
|
||||||
|
|
||||||
### Installing dependencies
|
### Installing dependencies
|
||||||
`brew install git cmake llvm@14 ninja nasm molten-vk`
|
|
||||||
|
`brew install boost git cmake llvm@14 ninja nasm molten-vk`
|
||||||
|
|
||||||
### Build Cemu using cmake and clang
|
### Build Cemu using cmake and clang
|
||||||
1. `git clone --recursive https://github.com/cemu-project/Cemu`
|
1. `git clone --recursive https://github.com/cemu-project/Cemu`
|
||||||
|
|||||||
+8
-1
@@ -6,7 +6,14 @@ option(MACOS_BUNDLE "The executable when built on macOS will be created as an ap
|
|||||||
set(EXPERIMENTAL_VERSION "" CACHE STRING "") # used by CI script to set experimental version
|
set(EXPERIMENTAL_VERSION "" CACHE STRING "") # used by CI script to set experimental version
|
||||||
|
|
||||||
if (EXPERIMENTAL_VERSION)
|
if (EXPERIMENTAL_VERSION)
|
||||||
add_definitions(-DEMULATOR_VERSION_MINOR=${EXPERIMENTAL_VERSION})
|
add_definitions(-DEMULATOR_VERSION_MINOR=${EXPERIMENTAL_VERSION})
|
||||||
|
execute_process(
|
||||||
|
COMMAND git log --format=%h -1
|
||||||
|
WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}
|
||||||
|
OUTPUT_VARIABLE GIT_HASH
|
||||||
|
OUTPUT_STRIP_TRAILING_WHITESPACE
|
||||||
|
)
|
||||||
|
add_definitions(-DEMULATOR_HASH=${GIT_HASH})
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (ENABLE_VCPKG)
|
if (ENABLE_VCPKG)
|
||||||
|
|||||||
Vendored
+2
-1
@@ -23,7 +23,7 @@ mkdir -p AppDir/usr/share/icons/hicolor/scalable/apps
|
|||||||
mkdir -p AppDir/usr/lib
|
mkdir -p AppDir/usr/lib
|
||||||
|
|
||||||
cp -r bin AppDir/usr/
|
cp -r bin AppDir/usr/
|
||||||
cp /usr/lib/x86_64-linux-gnu/{libsepol.so.1,libffi.so.7,libpcre.so.3,libGLU.so.1} AppDir/usr/lib
|
cp /usr/lib/x86_64-linux-gnu/{libsepol.so.1,libffi.so.7,libpcre.so.3,libGLU.so.1,libthai.so.0} AppDir/usr/lib
|
||||||
|
|
||||||
chmod +x AppDir/usr/bin/Cemu
|
chmod +x AppDir/usr/bin/Cemu
|
||||||
#chmod +x AppDir/AppRun
|
#chmod +x AppDir/AppRun
|
||||||
@@ -44,6 +44,7 @@ fi
|
|||||||
|
|
||||||
echo "Cemu Version Cemu-${GITVERSION}"
|
echo "Cemu Version Cemu-${GITVERSION}"
|
||||||
rm AppDir/usr/lib/libwayland-client.so.0
|
rm AppDir/usr/lib/libwayland-client.so.0
|
||||||
|
echo "export LC_ALL=C" >> AppDir/apprun-hooks/linuxdeploy-plugin-gtk.sh
|
||||||
VERSION=${GITVERSION} ./mkappimage.AppImage --appimage-extract-and-run "$GITHUB_WORKSPACE"/AppDir
|
VERSION=${GITVERSION} ./mkappimage.AppImage --appimage-extract-and-run "$GITHUB_WORKSPACE"/AppDir
|
||||||
|
|
||||||
mkdir -p "$GITHUB_WORKSPACE"/artifacts/
|
mkdir -p "$GITHUB_WORKSPACE"/artifacts/
|
||||||
|
|||||||
@@ -122,6 +122,12 @@ target_link_libraries(CemuBin PRIVATE
|
|||||||
SDL2::SDL2
|
SDL2::SDL2
|
||||||
)
|
)
|
||||||
|
|
||||||
|
if(UNIX AND NOT APPLE)
|
||||||
|
# due to nasm output some linkers will make stack executable.
|
||||||
|
# cemu does not require this so we explicity disable it.
|
||||||
|
target_link_options(CemuBin PRIVATE -z noexecstack)
|
||||||
|
endif()
|
||||||
|
|
||||||
if (ENABLE_WXWIDGETS)
|
if (ENABLE_WXWIDGETS)
|
||||||
target_link_libraries(CemuBin PRIVATE wx::base wx::core)
|
target_link_libraries(CemuBin PRIVATE wx::base wx::core)
|
||||||
endif()
|
endif()
|
||||||
|
|||||||
@@ -123,8 +123,8 @@ void LatteOverlay_renderOverlay(ImVec2& position, ImVec2& pivot, sint32 directio
|
|||||||
g_renderer->AppendOverlayDebugInfo();
|
g_renderer->AppendOverlayDebugInfo();
|
||||||
|
|
||||||
position.y += (ImGui::GetWindowSize().y + 10.0f) * direction;
|
position.y += (ImGui::GetWindowSize().y + 10.0f) * direction;
|
||||||
ImGui::End();
|
|
||||||
}
|
}
|
||||||
|
ImGui::End();
|
||||||
}
|
}
|
||||||
|
|
||||||
ImGui::PopStyleColor();
|
ImGui::PopStyleColor();
|
||||||
@@ -170,8 +170,8 @@ void LatteOverlay_RenderNotifications(ImVec2& position, ImVec2& pivot, sint32 di
|
|||||||
ImGui::TextUnformatted(s_mii_name.c_str());
|
ImGui::TextUnformatted(s_mii_name.c_str());
|
||||||
|
|
||||||
position.y += (ImGui::GetWindowSize().y + 10.0f) * direction;
|
position.y += (ImGui::GetWindowSize().y + 10.0f) * direction;
|
||||||
ImGui::End();
|
|
||||||
}
|
}
|
||||||
|
ImGui::End();
|
||||||
|
|
||||||
// controller
|
// controller
|
||||||
std::vector<std::pair<int, std::string>> profiles;
|
std::vector<std::pair<int, std::string>> profiles;
|
||||||
@@ -209,8 +209,8 @@ void LatteOverlay_RenderNotifications(ImVec2& position, ImVec2& pivot, sint32 di
|
|||||||
}
|
}
|
||||||
|
|
||||||
position.y += (ImGui::GetWindowSize().y + 10.0f) * direction;
|
position.y += (ImGui::GetWindowSize().y + 10.0f) * direction;
|
||||||
ImGui::End();
|
|
||||||
}
|
}
|
||||||
|
ImGui::End();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
s_init_overlay = true;
|
s_init_overlay = true;
|
||||||
@@ -254,10 +254,8 @@ void LatteOverlay_RenderNotifications(ImVec2& position, ImVec2& pivot, sint32 di
|
|||||||
}
|
}
|
||||||
|
|
||||||
position.y += (ImGui::GetWindowSize().y + 10.0f) * direction;
|
position.y += (ImGui::GetWindowSize().y + 10.0f) * direction;
|
||||||
ImGui::End();
|
|
||||||
}
|
}
|
||||||
|
ImGui::End();
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -306,8 +304,8 @@ void LatteOverlay_RenderNotifications(ImVec2& position, ImVec2& pivot, sint32 di
|
|||||||
}
|
}
|
||||||
|
|
||||||
position.y += (ImGui::GetWindowSize().y + 10.0f) * direction;
|
position.y += (ImGui::GetWindowSize().y + 10.0f) * direction;
|
||||||
ImGui::End();
|
|
||||||
}
|
}
|
||||||
|
ImGui::End();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -363,8 +361,8 @@ void LatteOverlay_RenderNotifications(ImVec2& position, ImVec2& pivot, sint32 di
|
|||||||
}
|
}
|
||||||
|
|
||||||
position.y += (ImGui::GetWindowSize().y + 10.0f) * direction;
|
position.y += (ImGui::GetWindowSize().y + 10.0f) * direction;
|
||||||
ImGui::End();
|
|
||||||
}
|
}
|
||||||
|
ImGui::End();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -435,8 +433,8 @@ void LatteOverlay_RenderNotifications(ImVec2& position, ImVec2& pivot, sint32 di
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
position.y += (ImGui::GetWindowSize().y + 10.0f) * direction;
|
position.y += (ImGui::GetWindowSize().y + 10.0f) * direction;
|
||||||
ImGui::End();
|
|
||||||
}
|
}
|
||||||
|
ImGui::End();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -475,10 +473,9 @@ void LatteOverlay_RenderNotifications(ImVec2& position, ImVec2& pivot, sint32 di
|
|||||||
}
|
}
|
||||||
|
|
||||||
position.y += (ImGui::GetWindowSize().y + 10.0f) * direction;
|
position.y += (ImGui::GetWindowSize().y + 10.0f) * direction;
|
||||||
ImGui::End();
|
|
||||||
}
|
}
|
||||||
|
ImGui::End();
|
||||||
}
|
}
|
||||||
|
|
||||||
ImGui::PopStyleColor();
|
ImGui::PopStyleColor();
|
||||||
ImGui::PopFont();
|
ImGui::PopFont();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -350,10 +350,10 @@ void LatteShaderCache_load()
|
|||||||
|
|
||||||
ImGui::GetWindowDrawList()->AddImage(g_shaderCacheLoaderState.textureTVId, ImVec2(paddingLeftAndRight, paddingTopAndBottom), ImVec2(io.DisplaySize.x-paddingLeftAndRight, io.DisplaySize.y-paddingTopAndBottom), { 0,1 }, { 1,0 });
|
ImGui::GetWindowDrawList()->AddImage(g_shaderCacheLoaderState.textureTVId, ImVec2(paddingLeftAndRight, paddingTopAndBottom), ImVec2(io.DisplaySize.x-paddingLeftAndRight, io.DisplaySize.y-paddingTopAndBottom), { 0,1 }, { 1,0 });
|
||||||
}
|
}
|
||||||
ImGui::End();
|
|
||||||
ImGui::PopStyleVar(2);
|
|
||||||
g_renderer->ImguiEnd();
|
|
||||||
}
|
}
|
||||||
|
ImGui::End();
|
||||||
|
ImGui::PopStyleVar(2);
|
||||||
|
g_renderer->ImguiEnd();
|
||||||
}
|
}
|
||||||
|
|
||||||
g_renderer->BeginFrame(false);
|
g_renderer->BeginFrame(false);
|
||||||
@@ -365,7 +365,7 @@ void LatteShaderCache_load()
|
|||||||
ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, { 0,0 });
|
ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, { 0,0 });
|
||||||
|
|
||||||
if (ImGui::Begin("Background texture2", nullptr, kPopupFlags))
|
if (ImGui::Begin("Background texture2", nullptr, kPopupFlags))
|
||||||
{
|
{
|
||||||
if (g_shaderCacheLoaderState.textureDRCId)
|
if (g_shaderCacheLoaderState.textureDRCId)
|
||||||
{
|
{
|
||||||
float imageDisplayWidth = io.DisplaySize.x;
|
float imageDisplayWidth = io.DisplaySize.x;
|
||||||
@@ -383,11 +383,11 @@ void LatteShaderCache_load()
|
|||||||
|
|
||||||
ImGui::GetWindowDrawList()->AddImage(g_shaderCacheLoaderState.textureDRCId, ImVec2(paddingLeftAndRight, paddingTopAndBottom), ImVec2(io.DisplaySize.x-paddingLeftAndRight, io.DisplaySize.y-paddingTopAndBottom), { 0,1 }, { 1,0 });
|
ImGui::GetWindowDrawList()->AddImage(g_shaderCacheLoaderState.textureDRCId, ImVec2(paddingLeftAndRight, paddingTopAndBottom), ImVec2(io.DisplaySize.x-paddingLeftAndRight, io.DisplaySize.y-paddingTopAndBottom), { 0,1 }, { 1,0 });
|
||||||
}
|
}
|
||||||
ImGui::End();
|
}
|
||||||
ImGui::PopStyleVar(2);
|
ImGui::End();
|
||||||
g_renderer->ImguiEnd();
|
ImGui::PopStyleVar(2);
|
||||||
}
|
g_renderer->ImguiEnd();
|
||||||
}
|
}
|
||||||
|
|
||||||
g_renderer->SwapBuffers(true, true);
|
g_renderer->SwapBuffers(true, true);
|
||||||
}
|
}
|
||||||
@@ -452,8 +452,8 @@ void LatteShaderCache_ShowProgress(const std::function <bool(void)>& loadUpdateF
|
|||||||
}
|
}
|
||||||
|
|
||||||
ImGui::GetWindowDrawList()->AddImage(g_shaderCacheLoaderState.textureTVId, ImVec2(paddingLeftAndRight, paddingTopAndBottom), ImVec2(io.DisplaySize.x-paddingLeftAndRight, io.DisplaySize.y-paddingTopAndBottom), { 0,1 }, { 1,0 });
|
ImGui::GetWindowDrawList()->AddImage(g_shaderCacheLoaderState.textureTVId, ImVec2(paddingLeftAndRight, paddingTopAndBottom), ImVec2(io.DisplaySize.x-paddingLeftAndRight, io.DisplaySize.y-paddingTopAndBottom), { 0,1 }, { 1,0 });
|
||||||
ImGui::End();
|
|
||||||
}
|
}
|
||||||
|
ImGui::End();
|
||||||
ImGui::PopStyleVar(2);
|
ImGui::PopStyleVar(2);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -502,8 +502,8 @@ void LatteShaderCache_ShowProgress(const std::function <bool(void)>& loadUpdateF
|
|||||||
text = fmt::format("{}/{} ({}%)", g_shaderCacheLoaderState.loadedShaderFiles, g_shaderCacheLoaderState.shaderFileCount, (int)(percentLoaded * 100));
|
text = fmt::format("{}/{} ({}%)", g_shaderCacheLoaderState.loadedShaderFiles, g_shaderCacheLoaderState.shaderFileCount, (int)(percentLoaded * 100));
|
||||||
ImGui::SetCursorPosX(width - ImGui::CalcTextSize(text.c_str()).x / 2);
|
ImGui::SetCursorPosX(width - ImGui::CalcTextSize(text.c_str()).x / 2);
|
||||||
ImGui::Text("%s", text.c_str());
|
ImGui::Text("%s", text.c_str());
|
||||||
ImGui::End();
|
|
||||||
}
|
}
|
||||||
|
ImGui::End();
|
||||||
ImGui::PopFont();
|
ImGui::PopFont();
|
||||||
ImGui::PopStyleColor(2);
|
ImGui::PopStyleColor(2);
|
||||||
|
|
||||||
@@ -529,13 +529,11 @@ void LatteShaderCache_ShowProgress(const std::function <bool(void)>& loadUpdateF
|
|||||||
ImGui::Text("Geometry shaders");
|
ImGui::Text("Geometry shaders");
|
||||||
ImGui::SameLine(offset);
|
ImGui::SameLine(offset);
|
||||||
ImGui::Text("%d", shaderCacheScreenStats.geometryShaderCount);
|
ImGui::Text("%d", shaderCacheScreenStats.geometryShaderCount);
|
||||||
|
|
||||||
ImGui::End();
|
|
||||||
}
|
}
|
||||||
|
ImGui::End();
|
||||||
ImGui::PopStyleColor();
|
ImGui::PopStyleColor();
|
||||||
ImGui::PopFont();
|
ImGui::PopFont();
|
||||||
}
|
}
|
||||||
|
|
||||||
g_renderer->ImguiEnd();
|
g_renderer->ImguiEnd();
|
||||||
lastFrameUpdate = tick_cached();
|
lastFrameUpdate = tick_cached();
|
||||||
}
|
}
|
||||||
@@ -565,11 +563,11 @@ void LatteShaderCache_ShowProgress(const std::function <bool(void)>& loadUpdateF
|
|||||||
}
|
}
|
||||||
ImGui::GetWindowDrawList()->AddImage(g_shaderCacheLoaderState.textureDRCId, ImVec2(paddingLeftAndRight, paddingTopAndBottom), ImVec2(io.DisplaySize.x-paddingLeftAndRight, io.DisplaySize.y-paddingTopAndBottom), { 0,1 }, { 1,0 });
|
ImGui::GetWindowDrawList()->AddImage(g_shaderCacheLoaderState.textureDRCId, ImVec2(paddingLeftAndRight, paddingTopAndBottom), ImVec2(io.DisplaySize.x-paddingLeftAndRight, io.DisplaySize.y-paddingTopAndBottom), { 0,1 }, { 1,0 });
|
||||||
}
|
}
|
||||||
ImGui::End();
|
}
|
||||||
ImGui::PopStyleVar(2);
|
ImGui::End();
|
||||||
g_renderer->ImguiEnd();
|
ImGui::PopStyleVar(2);
|
||||||
}
|
g_renderer->ImguiEnd();
|
||||||
}
|
}
|
||||||
|
|
||||||
// finish frame
|
// finish frame
|
||||||
g_renderer->SwapBuffers(true, true);
|
g_renderer->SwapBuffers(true, true);
|
||||||
|
|||||||
@@ -25,8 +25,10 @@
|
|||||||
#define STRINGIFY(X) STRINGIFY2(X)
|
#define STRINGIFY(X) STRINGIFY2(X)
|
||||||
|
|
||||||
#define GLFUNC(__type, __name) __type __name;
|
#define GLFUNC(__type, __name) __type __name;
|
||||||
|
#define EGLFUNC(__type, __name) __type __name;
|
||||||
#include "Common/GLInclude/glFunctions.h"
|
#include "Common/GLInclude/glFunctions.h"
|
||||||
#undef GLFUNC
|
#undef GLFUNC
|
||||||
|
#undef EGLFUNC
|
||||||
|
|
||||||
#include "config/ActiveSettings.h"
|
#include "config/ActiveSettings.h"
|
||||||
#include "config/LaunchSettings.h"
|
#include "config/LaunchSettings.h"
|
||||||
@@ -229,9 +231,17 @@ void LoadOpenGLImports()
|
|||||||
_glXGetProcAddress = (PFNGLXGETPROCADDRESSPROC)dlsym(libGL, "glXGetProcAddressARB");
|
_glXGetProcAddress = (PFNGLXGETPROCADDRESSPROC)dlsym(libGL, "glXGetProcAddressARB");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void* libEGL = dlopen("libEGL.so.1", RTLD_NOW | RTLD_GLOBAL);
|
||||||
|
if(!libEGL)
|
||||||
|
{
|
||||||
|
libGL = dlopen("libEGL.so", RTLD_NOW | RTLD_GLOBAL);
|
||||||
|
}
|
||||||
|
|
||||||
#define GLFUNC(__type, __name) __name = (__type)_GetOpenGLFunction(libGL, _glXGetProcAddress, STRINGIFY(__name));
|
#define GLFUNC(__type, __name) __name = (__type)_GetOpenGLFunction(libGL, _glXGetProcAddress, STRINGIFY(__name));
|
||||||
|
#define EGLFUNC(__type, __name) __name = (__type)dlsym(libEGL, STRINGIFY(__name));
|
||||||
#include "Common/GLInclude/glFunctions.h"
|
#include "Common/GLInclude/glFunctions.h"
|
||||||
#undef GLFUNC
|
#undef GLFUNC
|
||||||
|
#undef EGLFUNC
|
||||||
}
|
}
|
||||||
#elif BOOST_OS_MACOS
|
#elif BOOST_OS_MACOS
|
||||||
void LoadOpenGLImports()
|
void LoadOpenGLImports()
|
||||||
@@ -352,20 +362,6 @@ void OpenGLRenderer::NotifyLatteCommandProcessorIdle()
|
|||||||
glFlush();
|
glFlush();
|
||||||
}
|
}
|
||||||
|
|
||||||
void OpenGLRenderer::UpdateVSyncState()
|
|
||||||
{
|
|
||||||
int configValue = GetConfig().vsync.GetValue();
|
|
||||||
if(m_activeVSyncState != configValue)
|
|
||||||
{
|
|
||||||
#if BOOST_OS_WINDOWS
|
|
||||||
if(wglSwapIntervalEXT)
|
|
||||||
wglSwapIntervalEXT(configValue); // 1 = enabled, 0 = disabled
|
|
||||||
#else
|
|
||||||
cemuLog_log(LogType::Force, "OpenGL vsync not implemented");
|
|
||||||
#endif
|
|
||||||
m_activeVSyncState = configValue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool IsRunningInWine();
|
bool IsRunningInWine();
|
||||||
|
|
||||||
@@ -443,7 +439,6 @@ void OpenGLRenderer::EnableDebugMode()
|
|||||||
void OpenGLRenderer::SwapBuffers(bool swapTV, bool swapDRC)
|
void OpenGLRenderer::SwapBuffers(bool swapTV, bool swapDRC)
|
||||||
{
|
{
|
||||||
GLCanvas_SwapBuffers(swapTV, swapDRC);
|
GLCanvas_SwapBuffers(swapTV, swapDRC);
|
||||||
UpdateVSyncState();
|
|
||||||
|
|
||||||
if (swapTV)
|
if (swapTV)
|
||||||
cleanupAfterFrame();
|
cleanupAfterFrame();
|
||||||
|
|||||||
@@ -168,7 +168,6 @@ private:
|
|||||||
GLuint m_defaultFramebufferId;
|
GLuint m_defaultFramebufferId;
|
||||||
GLuint m_pipeline = 0;
|
GLuint m_pipeline = 0;
|
||||||
|
|
||||||
int m_activeVSyncState{};
|
|
||||||
bool m_isPadViewContext{};
|
bool m_isPadViewContext{};
|
||||||
|
|
||||||
// rendertarget viewport
|
// rendertarget viewport
|
||||||
|
|||||||
@@ -11,14 +11,14 @@ void SwapchainInfoVk::Create(VkPhysicalDevice physicalDevice, VkDevice logicalDe
|
|||||||
m_logicalDevice = logicalDevice;
|
m_logicalDevice = logicalDevice;
|
||||||
const auto details = QuerySwapchainSupport(surface, physicalDevice);
|
const auto details = QuerySwapchainSupport(surface, physicalDevice);
|
||||||
m_surfaceFormat = ChooseSurfaceFormat(details.formats);
|
m_surfaceFormat = ChooseSurfaceFormat(details.formats);
|
||||||
swapchainExtent = ChooseSwapExtent(details.capabilities, getSize());
|
m_actualExtent = ChooseSwapExtent(details.capabilities);
|
||||||
|
|
||||||
// calculate number of swapchain presentation images
|
// calculate number of swapchain presentation images
|
||||||
uint32_t image_count = details.capabilities.minImageCount + 1;
|
uint32_t image_count = details.capabilities.minImageCount + 1;
|
||||||
if (details.capabilities.maxImageCount > 0 && image_count > details.capabilities.maxImageCount)
|
if (details.capabilities.maxImageCount > 0 && image_count > details.capabilities.maxImageCount)
|
||||||
image_count = details.capabilities.maxImageCount;
|
image_count = details.capabilities.maxImageCount;
|
||||||
|
|
||||||
VkSwapchainCreateInfoKHR create_info = CreateSwapchainCreateInfo(surface, details, m_surfaceFormat, image_count, swapchainExtent);
|
VkSwapchainCreateInfoKHR create_info = CreateSwapchainCreateInfo(surface, details, m_surfaceFormat, image_count, m_actualExtent);
|
||||||
create_info.oldSwapchain = nullptr;
|
create_info.oldSwapchain = nullptr;
|
||||||
create_info.imageUsage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
|
create_info.imageUsage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
|
||||||
|
|
||||||
@@ -26,8 +26,6 @@ void SwapchainInfoVk::Create(VkPhysicalDevice physicalDevice, VkDevice logicalDe
|
|||||||
if (result != VK_SUCCESS)
|
if (result != VK_SUCCESS)
|
||||||
UnrecoverableError("Error attempting to create a swapchain");
|
UnrecoverableError("Error attempting to create a swapchain");
|
||||||
|
|
||||||
sizeOutOfDate = false;
|
|
||||||
|
|
||||||
result = vkGetSwapchainImagesKHR(logicalDevice, swapchain, &image_count, nullptr);
|
result = vkGetSwapchainImagesKHR(logicalDevice, swapchain, &image_count, nullptr);
|
||||||
if (result != VK_SUCCESS)
|
if (result != VK_SUCCESS)
|
||||||
UnrecoverableError("Error attempting to retrieve the count of swapchain images");
|
UnrecoverableError("Error attempting to retrieve the count of swapchain images");
|
||||||
@@ -101,8 +99,8 @@ void SwapchainInfoVk::Create(VkPhysicalDevice physicalDevice, VkDevice logicalDe
|
|||||||
framebufferInfo.renderPass = m_swapchainRenderPass;
|
framebufferInfo.renderPass = m_swapchainRenderPass;
|
||||||
framebufferInfo.attachmentCount = 1;
|
framebufferInfo.attachmentCount = 1;
|
||||||
framebufferInfo.pAttachments = attachments;
|
framebufferInfo.pAttachments = attachments;
|
||||||
framebufferInfo.width = swapchainExtent.width;
|
framebufferInfo.width = m_actualExtent.width;
|
||||||
framebufferInfo.height = swapchainExtent.height;
|
framebufferInfo.height = m_actualExtent.height;
|
||||||
framebufferInfo.layers = 1;
|
framebufferInfo.layers = 1;
|
||||||
result = vkCreateFramebuffer(logicalDevice, &framebufferInfo, nullptr, &m_swapchainFramebuffers[i]);
|
result = vkCreateFramebuffer(logicalDevice, &framebufferInfo, nullptr, &m_swapchainFramebuffers[i]);
|
||||||
if (result != VK_SUCCESS)
|
if (result != VK_SUCCESS)
|
||||||
@@ -293,12 +291,12 @@ VkSurfaceFormatKHR SwapchainInfoVk::ChooseSurfaceFormat(const std::vector<VkSurf
|
|||||||
return formats[0];
|
return formats[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
VkExtent2D SwapchainInfoVk::ChooseSwapExtent(const VkSurfaceCapabilitiesKHR& capabilities, const Vector2i& size) const
|
VkExtent2D SwapchainInfoVk::ChooseSwapExtent(const VkSurfaceCapabilitiesKHR& capabilities) const
|
||||||
{
|
{
|
||||||
if (capabilities.currentExtent.width != std::numeric_limits<uint32>::max())
|
if (capabilities.currentExtent.width != std::numeric_limits<uint32>::max())
|
||||||
return capabilities.currentExtent;
|
return capabilities.currentExtent;
|
||||||
|
|
||||||
VkExtent2D actualExtent = { (uint32)size.x, (uint32)size.y };
|
VkExtent2D actualExtent = { (uint32)m_desiredExtent.x, (uint32)m_desiredExtent.y };
|
||||||
actualExtent.width = std::max(capabilities.minImageExtent.width, std::min(capabilities.maxImageExtent.width, actualExtent.width));
|
actualExtent.width = std::max(capabilities.minImageExtent.width, std::min(capabilities.maxImageExtent.width, actualExtent.width));
|
||||||
actualExtent.height = std::max(capabilities.minImageExtent.height, std::min(capabilities.maxImageExtent.height, actualExtent.height));
|
actualExtent.height = std::max(capabilities.minImageExtent.height, std::min(capabilities.maxImageExtent.height, actualExtent.height));
|
||||||
return actualExtent;
|
return actualExtent;
|
||||||
|
|||||||
@@ -42,20 +42,14 @@ struct SwapchainInfoVk
|
|||||||
|
|
||||||
VkPresentModeKHR ChoosePresentMode(const std::vector<VkPresentModeKHR>& modes);
|
VkPresentModeKHR ChoosePresentMode(const std::vector<VkPresentModeKHR>& modes);
|
||||||
VkSurfaceFormatKHR ChooseSurfaceFormat(const std::vector<VkSurfaceFormatKHR>& formats) const;
|
VkSurfaceFormatKHR ChooseSurfaceFormat(const std::vector<VkSurfaceFormatKHR>& formats) const;
|
||||||
VkExtent2D ChooseSwapExtent(const VkSurfaceCapabilitiesKHR& capabilities, const Vector2i& size) const;
|
VkExtent2D ChooseSwapExtent(const VkSurfaceCapabilitiesKHR& capabilities) const;
|
||||||
|
|
||||||
VkSwapchainCreateInfoKHR CreateSwapchainCreateInfo(VkSurfaceKHR surface, const SwapchainSupportDetails& swapchainSupport, const VkSurfaceFormatKHR& surfaceFormat, uint32 imageCount, const VkExtent2D& extent);
|
VkSwapchainCreateInfoKHR CreateSwapchainCreateInfo(VkSurfaceKHR surface, const SwapchainSupportDetails& swapchainSupport, const VkSurfaceFormatKHR& surfaceFormat, uint32 imageCount, const VkExtent2D& extent);
|
||||||
|
|
||||||
|
|
||||||
void setSize(const Vector2i& newSize)
|
VkExtent2D getExtent() const
|
||||||
{
|
{
|
||||||
desiredExtent = newSize;
|
return m_actualExtent;
|
||||||
sizeOutOfDate = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
const Vector2i& getSize() const
|
|
||||||
{
|
|
||||||
return desiredExtent;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
SwapchainInfoVk(VkSurfaceKHR surface, bool mainWindow)
|
SwapchainInfoVk(VkSurfaceKHR surface, bool mainWindow)
|
||||||
@@ -69,8 +63,9 @@ struct SwapchainInfoVk
|
|||||||
|
|
||||||
bool mainWindow{};
|
bool mainWindow{};
|
||||||
|
|
||||||
bool sizeOutOfDate{};
|
bool m_shouldRecreate = false;
|
||||||
bool m_usesSRGB = false;
|
bool m_usesSRGB = false;
|
||||||
|
VSync m_vsyncState = VSync::Immediate;
|
||||||
bool hasDefinedSwapchainImage{}; // indicates if the swapchain image is in a defined state
|
bool hasDefinedSwapchainImage{}; // indicates if the swapchain image is in a defined state
|
||||||
|
|
||||||
VkPhysicalDevice m_physicalDevice{};
|
VkPhysicalDevice m_physicalDevice{};
|
||||||
@@ -78,11 +73,10 @@ struct SwapchainInfoVk
|
|||||||
VkSurfaceKHR surface{};
|
VkSurfaceKHR surface{};
|
||||||
VkSurfaceFormatKHR m_surfaceFormat{};
|
VkSurfaceFormatKHR m_surfaceFormat{};
|
||||||
VkSwapchainKHR swapchain{};
|
VkSwapchainKHR swapchain{};
|
||||||
VkExtent2D swapchainExtent{};
|
Vector2i m_desiredExtent{};
|
||||||
VkFence m_imageAvailableFence{};
|
VkFence m_imageAvailableFence{};
|
||||||
uint32 swapchainImageIndex = (uint32)-1;
|
uint32 swapchainImageIndex = (uint32)-1;
|
||||||
uint32 m_acquireIndex = 0; // increases with every successful vkAcquireNextImageKHR
|
uint32 m_acquireIndex = 0; // increases with every successful vkAcquireNextImageKHR
|
||||||
VSync m_vsyncState = VSync::Immediate;
|
|
||||||
|
|
||||||
|
|
||||||
// swapchain image ringbuffer (indexed by swapchainImageIndex)
|
// swapchain image ringbuffer (indexed by swapchainImageIndex)
|
||||||
@@ -94,8 +88,6 @@ struct SwapchainInfoVk
|
|||||||
|
|
||||||
VkRenderPass m_swapchainRenderPass = nullptr;
|
VkRenderPass m_swapchainRenderPass = nullptr;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Vector2i desiredExtent;
|
VkExtent2D m_actualExtent{};
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -651,7 +651,7 @@ void VulkanRenderer::Initialize(const Vector2i& size, bool mainWindow)
|
|||||||
if (mainWindow)
|
if (mainWindow)
|
||||||
{
|
{
|
||||||
m_mainSwapchainInfo = std::make_unique<SwapchainInfoVk>(surface, mainWindow);
|
m_mainSwapchainInfo = std::make_unique<SwapchainInfoVk>(surface, mainWindow);
|
||||||
SetSwapchainTargetSize(size, mainWindow);
|
m_mainSwapchainInfo->m_desiredExtent = size;
|
||||||
m_mainSwapchainInfo->Create(m_physicalDevice, m_logicalDevice);
|
m_mainSwapchainInfo->Create(m_physicalDevice, m_logicalDevice);
|
||||||
|
|
||||||
// aquire first command buffer
|
// aquire first command buffer
|
||||||
@@ -660,7 +660,7 @@ void VulkanRenderer::Initialize(const Vector2i& size, bool mainWindow)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
m_padSwapchainInfo = std::make_unique<SwapchainInfoVk>(surface, mainWindow);
|
m_padSwapchainInfo = std::make_unique<SwapchainInfoVk>(surface, mainWindow);
|
||||||
SetSwapchainTargetSize(size, mainWindow);
|
m_padSwapchainInfo->m_desiredExtent = size;
|
||||||
// todo: figure out a way to exclusively create swapchain on main LatteThread
|
// todo: figure out a way to exclusively create swapchain on main LatteThread
|
||||||
m_padSwapchainInfo->Create(m_physicalDevice, m_logicalDevice);
|
m_padSwapchainInfo->Create(m_physicalDevice, m_logicalDevice);
|
||||||
}
|
}
|
||||||
@@ -977,11 +977,6 @@ void VulkanRenderer::HandleScreenshotRequest(LatteTextureView* texView, bool pad
|
|||||||
SaveScreenshot(rgb_data, width, height, !padView);
|
SaveScreenshot(rgb_data, width, height, !padView);
|
||||||
}
|
}
|
||||||
|
|
||||||
void VulkanRenderer::SetSwapchainTargetSize(const Vector2i& size, bool mainWindow)
|
|
||||||
{
|
|
||||||
GetChainInfo(mainWindow).setSize(size);
|
|
||||||
}
|
|
||||||
|
|
||||||
static const float kQueuePriority = 1.0f;
|
static const float kQueuePriority = 1.0f;
|
||||||
|
|
||||||
std::vector<VkDeviceQueueCreateInfo> VulkanRenderer::CreateQueueCreateInfos(const std::set<sint32>& uniqueQueueFamilies) const
|
std::vector<VkDeviceQueueCreateInfo> VulkanRenderer::CreateQueueCreateInfos(const std::set<sint32>& uniqueQueueFamilies) const
|
||||||
@@ -1671,7 +1666,7 @@ bool VulkanRenderer::ImguiBegin(bool mainWindow)
|
|||||||
m_state.currentPipeline = VK_NULL_HANDLE;
|
m_state.currentPipeline = VK_NULL_HANDLE;
|
||||||
|
|
||||||
ImGui_ImplVulkan_CreateFontsTexture(m_state.currentCommandBuffer);
|
ImGui_ImplVulkan_CreateFontsTexture(m_state.currentCommandBuffer);
|
||||||
ImGui_ImplVulkan_NewFrame(m_state.currentCommandBuffer, chainInfo.m_swapchainFramebuffers[chainInfo.swapchainImageIndex], chainInfo.swapchainExtent);
|
ImGui_ImplVulkan_NewFrame(m_state.currentCommandBuffer, chainInfo.m_swapchainFramebuffers[chainInfo.swapchainImageIndex], chainInfo.getExtent());
|
||||||
ImGui_UpdateWindowInformation(mainWindow);
|
ImGui_UpdateWindowInformation(mainWindow);
|
||||||
ImGui::NewFrame();
|
ImGui::NewFrame();
|
||||||
return true;
|
return true;
|
||||||
@@ -2543,18 +2538,8 @@ bool VulkanRenderer::AcquireNextSwapchainImage(bool mainWindow)
|
|||||||
|
|
||||||
auto& chainInfo = GetChainInfo(mainWindow);
|
auto& chainInfo = GetChainInfo(mainWindow);
|
||||||
|
|
||||||
UpdateVSyncState(mainWindow);
|
if (!UpdateSwapchainProperties(mainWindow))
|
||||||
|
return false;
|
||||||
const bool latteBufferUsesSRGB = mainWindow ? LatteGPUState.tvBufferUsesSRGB : LatteGPUState.drcBufferUsesSRGB;
|
|
||||||
if (chainInfo.sizeOutOfDate || chainInfo.m_usesSRGB != latteBufferUsesSRGB)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
RecreateSwapchain(mainWindow);
|
|
||||||
chainInfo.m_usesSRGB = latteBufferUsesSRGB;
|
|
||||||
}
|
|
||||||
catch (std::exception&) { cemu_assert_debug(false); }
|
|
||||||
}
|
|
||||||
|
|
||||||
if (chainInfo.swapchainImageIndex != -1)
|
if (chainInfo.swapchainImageIndex != -1)
|
||||||
return true; // image already reserved
|
return true; // image already reserved
|
||||||
@@ -2567,24 +2552,14 @@ bool VulkanRenderer::AcquireNextSwapchainImage(bool mainWindow)
|
|||||||
VkResult result = vkAcquireNextImageKHR(m_logicalDevice, chainInfo.swapchain, std::numeric_limits<uint64_t>::max(), acquireSemaphore, chainInfo.m_imageAvailableFence, &chainInfo.swapchainImageIndex);
|
VkResult result = vkAcquireNextImageKHR(m_logicalDevice, chainInfo.swapchain, std::numeric_limits<uint64_t>::max(), acquireSemaphore, chainInfo.m_imageAvailableFence, &chainInfo.swapchainImageIndex);
|
||||||
if (result != VK_SUCCESS)
|
if (result != VK_SUCCESS)
|
||||||
{
|
{
|
||||||
while (result == VK_ERROR_OUT_OF_DATE_KHR || result == VK_SUBOPTIMAL_KHR) // todo: handle error state correctly. Looping doesnt always make sense?
|
if (result == VK_ERROR_OUT_OF_DATE_KHR || result == VK_SUBOPTIMAL_KHR)
|
||||||
{
|
chainInfo.m_shouldRecreate = true;
|
||||||
try
|
|
||||||
{
|
|
||||||
RecreateSwapchain(mainWindow);
|
|
||||||
if (vkWaitForFences(m_logicalDevice, 1, &chainInfo.m_imageAvailableFence, VK_TRUE, 0) == VK_SUCCESS)
|
|
||||||
vkResetFences(m_logicalDevice, 1, &chainInfo.m_imageAvailableFence);
|
|
||||||
result = vkAcquireNextImageKHR(m_logicalDevice, chainInfo.swapchain, std::numeric_limits<uint64_t>::max(), acquireSemaphore, chainInfo.m_imageAvailableFence, &chainInfo.swapchainImageIndex);
|
|
||||||
if (result == VK_SUCCESS)
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
catch (std::exception&) {}
|
|
||||||
|
|
||||||
std::this_thread::yield();
|
if (result == VK_ERROR_OUT_OF_DATE_KHR)
|
||||||
std::this_thread::sleep_for(std::chrono::milliseconds(1));
|
return false;
|
||||||
}
|
|
||||||
|
|
||||||
throw std::runtime_error(fmt::format("Failed to acquire next image: {}", result));
|
if (result != VK_ERROR_OUT_OF_DATE_KHR && result != VK_SUBOPTIMAL_KHR)
|
||||||
|
throw std::runtime_error(fmt::format("Failed to acquire next image: {}", result));
|
||||||
}
|
}
|
||||||
|
|
||||||
chainInfo.m_acquireIndex = (chainInfo.m_acquireIndex + 1) % chainInfo.m_acquireSemaphores.size();
|
chainInfo.m_acquireIndex = (chainInfo.m_acquireIndex + 1) % chainInfo.m_acquireSemaphores.size();
|
||||||
@@ -2613,7 +2588,7 @@ void VulkanRenderer::RecreateSwapchain(bool mainWindow, bool skipCreate)
|
|||||||
}
|
}
|
||||||
|
|
||||||
chainInfo.Cleanup();
|
chainInfo.Cleanup();
|
||||||
chainInfo.setSize(size);
|
chainInfo.m_desiredExtent = size;
|
||||||
if(!skipCreate)
|
if(!skipCreate)
|
||||||
{
|
{
|
||||||
chainInfo.Create(m_physicalDevice, m_logicalDevice);
|
chainInfo.Create(m_physicalDevice, m_logicalDevice);
|
||||||
@@ -2624,14 +2599,36 @@ void VulkanRenderer::RecreateSwapchain(bool mainWindow, bool skipCreate)
|
|||||||
ImguiInit();
|
ImguiInit();
|
||||||
}
|
}
|
||||||
|
|
||||||
void VulkanRenderer::UpdateVSyncState(bool mainWindow)
|
bool VulkanRenderer::UpdateSwapchainProperties(bool mainWindow)
|
||||||
{
|
{
|
||||||
auto& chainInfo = GetChainInfo(mainWindow);
|
auto& chainInfo = GetChainInfo(mainWindow);
|
||||||
|
bool stateChanged = chainInfo.m_shouldRecreate;
|
||||||
|
|
||||||
const auto configValue = (VSync)GetConfig().vsync.GetValue();
|
const auto configValue = (VSync)GetConfig().vsync.GetValue();
|
||||||
if(chainInfo.m_vsyncState != configValue){
|
if(chainInfo.m_vsyncState != configValue)
|
||||||
RecreateSwapchain(mainWindow);
|
stateChanged = true;
|
||||||
chainInfo.m_vsyncState = configValue;
|
|
||||||
|
const bool latteBufferUsesSRGB = mainWindow ? LatteGPUState.tvBufferUsesSRGB : LatteGPUState.drcBufferUsesSRGB;
|
||||||
|
if (chainInfo.m_usesSRGB != latteBufferUsesSRGB)
|
||||||
|
stateChanged = true;
|
||||||
|
|
||||||
|
if(stateChanged)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
RecreateSwapchain(mainWindow);
|
||||||
|
}
|
||||||
|
catch (std::exception&)
|
||||||
|
{
|
||||||
|
cemu_assert_debug(false);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
chainInfo.m_shouldRecreate = false;
|
||||||
|
chainInfo.m_vsyncState = configValue;
|
||||||
|
chainInfo.m_usesSRGB = latteBufferUsesSRGB;
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void VulkanRenderer::SwapBuffer(bool mainWindow)
|
void VulkanRenderer::SwapBuffer(bool mainWindow)
|
||||||
@@ -2857,7 +2854,7 @@ void VulkanRenderer::DrawBackbufferQuad(LatteTextureView* texView, RendererOutpu
|
|||||||
renderPassInfo.renderPass = chainInfo.m_swapchainRenderPass;
|
renderPassInfo.renderPass = chainInfo.m_swapchainRenderPass;
|
||||||
renderPassInfo.framebuffer = chainInfo.m_swapchainFramebuffers[chainInfo.swapchainImageIndex];
|
renderPassInfo.framebuffer = chainInfo.m_swapchainFramebuffers[chainInfo.swapchainImageIndex];
|
||||||
renderPassInfo.renderArea.offset = { 0, 0 };
|
renderPassInfo.renderArea.offset = { 0, 0 };
|
||||||
renderPassInfo.renderArea.extent = chainInfo.swapchainExtent;
|
renderPassInfo.renderArea.extent = chainInfo.getExtent();
|
||||||
renderPassInfo.clearValueCount = 0;
|
renderPassInfo.clearValueCount = 0;
|
||||||
|
|
||||||
VkViewport viewport{};
|
VkViewport viewport{};
|
||||||
@@ -2870,7 +2867,7 @@ void VulkanRenderer::DrawBackbufferQuad(LatteTextureView* texView, RendererOutpu
|
|||||||
vkCmdSetViewport(m_state.currentCommandBuffer, 0, 1, &viewport);
|
vkCmdSetViewport(m_state.currentCommandBuffer, 0, 1, &viewport);
|
||||||
|
|
||||||
VkRect2D scissor{};
|
VkRect2D scissor{};
|
||||||
scissor.extent = chainInfo.swapchainExtent;
|
scissor.extent = chainInfo.getExtent();
|
||||||
vkCmdSetScissor(m_state.currentCommandBuffer, 0, 1, &scissor);
|
vkCmdSetScissor(m_state.currentCommandBuffer, 0, 1, &scissor);
|
||||||
|
|
||||||
auto descriptSet = backbufferBlit_createDescriptorSet(m_swapchainDescriptorSetLayout, texViewVk, useLinearTexFilter);
|
auto descriptSet = backbufferBlit_createDescriptorSet(m_swapchainDescriptorSetLayout, texViewVk, useLinearTexFilter);
|
||||||
|
|||||||
@@ -191,7 +191,6 @@ public:
|
|||||||
bool IsPadWindowActive() override;
|
bool IsPadWindowActive() override;
|
||||||
|
|
||||||
void HandleScreenshotRequest(LatteTextureView* texView, bool padView) override;
|
void HandleScreenshotRequest(LatteTextureView* texView, bool padView) override;
|
||||||
void SetSwapchainTargetSize(const Vector2i& size, bool mainWindow);
|
|
||||||
|
|
||||||
void QueryMemoryInfo();
|
void QueryMemoryInfo();
|
||||||
void QueryAvailableFormats();
|
void QueryAvailableFormats();
|
||||||
@@ -485,7 +484,7 @@ private:
|
|||||||
static bool CheckDeviceExtensionSupport(const VkPhysicalDevice device, FeatureControl& info);
|
static bool CheckDeviceExtensionSupport(const VkPhysicalDevice device, FeatureControl& info);
|
||||||
static std::vector<const char*> CheckInstanceExtensionSupport(FeatureControl& info);
|
static std::vector<const char*> CheckInstanceExtensionSupport(FeatureControl& info);
|
||||||
|
|
||||||
void UpdateVSyncState(bool mainWindow);
|
bool UpdateSwapchainProperties(bool mainWindow);
|
||||||
void SwapBuffer(bool mainWindow);
|
void SwapBuffer(bool mainWindow);
|
||||||
|
|
||||||
VkDescriptorSetLayout m_swapchainDescriptorSetLayout;
|
VkDescriptorSetLayout m_swapchainDescriptorSetLayout;
|
||||||
|
|||||||
@@ -346,7 +346,6 @@ namespace erreula
|
|||||||
std::string button2 = "No";
|
std::string button2 = "No";
|
||||||
if (appearArg.button2Text)
|
if (appearArg.button2Text)
|
||||||
button2 = boost::nowide::narrow(GetText(appearArg.button2Text.GetPtr()));
|
button2 = boost::nowide::narrow(GetText(appearArg.button2Text.GetPtr()));
|
||||||
|
|
||||||
|
|
||||||
float width1 = std::max(100.0f, ImGui::CalcTextSize(button1.c_str()).x + 10.0f);
|
float width1 = std::max(100.0f, ImGui::CalcTextSize(button1.c_str()).x + 10.0f);
|
||||||
float width2 = std::max(100.0f, ImGui::CalcTextSize(button2.c_str()).x + 10.0f);
|
float width2 = std::max(100.0f, ImGui::CalcTextSize(button2.c_str()).x + 10.0f);
|
||||||
@@ -359,10 +358,8 @@ namespace erreula
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ImGui::End();
|
|
||||||
}
|
}
|
||||||
|
ImGui::End();
|
||||||
ImGui::PopFont();
|
ImGui::PopFont();
|
||||||
|
|
||||||
if(g_errEula.buttonPressed || g_errEula.rightButtonPressed)
|
if(g_errEula.buttonPressed || g_errEula.rightButtonPressed)
|
||||||
|
|||||||
@@ -455,11 +455,6 @@ void export_curl_multi_fdset(PPCInterpreter_t* hCPU)
|
|||||||
ppcDefineParamMEMPTR(exceptionFd, wu_fd_set, 3);
|
ppcDefineParamMEMPTR(exceptionFd, wu_fd_set, 3);
|
||||||
ppcDefineParamU32BEPtr(maxFd, 4);
|
ppcDefineParamU32BEPtr(maxFd, 4);
|
||||||
|
|
||||||
#if BOOST_OS_LINUX || BOOST_OS_MACOS
|
|
||||||
cemuLog_log(LogType::Force, "curl_multi_fdset(...) - todo");
|
|
||||||
|
|
||||||
osLib_returnFromFunction(hCPU, 0);
|
|
||||||
#else
|
|
||||||
fd_set h_readFd;
|
fd_set h_readFd;
|
||||||
fd_set h_writeFd;
|
fd_set h_writeFd;
|
||||||
fd_set h_exceptionFd;
|
fd_set h_exceptionFd;
|
||||||
@@ -475,17 +470,36 @@ void export_curl_multi_fdset(PPCInterpreter_t* hCPU)
|
|||||||
nsysnet::wuResetFD(exceptionFd.GetPtr());
|
nsysnet::wuResetFD(exceptionFd.GetPtr());
|
||||||
|
|
||||||
sint32 c_maxFD = -1;
|
sint32 c_maxFD = -1;
|
||||||
// fd read set
|
|
||||||
for (uint32 i = 0; i < h_readFd.fd_count; i++)
|
auto hostFdSet = [&](SOCKET s, wu_fd_set* fds)
|
||||||
{
|
{
|
||||||
sint32 wuSocket = nsysnet_getVirtualSocketHandleFromHostHandle(h_readFd.fd_array[i]);
|
sint32 wuSocket = nsysnet_getVirtualSocketHandleFromHostHandle(s);
|
||||||
if (wuSocket < 0)
|
if (wuSocket < 0)
|
||||||
wuSocket = nsysnet_createVirtualSocketFromExistingSocket(h_readFd.fd_array[i]);
|
wuSocket = nsysnet_createVirtualSocketFromExistingSocket(s);
|
||||||
if (wuSocket >= 0)
|
if (wuSocket >= 0)
|
||||||
{
|
{
|
||||||
c_maxFD = std::max(wuSocket, c_maxFD);
|
c_maxFD = std::max(wuSocket, c_maxFD);
|
||||||
nsysnet::wuSetFD(readFd.GetPtr(), wuSocket);
|
nsysnet::wuSetFD(fds, wuSocket);
|
||||||
}
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
#if BOOST_OS_UNIX
|
||||||
|
for (int s = 0; s < h_maxFd + 1; s++)
|
||||||
|
{
|
||||||
|
if(FD_ISSET(s, &h_readFd))
|
||||||
|
hostFdSet(s, readFd.GetPtr());
|
||||||
|
|
||||||
|
if(FD_ISSET(s, &h_writeFd))
|
||||||
|
hostFdSet(s, writeFd.GetPtr());
|
||||||
|
|
||||||
|
if(FD_ISSET(s, &h_exceptionFd))
|
||||||
|
hostFdSet(s, exceptionFd.GetPtr());
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
// fd read set
|
||||||
|
for (uint32 i = 0; i < h_readFd.fd_count; i++)
|
||||||
|
{
|
||||||
|
hostFdSet(h_readFd.fd_array[i], readFd.GetPtr());
|
||||||
}
|
}
|
||||||
// fd write set
|
// fd write set
|
||||||
for (uint32 i = 0; i < h_writeFd.fd_count; i++)
|
for (uint32 i = 0; i < h_writeFd.fd_count; i++)
|
||||||
@@ -497,11 +511,10 @@ void export_curl_multi_fdset(PPCInterpreter_t* hCPU)
|
|||||||
{
|
{
|
||||||
cemu_assert_debug(false);
|
cemu_assert_debug(false);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
*maxFd = c_maxFD;
|
*maxFd = c_maxFD;
|
||||||
osLib_returnFromFunction(hCPU, result);
|
osLib_returnFromFunction(hCPU, result);
|
||||||
#endif
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void export_curl_multi_setopt(PPCInterpreter_t* hCPU)
|
void export_curl_multi_setopt(PPCInterpreter_t* hCPU)
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -373,8 +373,8 @@ void swkbd_render(bool mainWindow)
|
|||||||
ImGui::PushStyleVar(ImGuiStyleVar_WindowBorderSize, 0);
|
ImGui::PushStyleVar(ImGuiStyleVar_WindowBorderSize, 0);
|
||||||
ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, { 0,0 });
|
ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, { 0,0 });
|
||||||
ImGui::SetNextWindowBgAlpha(0.8f);
|
ImGui::SetNextWindowBgAlpha(0.8f);
|
||||||
if (ImGui::Begin("Background overlay", nullptr, kPopupFlags | ImGuiWindowFlags_NoNav | ImGuiWindowFlags_NoFocusOnAppearing))
|
ImGui::Begin("Background overlay", nullptr, kPopupFlags | ImGuiWindowFlags_NoNav | ImGuiWindowFlags_NoFocusOnAppearing | ImGuiWindowFlags_NoBringToFrontOnFocus);
|
||||||
ImGui::End();
|
ImGui::End();
|
||||||
ImGui::PopStyleVar(2);
|
ImGui::PopStyleVar(2);
|
||||||
|
|
||||||
ImVec2 position = { io.DisplaySize.x / 2.0f, io.DisplaySize.y / 3.0f };
|
ImVec2 position = { io.DisplaySize.x / 2.0f, io.DisplaySize.y / 3.0f };
|
||||||
@@ -412,10 +412,8 @@ void swkbd_render(bool mainWindow)
|
|||||||
ImGui::PopTextWrapPos();
|
ImGui::PopTextWrapPos();
|
||||||
|
|
||||||
position.y += ImGui::GetWindowSize().y + 100.0f;
|
position.y += ImGui::GetWindowSize().y + 100.0f;
|
||||||
|
|
||||||
ImGui::End();
|
|
||||||
}
|
}
|
||||||
|
ImGui::End();
|
||||||
ImGui::PopFont();
|
ImGui::PopFont();
|
||||||
|
|
||||||
ImGui::SetNextWindowPos(position, ImGuiCond_Always, pivot);
|
ImGui::SetNextWindowPos(position, ImGuiCond_Always, pivot);
|
||||||
@@ -490,10 +488,8 @@ void swkbd_render(bool mainWindow)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
ImGui::NewLine();
|
ImGui::NewLine();
|
||||||
|
|
||||||
|
|
||||||
ImGui::End();
|
|
||||||
}
|
}
|
||||||
|
ImGui::End();
|
||||||
|
|
||||||
if (io.NavInputs[ImGuiNavInput_Cancel] > 0)
|
if (io.NavInputs[ImGuiNavInput_Cancel] > 0)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -24,6 +24,9 @@ typedef XID GLXFBConfigID;
|
|||||||
typedef struct __GLXcontextRec *GLXContext;
|
typedef struct __GLXcontextRec *GLXContext;
|
||||||
typedef struct __GLXFBConfigRec *GLXFBConfig;
|
typedef struct __GLXFBConfigRec *GLXFBConfig;
|
||||||
|
|
||||||
|
#define EGL_EGL_PROTOTYPES 0
|
||||||
|
#include "egl.h"
|
||||||
|
#undef EGL_EGL_PROTOTYPES
|
||||||
#include "glxext.h"
|
#include "glxext.h"
|
||||||
|
|
||||||
#undef Bool
|
#undef Bool
|
||||||
@@ -34,9 +37,11 @@ typedef struct __GLXFBConfigRec *GLXFBConfig;
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define GLFUNC(__type, __name) extern __type __name;
|
#define GLFUNC(__type, __name) extern __type __name;
|
||||||
|
#define EGLFUNC(__type, __name) extern __type __name;
|
||||||
#include "glFunctions.h"
|
#include "glFunctions.h"
|
||||||
#undef GLFUNC
|
#undef GLFUNC
|
||||||
|
#undef EGLFUNC
|
||||||
|
|
||||||
// this prevents Windows GL.h from being included:
|
// this prevents Windows GL.h from being included:
|
||||||
#define __gl_h_
|
#define __gl_h_
|
||||||
#define __GL_H__
|
#define __GL_H__
|
||||||
|
|||||||
@@ -0,0 +1,342 @@
|
|||||||
|
#ifndef __egl_h_
|
||||||
|
#define __egl_h_ 1
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Copyright 2013-2020 The Khronos Group Inc.
|
||||||
|
** SPDX-License-Identifier: Apache-2.0
|
||||||
|
**
|
||||||
|
** This header is generated from the Khronos EGL XML API Registry.
|
||||||
|
** The current version of the Registry, generator scripts
|
||||||
|
** used to make the header, and the header can be found at
|
||||||
|
** http://www.khronos.org/registry/egl
|
||||||
|
**
|
||||||
|
** Khronos $Git commit SHA1: 8c62b915dd $ on $Git commit date: 2021-11-05 23:32:01 -0400 $
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <EGL/eglplatform.h>
|
||||||
|
|
||||||
|
#ifndef EGL_EGL_PROTOTYPES
|
||||||
|
#define EGL_EGL_PROTOTYPES 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Generated on date 20211116 */
|
||||||
|
|
||||||
|
/* Generated C header for:
|
||||||
|
* API: egl
|
||||||
|
* Versions considered: .*
|
||||||
|
* Versions emitted: .*
|
||||||
|
* Default extensions included: None
|
||||||
|
* Additional extensions included: _nomatch_^
|
||||||
|
* Extensions removed: _nomatch_^
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef EGL_VERSION_1_0
|
||||||
|
#define EGL_VERSION_1_0 1
|
||||||
|
typedef unsigned int EGLBoolean;
|
||||||
|
typedef void *EGLDisplay;
|
||||||
|
#include <KHR/khrplatform.h>
|
||||||
|
#include <EGL/eglplatform.h>
|
||||||
|
typedef void *EGLConfig;
|
||||||
|
typedef void *EGLSurface;
|
||||||
|
typedef void *EGLContext;
|
||||||
|
typedef void (*__eglMustCastToProperFunctionPointerType)(void);
|
||||||
|
#define EGL_ALPHA_SIZE 0x3021
|
||||||
|
#define EGL_BAD_ACCESS 0x3002
|
||||||
|
#define EGL_BAD_ALLOC 0x3003
|
||||||
|
#define EGL_BAD_ATTRIBUTE 0x3004
|
||||||
|
#define EGL_BAD_CONFIG 0x3005
|
||||||
|
#define EGL_BAD_CONTEXT 0x3006
|
||||||
|
#define EGL_BAD_CURRENT_SURFACE 0x3007
|
||||||
|
#define EGL_BAD_DISPLAY 0x3008
|
||||||
|
#define EGL_BAD_MATCH 0x3009
|
||||||
|
#define EGL_BAD_NATIVE_PIXMAP 0x300A
|
||||||
|
#define EGL_BAD_NATIVE_WINDOW 0x300B
|
||||||
|
#define EGL_BAD_PARAMETER 0x300C
|
||||||
|
#define EGL_BAD_SURFACE 0x300D
|
||||||
|
#define EGL_BLUE_SIZE 0x3022
|
||||||
|
#define EGL_BUFFER_SIZE 0x3020
|
||||||
|
#define EGL_CONFIG_CAVEAT 0x3027
|
||||||
|
#define EGL_CONFIG_ID 0x3028
|
||||||
|
#define EGL_CORE_NATIVE_ENGINE 0x305B
|
||||||
|
#define EGL_DEPTH_SIZE 0x3025
|
||||||
|
#define EGL_DONT_CARE EGL_CAST(EGLint,-1)
|
||||||
|
#define EGL_DRAW 0x3059
|
||||||
|
#define EGL_EXTENSIONS 0x3055
|
||||||
|
#define EGL_FALSE 0
|
||||||
|
#define EGL_GREEN_SIZE 0x3023
|
||||||
|
#define EGL_HEIGHT 0x3056
|
||||||
|
#define EGL_LARGEST_PBUFFER 0x3058
|
||||||
|
#define EGL_LEVEL 0x3029
|
||||||
|
#define EGL_MAX_PBUFFER_HEIGHT 0x302A
|
||||||
|
#define EGL_MAX_PBUFFER_PIXELS 0x302B
|
||||||
|
#define EGL_MAX_PBUFFER_WIDTH 0x302C
|
||||||
|
#define EGL_NATIVE_RENDERABLE 0x302D
|
||||||
|
#define EGL_NATIVE_VISUAL_ID 0x302E
|
||||||
|
#define EGL_NATIVE_VISUAL_TYPE 0x302F
|
||||||
|
#define EGL_NONE 0x3038
|
||||||
|
#define EGL_NON_CONFORMANT_CONFIG 0x3051
|
||||||
|
#define EGL_NOT_INITIALIZED 0x3001
|
||||||
|
#define EGL_NO_CONTEXT EGL_CAST(EGLContext,0)
|
||||||
|
#define EGL_NO_DISPLAY EGL_CAST(EGLDisplay,0)
|
||||||
|
#define EGL_NO_SURFACE EGL_CAST(EGLSurface,0)
|
||||||
|
#define EGL_PBUFFER_BIT 0x0001
|
||||||
|
#define EGL_PIXMAP_BIT 0x0002
|
||||||
|
#define EGL_READ 0x305A
|
||||||
|
#define EGL_RED_SIZE 0x3024
|
||||||
|
#define EGL_SAMPLES 0x3031
|
||||||
|
#define EGL_SAMPLE_BUFFERS 0x3032
|
||||||
|
#define EGL_SLOW_CONFIG 0x3050
|
||||||
|
#define EGL_STENCIL_SIZE 0x3026
|
||||||
|
#define EGL_SUCCESS 0x3000
|
||||||
|
#define EGL_SURFACE_TYPE 0x3033
|
||||||
|
#define EGL_TRANSPARENT_BLUE_VALUE 0x3035
|
||||||
|
#define EGL_TRANSPARENT_GREEN_VALUE 0x3036
|
||||||
|
#define EGL_TRANSPARENT_RED_VALUE 0x3037
|
||||||
|
#define EGL_TRANSPARENT_RGB 0x3052
|
||||||
|
#define EGL_TRANSPARENT_TYPE 0x3034
|
||||||
|
#define EGL_TRUE 1
|
||||||
|
#define EGL_VENDOR 0x3053
|
||||||
|
#define EGL_VERSION 0x3054
|
||||||
|
#define EGL_WIDTH 0x3057
|
||||||
|
#define EGL_WINDOW_BIT 0x0004
|
||||||
|
typedef EGLBoolean (EGLAPIENTRYP PFNEGLCHOOSECONFIGPROC) (EGLDisplay dpy, const EGLint *attrib_list, EGLConfig *configs, EGLint config_size, EGLint *num_config);
|
||||||
|
typedef EGLBoolean (EGLAPIENTRYP PFNEGLCOPYBUFFERSPROC) (EGLDisplay dpy, EGLSurface surface, EGLNativePixmapType target);
|
||||||
|
typedef EGLContext (EGLAPIENTRYP PFNEGLCREATECONTEXTPROC) (EGLDisplay dpy, EGLConfig config, EGLContext share_context, const EGLint *attrib_list);
|
||||||
|
typedef EGLSurface (EGLAPIENTRYP PFNEGLCREATEPBUFFERSURFACEPROC) (EGLDisplay dpy, EGLConfig config, const EGLint *attrib_list);
|
||||||
|
typedef EGLSurface (EGLAPIENTRYP PFNEGLCREATEPIXMAPSURFACEPROC) (EGLDisplay dpy, EGLConfig config, EGLNativePixmapType pixmap, const EGLint *attrib_list);
|
||||||
|
typedef EGLSurface (EGLAPIENTRYP PFNEGLCREATEWINDOWSURFACEPROC) (EGLDisplay dpy, EGLConfig config, EGLNativeWindowType win, const EGLint *attrib_list);
|
||||||
|
typedef EGLBoolean (EGLAPIENTRYP PFNEGLDESTROYCONTEXTPROC) (EGLDisplay dpy, EGLContext ctx);
|
||||||
|
typedef EGLBoolean (EGLAPIENTRYP PFNEGLDESTROYSURFACEPROC) (EGLDisplay dpy, EGLSurface surface);
|
||||||
|
typedef EGLBoolean (EGLAPIENTRYP PFNEGLGETCONFIGATTRIBPROC) (EGLDisplay dpy, EGLConfig config, EGLint attribute, EGLint *value);
|
||||||
|
typedef EGLBoolean (EGLAPIENTRYP PFNEGLGETCONFIGSPROC) (EGLDisplay dpy, EGLConfig *configs, EGLint config_size, EGLint *num_config);
|
||||||
|
typedef EGLDisplay (EGLAPIENTRYP PFNEGLGETCURRENTDISPLAYPROC) (void);
|
||||||
|
typedef EGLSurface (EGLAPIENTRYP PFNEGLGETCURRENTSURFACEPROC) (EGLint readdraw);
|
||||||
|
typedef EGLDisplay (EGLAPIENTRYP PFNEGLGETDISPLAYPROC) (EGLNativeDisplayType display_id);
|
||||||
|
typedef EGLint (EGLAPIENTRYP PFNEGLGETERRORPROC) (void);
|
||||||
|
typedef __eglMustCastToProperFunctionPointerType (EGLAPIENTRYP PFNEGLGETPROCADDRESSPROC) (const char *procname);
|
||||||
|
typedef EGLBoolean (EGLAPIENTRYP PFNEGLINITIALIZEPROC) (EGLDisplay dpy, EGLint *major, EGLint *minor);
|
||||||
|
typedef EGLBoolean (EGLAPIENTRYP PFNEGLMAKECURRENTPROC) (EGLDisplay dpy, EGLSurface draw, EGLSurface read, EGLContext ctx);
|
||||||
|
typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYCONTEXTPROC) (EGLDisplay dpy, EGLContext ctx, EGLint attribute, EGLint *value);
|
||||||
|
typedef const char *(EGLAPIENTRYP PFNEGLQUERYSTRINGPROC) (EGLDisplay dpy, EGLint name);
|
||||||
|
typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYSURFACEPROC) (EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint *value);
|
||||||
|
typedef EGLBoolean (EGLAPIENTRYP PFNEGLSWAPBUFFERSPROC) (EGLDisplay dpy, EGLSurface surface);
|
||||||
|
typedef EGLBoolean (EGLAPIENTRYP PFNEGLTERMINATEPROC) (EGLDisplay dpy);
|
||||||
|
typedef EGLBoolean (EGLAPIENTRYP PFNEGLWAITGLPROC) (void);
|
||||||
|
typedef EGLBoolean (EGLAPIENTRYP PFNEGLWAITNATIVEPROC) (EGLint engine);
|
||||||
|
#if EGL_EGL_PROTOTYPES
|
||||||
|
EGLAPI EGLBoolean EGLAPIENTRY eglChooseConfig (EGLDisplay dpy, const EGLint *attrib_list, EGLConfig *configs, EGLint config_size, EGLint *num_config);
|
||||||
|
EGLAPI EGLBoolean EGLAPIENTRY eglCopyBuffers (EGLDisplay dpy, EGLSurface surface, EGLNativePixmapType target);
|
||||||
|
EGLAPI EGLContext EGLAPIENTRY eglCreateContext (EGLDisplay dpy, EGLConfig config, EGLContext share_context, const EGLint *attrib_list);
|
||||||
|
EGLAPI EGLSurface EGLAPIENTRY eglCreatePbufferSurface (EGLDisplay dpy, EGLConfig config, const EGLint *attrib_list);
|
||||||
|
EGLAPI EGLSurface EGLAPIENTRY eglCreatePixmapSurface (EGLDisplay dpy, EGLConfig config, EGLNativePixmapType pixmap, const EGLint *attrib_list);
|
||||||
|
EGLAPI EGLSurface EGLAPIENTRY eglCreateWindowSurface (EGLDisplay dpy, EGLConfig config, EGLNativeWindowType win, const EGLint *attrib_list);
|
||||||
|
EGLAPI EGLBoolean EGLAPIENTRY eglDestroyContext (EGLDisplay dpy, EGLContext ctx);
|
||||||
|
EGLAPI EGLBoolean EGLAPIENTRY eglDestroySurface (EGLDisplay dpy, EGLSurface surface);
|
||||||
|
EGLAPI EGLBoolean EGLAPIENTRY eglGetConfigAttrib (EGLDisplay dpy, EGLConfig config, EGLint attribute, EGLint *value);
|
||||||
|
EGLAPI EGLBoolean EGLAPIENTRY eglGetConfigs (EGLDisplay dpy, EGLConfig *configs, EGLint config_size, EGLint *num_config);
|
||||||
|
EGLAPI EGLDisplay EGLAPIENTRY eglGetCurrentDisplay (void);
|
||||||
|
EGLAPI EGLSurface EGLAPIENTRY eglGetCurrentSurface (EGLint readdraw);
|
||||||
|
EGLAPI EGLDisplay EGLAPIENTRY eglGetDisplay (EGLNativeDisplayType display_id);
|
||||||
|
EGLAPI EGLint EGLAPIENTRY eglGetError (void);
|
||||||
|
EGLAPI __eglMustCastToProperFunctionPointerType EGLAPIENTRY eglGetProcAddress (const char *procname);
|
||||||
|
EGLAPI EGLBoolean EGLAPIENTRY eglInitialize (EGLDisplay dpy, EGLint *major, EGLint *minor);
|
||||||
|
EGLAPI EGLBoolean EGLAPIENTRY eglMakeCurrent (EGLDisplay dpy, EGLSurface draw, EGLSurface read, EGLContext ctx);
|
||||||
|
EGLAPI EGLBoolean EGLAPIENTRY eglQueryContext (EGLDisplay dpy, EGLContext ctx, EGLint attribute, EGLint *value);
|
||||||
|
EGLAPI const char *EGLAPIENTRY eglQueryString (EGLDisplay dpy, EGLint name);
|
||||||
|
EGLAPI EGLBoolean EGLAPIENTRY eglQuerySurface (EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint *value);
|
||||||
|
EGLAPI EGLBoolean EGLAPIENTRY eglSwapBuffers (EGLDisplay dpy, EGLSurface surface);
|
||||||
|
EGLAPI EGLBoolean EGLAPIENTRY eglTerminate (EGLDisplay dpy);
|
||||||
|
EGLAPI EGLBoolean EGLAPIENTRY eglWaitGL (void);
|
||||||
|
EGLAPI EGLBoolean EGLAPIENTRY eglWaitNative (EGLint engine);
|
||||||
|
#endif
|
||||||
|
#endif /* EGL_VERSION_1_0 */
|
||||||
|
|
||||||
|
#ifndef EGL_VERSION_1_1
|
||||||
|
#define EGL_VERSION_1_1 1
|
||||||
|
#define EGL_BACK_BUFFER 0x3084
|
||||||
|
#define EGL_BIND_TO_TEXTURE_RGB 0x3039
|
||||||
|
#define EGL_BIND_TO_TEXTURE_RGBA 0x303A
|
||||||
|
#define EGL_CONTEXT_LOST 0x300E
|
||||||
|
#define EGL_MIN_SWAP_INTERVAL 0x303B
|
||||||
|
#define EGL_MAX_SWAP_INTERVAL 0x303C
|
||||||
|
#define EGL_MIPMAP_TEXTURE 0x3082
|
||||||
|
#define EGL_MIPMAP_LEVEL 0x3083
|
||||||
|
#define EGL_NO_TEXTURE 0x305C
|
||||||
|
#define EGL_TEXTURE_2D 0x305F
|
||||||
|
#define EGL_TEXTURE_FORMAT 0x3080
|
||||||
|
#define EGL_TEXTURE_RGB 0x305D
|
||||||
|
#define EGL_TEXTURE_RGBA 0x305E
|
||||||
|
#define EGL_TEXTURE_TARGET 0x3081
|
||||||
|
typedef EGLBoolean (EGLAPIENTRYP PFNEGLBINDTEXIMAGEPROC) (EGLDisplay dpy, EGLSurface surface, EGLint buffer);
|
||||||
|
typedef EGLBoolean (EGLAPIENTRYP PFNEGLRELEASETEXIMAGEPROC) (EGLDisplay dpy, EGLSurface surface, EGLint buffer);
|
||||||
|
typedef EGLBoolean (EGLAPIENTRYP PFNEGLSURFACEATTRIBPROC) (EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint value);
|
||||||
|
typedef EGLBoolean (EGLAPIENTRYP PFNEGLSWAPINTERVALPROC) (EGLDisplay dpy, EGLint interval);
|
||||||
|
#if EGL_EGL_PROTOTYPES
|
||||||
|
EGLAPI EGLBoolean EGLAPIENTRY eglBindTexImage (EGLDisplay dpy, EGLSurface surface, EGLint buffer);
|
||||||
|
EGLAPI EGLBoolean EGLAPIENTRY eglReleaseTexImage (EGLDisplay dpy, EGLSurface surface, EGLint buffer);
|
||||||
|
EGLAPI EGLBoolean EGLAPIENTRY eglSurfaceAttrib (EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint value);
|
||||||
|
EGLAPI EGLBoolean EGLAPIENTRY eglSwapInterval (EGLDisplay dpy, EGLint interval);
|
||||||
|
#endif
|
||||||
|
#endif /* EGL_VERSION_1_1 */
|
||||||
|
|
||||||
|
#ifndef EGL_VERSION_1_2
|
||||||
|
#define EGL_VERSION_1_2 1
|
||||||
|
typedef unsigned int EGLenum;
|
||||||
|
typedef void *EGLClientBuffer;
|
||||||
|
#define EGL_ALPHA_FORMAT 0x3088
|
||||||
|
#define EGL_ALPHA_FORMAT_NONPRE 0x308B
|
||||||
|
#define EGL_ALPHA_FORMAT_PRE 0x308C
|
||||||
|
#define EGL_ALPHA_MASK_SIZE 0x303E
|
||||||
|
#define EGL_BUFFER_PRESERVED 0x3094
|
||||||
|
#define EGL_BUFFER_DESTROYED 0x3095
|
||||||
|
#define EGL_CLIENT_APIS 0x308D
|
||||||
|
#define EGL_COLORSPACE 0x3087
|
||||||
|
#define EGL_COLORSPACE_sRGB 0x3089
|
||||||
|
#define EGL_COLORSPACE_LINEAR 0x308A
|
||||||
|
#define EGL_COLOR_BUFFER_TYPE 0x303F
|
||||||
|
#define EGL_CONTEXT_CLIENT_TYPE 0x3097
|
||||||
|
#define EGL_DISPLAY_SCALING 10000
|
||||||
|
#define EGL_HORIZONTAL_RESOLUTION 0x3090
|
||||||
|
#define EGL_LUMINANCE_BUFFER 0x308F
|
||||||
|
#define EGL_LUMINANCE_SIZE 0x303D
|
||||||
|
#define EGL_OPENGL_ES_BIT 0x0001
|
||||||
|
#define EGL_OPENVG_BIT 0x0002
|
||||||
|
#define EGL_OPENGL_ES_API 0x30A0
|
||||||
|
#define EGL_OPENVG_API 0x30A1
|
||||||
|
#define EGL_OPENVG_IMAGE 0x3096
|
||||||
|
#define EGL_PIXEL_ASPECT_RATIO 0x3092
|
||||||
|
#define EGL_RENDERABLE_TYPE 0x3040
|
||||||
|
#define EGL_RENDER_BUFFER 0x3086
|
||||||
|
#define EGL_RGB_BUFFER 0x308E
|
||||||
|
#define EGL_SINGLE_BUFFER 0x3085
|
||||||
|
#define EGL_SWAP_BEHAVIOR 0x3093
|
||||||
|
#define EGL_UNKNOWN EGL_CAST(EGLint,-1)
|
||||||
|
#define EGL_VERTICAL_RESOLUTION 0x3091
|
||||||
|
typedef EGLBoolean (EGLAPIENTRYP PFNEGLBINDAPIPROC) (EGLenum api);
|
||||||
|
typedef EGLenum (EGLAPIENTRYP PFNEGLQUERYAPIPROC) (void);
|
||||||
|
typedef EGLSurface (EGLAPIENTRYP PFNEGLCREATEPBUFFERFROMCLIENTBUFFERPROC) (EGLDisplay dpy, EGLenum buftype, EGLClientBuffer buffer, EGLConfig config, const EGLint *attrib_list);
|
||||||
|
typedef EGLBoolean (EGLAPIENTRYP PFNEGLRELEASETHREADPROC) (void);
|
||||||
|
typedef EGLBoolean (EGLAPIENTRYP PFNEGLWAITCLIENTPROC) (void);
|
||||||
|
#if EGL_EGL_PROTOTYPES
|
||||||
|
EGLAPI EGLBoolean EGLAPIENTRY eglBindAPI (EGLenum api);
|
||||||
|
EGLAPI EGLenum EGLAPIENTRY eglQueryAPI (void);
|
||||||
|
EGLAPI EGLSurface EGLAPIENTRY eglCreatePbufferFromClientBuffer (EGLDisplay dpy, EGLenum buftype, EGLClientBuffer buffer, EGLConfig config, const EGLint *attrib_list);
|
||||||
|
EGLAPI EGLBoolean EGLAPIENTRY eglReleaseThread (void);
|
||||||
|
EGLAPI EGLBoolean EGLAPIENTRY eglWaitClient (void);
|
||||||
|
#endif
|
||||||
|
#endif /* EGL_VERSION_1_2 */
|
||||||
|
|
||||||
|
#ifndef EGL_VERSION_1_3
|
||||||
|
#define EGL_VERSION_1_3 1
|
||||||
|
#define EGL_CONFORMANT 0x3042
|
||||||
|
#define EGL_CONTEXT_CLIENT_VERSION 0x3098
|
||||||
|
#define EGL_MATCH_NATIVE_PIXMAP 0x3041
|
||||||
|
#define EGL_OPENGL_ES2_BIT 0x0004
|
||||||
|
#define EGL_VG_ALPHA_FORMAT 0x3088
|
||||||
|
#define EGL_VG_ALPHA_FORMAT_NONPRE 0x308B
|
||||||
|
#define EGL_VG_ALPHA_FORMAT_PRE 0x308C
|
||||||
|
#define EGL_VG_ALPHA_FORMAT_PRE_BIT 0x0040
|
||||||
|
#define EGL_VG_COLORSPACE 0x3087
|
||||||
|
#define EGL_VG_COLORSPACE_sRGB 0x3089
|
||||||
|
#define EGL_VG_COLORSPACE_LINEAR 0x308A
|
||||||
|
#define EGL_VG_COLORSPACE_LINEAR_BIT 0x0020
|
||||||
|
#endif /* EGL_VERSION_1_3 */
|
||||||
|
|
||||||
|
#ifndef EGL_VERSION_1_4
|
||||||
|
#define EGL_VERSION_1_4 1
|
||||||
|
#define EGL_DEFAULT_DISPLAY EGL_CAST(EGLNativeDisplayType,0)
|
||||||
|
#define EGL_MULTISAMPLE_RESOLVE_BOX_BIT 0x0200
|
||||||
|
#define EGL_MULTISAMPLE_RESOLVE 0x3099
|
||||||
|
#define EGL_MULTISAMPLE_RESOLVE_DEFAULT 0x309A
|
||||||
|
#define EGL_MULTISAMPLE_RESOLVE_BOX 0x309B
|
||||||
|
#define EGL_OPENGL_API 0x30A2
|
||||||
|
#define EGL_OPENGL_BIT 0x0008
|
||||||
|
#define EGL_SWAP_BEHAVIOR_PRESERVED_BIT 0x0400
|
||||||
|
typedef EGLContext (EGLAPIENTRYP PFNEGLGETCURRENTCONTEXTPROC) (void);
|
||||||
|
#if EGL_EGL_PROTOTYPES
|
||||||
|
EGLAPI EGLContext EGLAPIENTRY eglGetCurrentContext (void);
|
||||||
|
#endif
|
||||||
|
#endif /* EGL_VERSION_1_4 */
|
||||||
|
|
||||||
|
#ifndef EGL_VERSION_1_5
|
||||||
|
#define EGL_VERSION_1_5 1
|
||||||
|
typedef void *EGLSync;
|
||||||
|
typedef intptr_t EGLAttrib;
|
||||||
|
typedef khronos_utime_nanoseconds_t EGLTime;
|
||||||
|
typedef void *EGLImage;
|
||||||
|
#define EGL_CONTEXT_MAJOR_VERSION 0x3098
|
||||||
|
#define EGL_CONTEXT_MINOR_VERSION 0x30FB
|
||||||
|
#define EGL_CONTEXT_OPENGL_PROFILE_MASK 0x30FD
|
||||||
|
#define EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY 0x31BD
|
||||||
|
#define EGL_NO_RESET_NOTIFICATION 0x31BE
|
||||||
|
#define EGL_LOSE_CONTEXT_ON_RESET 0x31BF
|
||||||
|
#define EGL_CONTEXT_OPENGL_CORE_PROFILE_BIT 0x00000001
|
||||||
|
#define EGL_CONTEXT_OPENGL_COMPATIBILITY_PROFILE_BIT 0x00000002
|
||||||
|
#define EGL_CONTEXT_OPENGL_DEBUG 0x31B0
|
||||||
|
#define EGL_CONTEXT_OPENGL_FORWARD_COMPATIBLE 0x31B1
|
||||||
|
#define EGL_CONTEXT_OPENGL_ROBUST_ACCESS 0x31B2
|
||||||
|
#define EGL_OPENGL_ES3_BIT 0x00000040
|
||||||
|
#define EGL_CL_EVENT_HANDLE 0x309C
|
||||||
|
#define EGL_SYNC_CL_EVENT 0x30FE
|
||||||
|
#define EGL_SYNC_CL_EVENT_COMPLETE 0x30FF
|
||||||
|
#define EGL_SYNC_PRIOR_COMMANDS_COMPLETE 0x30F0
|
||||||
|
#define EGL_SYNC_TYPE 0x30F7
|
||||||
|
#define EGL_SYNC_STATUS 0x30F1
|
||||||
|
#define EGL_SYNC_CONDITION 0x30F8
|
||||||
|
#define EGL_SIGNALED 0x30F2
|
||||||
|
#define EGL_UNSIGNALED 0x30F3
|
||||||
|
#define EGL_SYNC_FLUSH_COMMANDS_BIT 0x0001
|
||||||
|
#define EGL_FOREVER 0xFFFFFFFFFFFFFFFFull
|
||||||
|
#define EGL_TIMEOUT_EXPIRED 0x30F5
|
||||||
|
#define EGL_CONDITION_SATISFIED 0x30F6
|
||||||
|
#define EGL_NO_SYNC EGL_CAST(EGLSync,0)
|
||||||
|
#define EGL_SYNC_FENCE 0x30F9
|
||||||
|
#define EGL_GL_COLORSPACE 0x309D
|
||||||
|
#define EGL_GL_COLORSPACE_SRGB 0x3089
|
||||||
|
#define EGL_GL_COLORSPACE_LINEAR 0x308A
|
||||||
|
#define EGL_GL_RENDERBUFFER 0x30B9
|
||||||
|
#define EGL_GL_TEXTURE_2D 0x30B1
|
||||||
|
#define EGL_GL_TEXTURE_LEVEL 0x30BC
|
||||||
|
#define EGL_GL_TEXTURE_3D 0x30B2
|
||||||
|
#define EGL_GL_TEXTURE_ZOFFSET 0x30BD
|
||||||
|
#define EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_X 0x30B3
|
||||||
|
#define EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_X 0x30B4
|
||||||
|
#define EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Y 0x30B5
|
||||||
|
#define EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Y 0x30B6
|
||||||
|
#define EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Z 0x30B7
|
||||||
|
#define EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Z 0x30B8
|
||||||
|
#define EGL_IMAGE_PRESERVED 0x30D2
|
||||||
|
#define EGL_NO_IMAGE EGL_CAST(EGLImage,0)
|
||||||
|
typedef EGLSync (EGLAPIENTRYP PFNEGLCREATESYNCPROC) (EGLDisplay dpy, EGLenum type, const EGLAttrib *attrib_list);
|
||||||
|
typedef EGLBoolean (EGLAPIENTRYP PFNEGLDESTROYSYNCPROC) (EGLDisplay dpy, EGLSync sync);
|
||||||
|
typedef EGLint (EGLAPIENTRYP PFNEGLCLIENTWAITSYNCPROC) (EGLDisplay dpy, EGLSync sync, EGLint flags, EGLTime timeout);
|
||||||
|
typedef EGLBoolean (EGLAPIENTRYP PFNEGLGETSYNCATTRIBPROC) (EGLDisplay dpy, EGLSync sync, EGLint attribute, EGLAttrib *value);
|
||||||
|
typedef EGLImage (EGLAPIENTRYP PFNEGLCREATEIMAGEPROC) (EGLDisplay dpy, EGLContext ctx, EGLenum target, EGLClientBuffer buffer, const EGLAttrib *attrib_list);
|
||||||
|
typedef EGLBoolean (EGLAPIENTRYP PFNEGLDESTROYIMAGEPROC) (EGLDisplay dpy, EGLImage image);
|
||||||
|
typedef EGLDisplay (EGLAPIENTRYP PFNEGLGETPLATFORMDISPLAYPROC) (EGLenum platform, void *native_display, const EGLAttrib *attrib_list);
|
||||||
|
typedef EGLSurface (EGLAPIENTRYP PFNEGLCREATEPLATFORMWINDOWSURFACEPROC) (EGLDisplay dpy, EGLConfig config, void *native_window, const EGLAttrib *attrib_list);
|
||||||
|
typedef EGLSurface (EGLAPIENTRYP PFNEGLCREATEPLATFORMPIXMAPSURFACEPROC) (EGLDisplay dpy, EGLConfig config, void *native_pixmap, const EGLAttrib *attrib_list);
|
||||||
|
typedef EGLBoolean (EGLAPIENTRYP PFNEGLWAITSYNCPROC) (EGLDisplay dpy, EGLSync sync, EGLint flags);
|
||||||
|
#if EGL_EGL_PROTOTYPES
|
||||||
|
EGLAPI EGLSync EGLAPIENTRY eglCreateSync (EGLDisplay dpy, EGLenum type, const EGLAttrib *attrib_list);
|
||||||
|
EGLAPI EGLBoolean EGLAPIENTRY eglDestroySync (EGLDisplay dpy, EGLSync sync);
|
||||||
|
EGLAPI EGLint EGLAPIENTRY eglClientWaitSync (EGLDisplay dpy, EGLSync sync, EGLint flags, EGLTime timeout);
|
||||||
|
EGLAPI EGLBoolean EGLAPIENTRY eglGetSyncAttrib (EGLDisplay dpy, EGLSync sync, EGLint attribute, EGLAttrib *value);
|
||||||
|
EGLAPI EGLImage EGLAPIENTRY eglCreateImage (EGLDisplay dpy, EGLContext ctx, EGLenum target, EGLClientBuffer buffer, const EGLAttrib *attrib_list);
|
||||||
|
EGLAPI EGLBoolean EGLAPIENTRY eglDestroyImage (EGLDisplay dpy, EGLImage image);
|
||||||
|
EGLAPI EGLDisplay EGLAPIENTRY eglGetPlatformDisplay (EGLenum platform, void *native_display, const EGLAttrib *attrib_list);
|
||||||
|
EGLAPI EGLSurface EGLAPIENTRY eglCreatePlatformWindowSurface (EGLDisplay dpy, EGLConfig config, void *native_window, const EGLAttrib *attrib_list);
|
||||||
|
EGLAPI EGLSurface EGLAPIENTRY eglCreatePlatformPixmapSurface (EGLDisplay dpy, EGLConfig config, void *native_pixmap, const EGLAttrib *attrib_list);
|
||||||
|
EGLAPI EGLBoolean EGLAPIENTRY eglWaitSync (EGLDisplay dpy, EGLSync sync, EGLint flags);
|
||||||
|
#endif
|
||||||
|
#endif /* EGL_VERSION_1_5 */
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -283,8 +283,13 @@ GLFUNC(PFNGLDEBUGMESSAGECONTROLPROC, glDebugMessageControl)
|
|||||||
|
|
||||||
// wgl
|
// wgl
|
||||||
|
|
||||||
#if BOOST_OS_WINDOWS > 0
|
#if BOOST_OS_WINDOWS
|
||||||
GLFUNC(PFNWGLSWAPINTERVALEXTPROC, wglSwapIntervalEXT)
|
GLFUNC(PFNWGLSWAPINTERVALEXTPROC, wglSwapIntervalEXT)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// x
|
// x
|
||||||
|
|
||||||
|
#if BOOST_OS_LINUX
|
||||||
|
EGLFUNC(PFNEGLSWAPINTERVALPROC, eglSwapInterval)
|
||||||
|
EGLFUNC(PFNEGLGETCURRENTDISPLAYPROC, eglGetCurrentDisplay)
|
||||||
|
#endif
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user