Split XCUI hosted preview ImGui presenter seam

This commit is contained in:
2026-04-05 06:34:15 +08:00
parent 6159eef3af
commit 9525053624
7 changed files with 142 additions and 83 deletions

View File

@@ -1,5 +1,6 @@
#include <gtest/gtest.h>
#include "XCUIBackend/ImGuiXCUIHostedPreviewPresenter.h"
#include "XCUIBackend/XCUIHostedPreviewPresenter.h"
#include <XCEngine/UI/DrawData.h>
@@ -46,6 +47,18 @@ void PrepareImGui(float width = 1024.0f, float height = 768.0f) {
io.Fonts->SetTexID(static_cast<ImTextureID>(1));
}
XCEngine::UI::UITextureHandle MakeHostedPreviewTextureHandle(
std::uintptr_t nativeHandle,
std::uint32_t width,
std::uint32_t height) {
XCEngine::UI::UITextureHandle texture = {};
texture.nativeHandle = nativeHandle;
texture.width = width;
texture.height = height;
texture.kind = XCEngine::UI::UITextureHandleKind::ImGuiDescriptor;
return texture;
}
TEST(XCUIHostedPreviewPresenterTest, PresentReturnsFalseAndClearsStatsWhenFrameHasNoDrawData) {
ImGuiContextScope contextScope;
PrepareImGui();
@@ -216,14 +229,14 @@ TEST(XCUIHostedPreviewPresenterTest, QueuedNativePresenterFallsBackLogicalSizeTo
surfaceRegistry.UpdateSurface(
"XCUI Demo",
static_cast<ImTextureID>(static_cast<intptr_t>(11)),
640u,
360u,
MakeHostedPreviewTextureHandle(11u, 640u, 360u),
XCEngine::UI::UIRect(0.0f, 0.0f, 320.0f, 180.0f));
ASSERT_TRUE(presenter->TryGetSurfaceImage("XCUI Demo", image));
EXPECT_TRUE(image.IsValid());
EXPECT_EQ(image.textureId, static_cast<ImTextureID>(static_cast<intptr_t>(11)));
EXPECT_EQ(image.texture.nativeHandle, 11u);
EXPECT_EQ(image.texture.width, 640u);
EXPECT_EQ(image.texture.height, 360u);
EXPECT_FLOAT_EQ(image.uvMin.x, 0.0f);
EXPECT_FLOAT_EQ(image.uvMin.y, 0.0f);
EXPECT_FLOAT_EQ(image.uvMax.x, 0.5f);
@@ -324,9 +337,7 @@ TEST(XCUIHostedPreviewPresenterTest, SurfaceRegistryIgnoresUnnamedQueuedFramesAn
surfaceRegistry.UpdateSurface(
"XCUI Demo",
static_cast<ImTextureID>(static_cast<intptr_t>(13)),
800u,
600u,
MakeHostedPreviewTextureHandle(13u, 800u, 600u),
XCEngine::UI::UIRect(0.0f, 0.0f, 400.0f, 300.0f));
ASSERT_EQ(surfaceRegistry.GetDescriptors().size(), 1u);
@@ -342,14 +353,14 @@ TEST(XCUIHostedPreviewPresenterTest, SurfaceRegistryExposesImageUvForRenderedCan
surfaceRegistry.UpdateSurface(
"XCUI Demo",
static_cast<ImTextureID>(static_cast<intptr_t>(7)),
1024u,
768u,
MakeHostedPreviewTextureHandle(7u, 1024u, 768u),
XCEngine::UI::UIRect(128.0f, 96.0f, 512.0f, 384.0f));
ASSERT_TRUE(surfaceRegistry.TryGetSurfaceImage("XCUI Demo", image));
EXPECT_TRUE(image.IsValid());
EXPECT_EQ(image.textureId, static_cast<ImTextureID>(static_cast<intptr_t>(7)));
EXPECT_EQ(image.texture.nativeHandle, 7u);
EXPECT_EQ(image.texture.width, 1024u);
EXPECT_EQ(image.texture.height, 768u);
EXPECT_EQ(image.surfaceWidth, 1024u);
EXPECT_EQ(image.surfaceHeight, 768u);
EXPECT_FLOAT_EQ(image.uvMin.x, 0.125f);
@@ -400,15 +411,15 @@ TEST(XCUIHostedPreviewPresenterTest, SurfaceRegistryTracksQueuedFrameMetadataAlo
surfaceRegistry.UpdateSurface(
"XCUI Demo",
static_cast<ImTextureID>(static_cast<intptr_t>(9)),
1024u,
512u,
MakeHostedPreviewTextureHandle(9u, 1024u, 512u),
XCEngine::UI::UIRect(128.0f, 64.0f, 320.0f, 160.0f));
ASSERT_TRUE(surfaceRegistry.TryGetSurfaceDescriptor("XCUI Demo", descriptor));
EXPECT_TRUE(descriptor.queuedThisFrame);
EXPECT_TRUE(descriptor.image.IsValid());
EXPECT_EQ(descriptor.image.textureId, static_cast<ImTextureID>(static_cast<intptr_t>(9)));
EXPECT_EQ(descriptor.image.texture.nativeHandle, 9u);
EXPECT_EQ(descriptor.image.texture.width, 1024u);
EXPECT_EQ(descriptor.image.texture.height, 512u);
EXPECT_FLOAT_EQ(descriptor.image.uvMin.x, 0.125f);
EXPECT_FLOAT_EQ(descriptor.image.uvMin.y, 0.125f);
EXPECT_FLOAT_EQ(descriptor.image.uvMax.x, 0.4375f);
@@ -427,9 +438,7 @@ TEST(XCUIHostedPreviewPresenterTest, SurfaceRegistryRejectsInvalidSurfaceUpdates
surfaceRegistry.UpdateSurface(
"XCUI Demo",
static_cast<ImTextureID>(static_cast<intptr_t>(17)),
512u,
256u,
MakeHostedPreviewTextureHandle(17u, 512u, 256u),
XCEngine::UI::UIRect(64.0f, 32.0f, 256.0f, 128.0f));
ASSERT_TRUE(surfaceRegistry.TryGetSurfaceDescriptor("XCUI Demo", descriptor));
@@ -438,25 +447,21 @@ TEST(XCUIHostedPreviewPresenterTest, SurfaceRegistryRejectsInvalidSurfaceUpdates
surfaceRegistry.UpdateSurface(
"XCUI Demo",
ImTextureID{},
512u,
256u,
XCEngine::UI::UITextureHandle{},
XCEngine::UI::UIRect(0.0f, 0.0f, 128.0f, 64.0f));
surfaceRegistry.UpdateSurface(
"",
static_cast<ImTextureID>(static_cast<intptr_t>(19)),
512u,
256u,
MakeHostedPreviewTextureHandle(19u, 512u, 256u),
XCEngine::UI::UIRect(0.0f, 0.0f, 128.0f, 64.0f));
surfaceRegistry.UpdateSurface(
"XCUI Demo",
static_cast<ImTextureID>(static_cast<intptr_t>(21)),
0u,
256u,
MakeHostedPreviewTextureHandle(21u, 0u, 256u),
XCEngine::UI::UIRect(0.0f, 0.0f, 128.0f, 64.0f));
ASSERT_TRUE(surfaceRegistry.TryGetSurfaceDescriptor("XCUI Demo", descriptor));
EXPECT_EQ(descriptor.image.textureId, originalImage.textureId);
EXPECT_EQ(descriptor.image.texture.nativeHandle, originalImage.texture.nativeHandle);
EXPECT_EQ(descriptor.image.texture.width, originalImage.texture.width);
EXPECT_EQ(descriptor.image.texture.height, originalImage.texture.height);
EXPECT_EQ(descriptor.image.surfaceWidth, originalImage.surfaceWidth);
EXPECT_EQ(descriptor.image.surfaceHeight, originalImage.surfaceHeight);
EXPECT_FLOAT_EQ(descriptor.image.uvMin.x, originalImage.uvMin.x);
@@ -504,7 +509,7 @@ TEST(XCUIHostedPreviewPresenterTest, SurfaceRegistryQueriesClearOutputForMissing
descriptor.queuedThisFrame = true;
XCUIHostedPreviewSurfaceImage image = {};
image.textureId = static_cast<ImTextureID>(static_cast<intptr_t>(23));
image.texture = MakeHostedPreviewTextureHandle(23u, 64u, 64u);
image.surfaceWidth = 64u;
image.surfaceHeight = 64u;