Skip to content
Open
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
17 changes: 6 additions & 11 deletions filament/backend/test/test_Blit.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -145,7 +145,6 @@ static void createFaces(DriverApi& dapi, Handle<HwTexture> texture, int baseWidt

TEST_F(BlitTest, ColorMagnify) {
auto& api = getDriverApi();
mCleanup.addPostCall([&]() { executeCommands(); });

constexpr int kSrcTexWidth = 256;
constexpr int kSrcTexHeight = 256;
Expand Down Expand Up @@ -207,7 +206,6 @@ TEST_F(BlitTest, ColorMagnify) {

TEST_F(BlitTest, ColorMinify) {
auto& api = getDriverApi();
mCleanup.addPostCall([&]() { executeCommands(); });

constexpr int kSrcTexWidth = 1024;
constexpr int kSrcTexHeight = 1024;
Expand Down Expand Up @@ -342,7 +340,6 @@ TEST_F(BlitTest, ColorResolve) {

TEST_F(BlitTest, Blit2DTextureArray) {
auto& api = getDriverApi();
mCleanup.addPostCall([&]() { executeCommands(); });

api.startCapture(0);
mCleanup.addPostCall([&]() { api.stopCapture(0); });
Expand Down Expand Up @@ -412,7 +409,6 @@ TEST_F(BlitTest, Blit2DTextureArray) {

TEST_F(BlitTest, BlitRegion) {
auto& api = getDriverApi();
mCleanup.addPostCall([&]() { executeCommands(); });

constexpr int kSrcTexWidth = 1024;
constexpr int kSrcTexHeight = 1024;
Expand Down Expand Up @@ -488,7 +484,6 @@ TEST_F(BlitTest, BlitRegion) {
TEST_F(BlitTest, BlitRegionToSwapChain) {
FAIL_IF(Backend::VULKAN, "Crashes due to not finding color attachment, see b/417481493");
auto& api = getDriverApi();
mCleanup.addPostCall([&]() { executeCommands(); });

constexpr int kSrcTexWidth = 1024;
constexpr int kSrcTexHeight = 1024;
Expand Down Expand Up @@ -541,13 +536,13 @@ TEST_F(BlitTest, BlitRegionToSwapChain) {
dstRect, srcRenderTargets[srcLevel],
srcRect, SamplerMagFilter::LINEAR);

api.commit(swapChain);
}
api.commit(swapChain);

// TODO: for some reason, this test has been disabled. It needs to be tested on all
// machines.
// EXPECT_IMAGE(dstRenderTarget,
// ScreenshotParams(kDstTexWidth, kDstTexHeight, "BlitRegionToSwapChain", 0x0));
// TODO: for some reason, this test has been disabled. It needs to be tested on all
// machines.
// EXPECT_IMAGE(dstRenderTarget,
// ScreenshotParams(kDstTexWidth, kDstTexHeight, "BlitRegionToSwapChain", 0x0));
}
}

} // namespace test
76 changes: 40 additions & 36 deletions filament/backend/test/test_BufferUpdates.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,7 @@ TEST_F(BufferUpdatesTest, VertexBufferUpdate) {
shader.bindUniform<SimpleMaterialParams>(api, ubuffer, kBindingConfig);

api.startCapture(0);
cleanup.addPostCall([&]() { api.stopCapture(0); });

// Upload the uniform, but with an offset to accommodate the padding in the shader's
// uniform definition.
Expand All @@ -101,29 +102,42 @@ TEST_F(BufferUpdatesTest, VertexBufferUpdate) {
});

api.makeCurrent(swapChain, swapChain);
api.beginFrame(0, 0, 0);

// Draw 10 triangles, updating the vertex buffer / index buffer each time.
size_t triangleIndex = 0;
for (float i = -1.0f; i < 1.0f; i += 0.2f) {
const float low = i, high = i + 0.2;
const filament::math::float2 v[3]{{ low, low },
{ high, low },
{ low, high }};
triangle.updateVertices(v);

if (updateIndices) {
if (triangleIndex % 2 == 0) {
// Upload each index separately, to test offsets.
const TrianglePrimitive::index_type i[3]{ 0, 1, 2 };
triangle.updateIndices(i + 0, 1, 0);
triangle.updateIndices(i + 1, 1, 1);
triangle.updateIndices(i + 2, 1, 2);
} else {
// This effectively hides this triangle.
const TrianglePrimitive::index_type i[3]{ 0, 0, 0 };
triangle.updateIndices(i);
{
RenderFrame frame(api);

// Draw 10 triangles, updating the vertex buffer / index buffer each time.
size_t triangleIndex = 0;
for (float i = -1.0f; i < 1.0f; i += 0.2f) {
const float low = i, high = i + 0.2;
const filament::math::float2 v[3]{{ low, low },
{ high, low },
{ low, high }};
triangle.updateVertices(v);

if (updateIndices) {
if (triangleIndex % 2 == 0) {
// Upload each index separately, to test offsets.
const TrianglePrimitive::index_type i[3]{ 0, 1, 2 };
triangle.updateIndices(i + 0, 1, 0);
triangle.updateIndices(i + 1, 1, 1);
triangle.updateIndices(i + 2, 1, 2);
} else {
// This effectively hides this triangle.
const TrianglePrimitive::index_type i[3]{ 0, 0, 0 };
triangle.updateIndices(i);
}
}

if (triangleIndex > 0) {
params.flags.clear = TargetBufferFlags::NONE;
params.flags.discardStart = TargetBufferFlags::NONE;
}

api.beginRenderPass(defaultRenderTarget, params);
api.draw(state, triangle.getRenderPrimitive(), 0, 3, 1);
api.endRenderPass();

triangleIndex++;
}

if (triangleIndex > 0) {
Expand All @@ -141,15 +155,7 @@ TEST_F(BufferUpdatesTest, VertexBufferUpdate) {

triangleIndex++;
}

api.flush();
api.commit(swapChain);
api.endFrame(0);

api.stopCapture(0);
}

executeCommands();
}

// This test renders two triangles in two separate draw calls. Between the draw calls, a uniform
Expand Down Expand Up @@ -241,15 +247,13 @@ TEST_F(BufferUpdatesTest, BufferObjectUpdateWithOffset) {
"BufferObjectUpdateWithOffset", 2320747245));

api.flush();
api.commit(swapChain);
api.endFrame(0);
{
RenderFrame frame(api);
api.commit(swapChain);
}

// This ensures all driver commands have finished before exiting the test.
api.finish();

executeCommands();

getDriver().purge();
}

} // namespace test
177 changes: 92 additions & 85 deletions filament/backend/test/test_Callbacks.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -29,58 +29,61 @@ TEST_F(BackendTest, FrameScheduledCallback) {
SKIP_IF(Backend::VULKAN, "Frame callbacks are unsupported in Vulkan, see b/417254479");
SKIP_IF(Backend::WEBGPU, "Frame callbacks are unsupported in WebGPU");

auto& api = getDriverApi();
Cleanup cleanup(api);

// Create a SwapChain.
// In order for the frameScheduledCallback to be called, this must be a real SwapChain (not
// headless) so we obtain a drawable.
auto swapChain = cleanup.add(createSwapChain());

Handle<HwRenderTarget> renderTarget = cleanup.add(api.createDefaultRenderTarget());

int callbackCountA = 0;
api.setFrameScheduledCallback(swapChain, nullptr, [&callbackCountA](PresentCallable callable) {
callable();
callbackCountA++;
}, 0);

// Render the first frame.
api.makeCurrent(swapChain, swapChain);
api.beginFrame(0, 0, 0);
api.beginRenderPass(renderTarget, {});
api.endRenderPass(0);
api.commit(swapChain);
api.endFrame(0);

// Render the next frame. The same callback should be called.
api.makeCurrent(swapChain, swapChain);
api.beginFrame(0, 0, 0);
api.beginRenderPass(renderTarget, {});
api.endRenderPass(0);
api.commit(swapChain);
api.endFrame(0);

// Now switch out the callback.
int callbackCountB = 0;
api.setFrameScheduledCallback(swapChain, nullptr, [&callbackCountB](PresentCallable callable) {
callable();
callbackCountB++;
}, 0);

// Render one final frame.
api.makeCurrent(swapChain, swapChain);
api.beginFrame(0, 0, 0);
api.beginRenderPass(renderTarget, {});
api.endRenderPass(0);
api.commit(swapChain);
api.endFrame(0);

api.finish();

executeCommands();
getDriver().purge();

{
auto& api = getDriverApi();
Cleanup cleanup(api);
cleanup.addPostCall([&]() { executeCommands(); });
cleanup.addPostCall([&]() { getDriver().purge(); });

// Create a SwapChain.
// In order for the frameScheduledCallback to be called, this must be a real SwapChain (not
// headless) so we obtain a drawable.
auto swapChain = cleanup.add(createSwapChain());

Handle<HwRenderTarget> renderTarget = cleanup.add(api.createDefaultRenderTarget());

api.setFrameScheduledCallback(swapChain, nullptr, [&callbackCountA](PresentCallable callable) {
callable();
callbackCountA++;
}, 0);

// Render the first frame.
api.makeCurrent(swapChain, swapChain);
{
RenderFrame frame(api);
api.beginRenderPass(renderTarget, {});
api.endRenderPass(0);
api.commit(swapChain);
}

// Render the next frame. The same callback should be called.
api.makeCurrent(swapChain, swapChain);
{
RenderFrame frame(api);
api.beginRenderPass(renderTarget, {});
api.endRenderPass(0);
api.commit(swapChain);
}

// Now switch out the callback.
api.setFrameScheduledCallback(swapChain, nullptr, [&callbackCountB](PresentCallable callable) {
callable();
callbackCountB++;
}, 0);

// Render one final frame.
api.makeCurrent(swapChain, swapChain);
{
RenderFrame frame(api);
api.beginRenderPass(renderTarget, {});
api.endRenderPass(0);
api.commit(swapChain);
}

api.finish();
}
EXPECT_EQ(callbackCountA, 2);
EXPECT_EQ(callbackCountB, 1);
}
Expand All @@ -90,43 +93,47 @@ TEST_F(BackendTest, FrameCompletedCallback) {
SKIP_IF(Backend::VULKAN, "Frame callbacks are unsupported in Vulkan, see b/417254479");
SKIP_IF(Backend::WEBGPU, "Frame callbacks are unsupported in WebGPU");

auto& api = getDriverApi();
Cleanup cleanup(api);

// Create a SwapChain.
auto swapChain = cleanup.add(api.createSwapChainHeadless(256, 256, 0));

int callbackCountA = 0;
api.setFrameCompletedCallback(swapChain, nullptr,
[&callbackCountA]() { callbackCountA++; });

// Render the first frame.
api.makeCurrent(swapChain, swapChain);
api.beginFrame(0, 0, 0);
api.commit(swapChain);
api.endFrame(0);

// Render the next frame. The same callback should be called.
api.makeCurrent(swapChain, swapChain);
api.beginFrame(0, 0, 0);
api.commit(swapChain);
api.endFrame(0);

// Now switch out the callback.
int callbackCountB = 0;
api.setFrameCompletedCallback(swapChain, nullptr,
[&callbackCountB]() { callbackCountB++; });

// Render one final frame.
api.makeCurrent(swapChain, swapChain);
api.beginFrame(0, 0, 0);
api.commit(swapChain);
api.endFrame(0);

api.finish();

executeCommands();
getDriver().purge();
{
auto& api = getDriverApi();
Cleanup cleanup(api);
cleanup.addPostCall([&]() { executeCommands(); });
cleanup.addPostCall([&]() { getDriver().purge(); });

// Create a SwapChain.
auto swapChain = cleanup.add(api.createSwapChainHeadless(256, 256, 0));

api.setFrameCompletedCallback(swapChain, nullptr,
[&callbackCountA]() { callbackCountA++; });

// Render the first frame.
api.makeCurrent(swapChain, swapChain);
{
RenderFrame frame(api);
api.commit(swapChain);
}

// Render the next frame. The same callback should be called.
api.makeCurrent(swapChain, swapChain);
{
RenderFrame frame(api);
api.commit(swapChain);
}

// Now switch out the callback.
api.setFrameCompletedCallback(swapChain, nullptr,
[&callbackCountB]() { callbackCountB++; });

// Render one final frame.
api.makeCurrent(swapChain, swapChain);
{
RenderFrame frame(api);
api.commit(swapChain);
}

api.finish();
}

EXPECT_EQ(callbackCountA, 2);
EXPECT_EQ(callbackCountB, 1);
Expand Down
Loading
Loading