Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Changes to make some kinds of layer comp flag failures more obvious #25

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions changes/conformance/mr.25.gh
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Fix: Make some failures caused by missing layer flag implementations more obvious.
47 changes: 26 additions & 21 deletions src/conformance/conformance_test/test_LayerComposition.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ namespace
{
constexpr XrColor4f Red = {1, 0, 0, 1};
constexpr XrColor4f Green = {0, 1, 0, 1};
constexpr XrColor4f GreenZeroAlpha = {0, 1, 0, 0};
constexpr XrColor4f Blue = {0, 0, 1, 1};
constexpr XrColor4f Purple = {1, 0, 1, 1};
constexpr XrColor4f Yellow = {1, 1, 0, 1};
Expand Down Expand Up @@ -276,9 +277,9 @@ namespace Conformance
const XrQuaternionf redRot = Quat::FromAxisAngle({0, 1, 0}, Math::DegToRad(180));
interactiveLayerManager.AddLayer(compositionHelper.CreateQuadLayer(redSwapchain, viewSpace, 1.0f, XrPosef{redRot, {0, 0, -1}}));

RenderLoop(compositionHelper.GetSession(),
[&](const XrFrameState& frameState) { return interactiveLayerManager.EndFrame(frameState); })
.Loop();
RenderLoop(compositionHelper.GetSession(), [&](const XrFrameState& frameState) {
return interactiveLayerManager.EndFrame(frameState);
}).Loop();
}

// Purpose: Verify order of transforms by exercising the two ways poses can be specified:
Expand Down Expand Up @@ -324,9 +325,9 @@ namespace Conformance
interactiveLayerManager.AddLayer(quad2);
}

RenderLoop(compositionHelper.GetSession(),
[&](const XrFrameState& frameState) { return interactiveLayerManager.EndFrame(frameState); })
.Loop();
RenderLoop(compositionHelper.GetSession(), [&](const XrFrameState& frameState) {
return interactiveLayerManager.EndFrame(frameState);
}).Loop();
}

// Purpose: Validates alpha blending (both premultiplied and unpremultiplied).
Expand All @@ -349,21 +350,25 @@ namespace Conformance
const float t = y / 255.0f;
const XrColor4f dst = Colors::Green;
const XrColor4f src{0, 0, t, t};
const XrColor4f blended{dst.r * (1 - src.a) + src.r, dst.g * (1 - src.a) + src.g, dst.b * (1 - src.a) + src.b, 1};
const XrColor4f blended{dst.r * (1 - src.a) + src.r, dst.g * (1 - src.a) + src.g, dst.b * (1 - src.a) + src.b, 0};
blueGradientOverGreen.DrawRect(0, y, blueGradientOverGreen.width, 1, blended);
}

const XrSwapchain answerSwapchain = compositionHelper.CreateStaticSwapchainImage(blueGradientOverGreen);
interactiveLayerManager.AddLayer(
compositionHelper.CreateQuadLayer(answerSwapchain, viewSpace, 1.0f, XrPosef{Quat::Identity, {0, 0, QuadZ}}));
XrCompositionLayerQuad* truthQuad =
compositionHelper.CreateQuadLayer(answerSwapchain, viewSpace, 1.0f, XrPosef{Quat::Identity, {0, 0, QuadZ}});
truthQuad->layerFlags |= XR_COMPOSITION_LAYER_UNPREMULTIPLIED_ALPHA_BIT;
interactiveLayerManager.AddLayer(truthQuad);
}

auto createGradientTest = [&](bool premultiplied, float x, float y) {
// A solid green quad layer will be composited under a blue gradient.
{
const XrSwapchain greenSwapchain = compositionHelper.CreateStaticSwapchainSolidColor(Colors::Green);
interactiveLayerManager.AddLayer(
compositionHelper.CreateQuadLayer(greenSwapchain, viewSpace, 1.0f, XrPosef{Quat::Identity, {x, y, QuadZ}}));
const XrSwapchain greenSwapchain = compositionHelper.CreateStaticSwapchainSolidColor(Colors::GreenZeroAlpha);
XrCompositionLayerQuad* greenQuad =
compositionHelper.CreateQuadLayer(greenSwapchain, viewSpace, 1.0f, XrPosef{Quat::Identity, {x, y, QuadZ}});
greenQuad->layerFlags |= XR_COMPOSITION_LAYER_UNPREMULTIPLIED_ALPHA_BIT;
interactiveLayerManager.AddLayer(greenQuad);
}

// Create gradient of blue lines from 0.0 to 1.0.
Expand Down Expand Up @@ -394,9 +399,9 @@ namespace Conformance
createGradientTest(true, -1.02f, 0); // Test premultiplied (left of center "answer")
createGradientTest(false, 1.02f, 0); // Test unpremultiplied (right of center "answer")

RenderLoop(compositionHelper.GetSession(),
[&](const XrFrameState& frameState) { return interactiveLayerManager.EndFrame(frameState); })
.Loop();
RenderLoop(compositionHelper.GetSession(), [&](const XrFrameState& frameState) {
return interactiveLayerManager.EndFrame(frameState);
}).Loop();
}

// Purpose: Validate eye visibility flags.
Expand All @@ -423,9 +428,9 @@ namespace Conformance
quad2->eyeVisibility = XR_EYE_VISIBILITY_RIGHT;
interactiveLayerManager.AddLayer(quad2);

RenderLoop(compositionHelper.GetSession(),
[&](const XrFrameState& frameState) { return interactiveLayerManager.EndFrame(frameState); })
.Loop();
RenderLoop(compositionHelper.GetSession(), [&](const XrFrameState& frameState) {
return interactiveLayerManager.EndFrame(frameState);
}).Loop();
}

TEST_CASE("Subimage Tests", "[composition][interactive]")
Expand Down Expand Up @@ -491,9 +496,9 @@ namespace Conformance
}
});

RenderLoop(compositionHelper.GetSession(),
[&](const XrFrameState& frameState) { return interactiveLayerManager.EndFrame(frameState); })
.Loop();
RenderLoop(compositionHelper.GetSession(), [&](const XrFrameState& frameState) {
return interactiveLayerManager.EndFrame(frameState);
}).Loop();
}

TEST_CASE("Projection Array Swapchain", "[composition][interactive]")
Expand Down