AI 修复横竖屏的问题
This commit is contained in:
+34
-3
@@ -9,8 +9,10 @@
|
||||
#ifndef _WIN32
|
||||
#include "../app/src/main/cpp/DebugLog.h"
|
||||
#define FACE_DBG_LOG(...) DebugLog::log(__VA_ARGS__)
|
||||
#define FACE_DBG_LOG_THROTTLED(key, ...) DebugLog::log_throttled(key, __VA_ARGS__)
|
||||
#else
|
||||
#define FACE_DBG_LOG(...) ((void)0)
|
||||
#define FACE_DBG_LOG_THROTTLED(key, ...) ((void)0)
|
||||
#endif
|
||||
|
||||
|
||||
@@ -906,12 +908,18 @@ void FaceApp::onWindowInit()
|
||||
} else {
|
||||
// Recovery path after an earlier onWindowLost. Rebuild only the
|
||||
// window-dependent Vulkan objects; keep renderPass / pipelines /
|
||||
// FaceApp GPU resources intact.
|
||||
// FaceApp GPU resources intact unless the new swapchain is
|
||||
// incompatible (e.g. rotation changed extent).
|
||||
std::unique_lock<std::mutex> lk_point(mtx_point);
|
||||
std::unique_lock<std::mutex> lk_motion(changeMotionMtx);
|
||||
std::unique_lock<std::mutex> lk_tex(createTextureMtx);
|
||||
|
||||
Application::reinitForNewWindow();
|
||||
bool swapchainIncompatible = Application::reinitForNewWindow();
|
||||
|
||||
if (swapchainIncompatible && _faceAppInited) {
|
||||
FACE_DBG_LOG("FaceApp::onWindowInit: swapchain incompatible, rebuilding FaceApp pipelines");
|
||||
recreatePipelinesForSwapchain();
|
||||
}
|
||||
|
||||
if (!_secondfaceAppInited) {
|
||||
_secondfaceAppInited = true;
|
||||
@@ -925,6 +933,29 @@ void FaceApp::onWindowInit()
|
||||
(int)_secondfaceAppInited, (int)_running);
|
||||
}
|
||||
|
||||
void FaceApp::recreatePipelinesForSwapchain()
|
||||
{
|
||||
// Destroy the two FaceApp pipelines. Layouts / descriptor set layouts are
|
||||
// swapchain-independent and kept as-is so existing descriptor sets keep
|
||||
// pointing at the same texture/uniform resources.
|
||||
if (m_graphicsPipeline != VK_NULL_HANDLE) {
|
||||
vkDestroyPipeline(device, m_graphicsPipeline, nullptr);
|
||||
m_graphicsPipeline = VK_NULL_HANDLE;
|
||||
}
|
||||
if (m_graphicsPipeline_bg != VK_NULL_HANDLE) {
|
||||
vkDestroyPipeline(device, m_graphicsPipeline_bg, nullptr);
|
||||
m_graphicsPipeline_bg = VK_NULL_HANDLE;
|
||||
}
|
||||
|
||||
// Recreate against the fresh renderPass (if format changed) and the new
|
||||
// swapChainExtent (viewport/scissor are baked statically into these).
|
||||
create_face_pipelines();
|
||||
create_pipelines_bg();
|
||||
|
||||
FACE_DBG_LOG("FaceApp::recreatePipelinesForSwapchain: rebuilt for extent=%ux%u",
|
||||
swapChainExtent.width, swapChainExtent.height);
|
||||
}
|
||||
|
||||
void FaceApp::update_uniform_buffers()
|
||||
{
|
||||
uint32_t width = 480;
|
||||
@@ -1637,7 +1668,7 @@ Motion FaceApp::getMotionByName(string name)
|
||||
|
||||
void FaceApp::changeMotionList(vector<string> motions, AnimationFinishedCallback callback, bool loop)
|
||||
{
|
||||
DebugLog::log_throttled("FaceApp.changeMotionList",
|
||||
FACE_DBG_LOG_THROTTLED("FaceApp.changeMotionList",
|
||||
"FaceApp::changeMotionList called count=%zu loop=%d _isLoadMotion=%d",
|
||||
motions.size(), (int)loop, (int)_isLoadMotion);
|
||||
if (_isLoadMotion)
|
||||
|
||||
Reference in New Issue
Block a user