From cfc4f34c1885f42d76a16f7e2ba0ebb2fb1a44f7 Mon Sep 17 00:00:00 2001 From: Matthew Hoffman Date: Mon, 21 Apr 2025 19:57:40 -0500 Subject: [PATCH] Use EXPECT_IMAGE in all backend tests. (#8628) --- filament/backend/test/BackendTest.cpp | 50 +--------- filament/backend/test/BackendTest.h | 12 ++- filament/backend/test/ImageExpectations.cpp | 33 +++--- filament/backend/test/ImageExpectations.h | 4 +- .../expected_images/Blit2DTextureArray.png | Bin 1604 -> 1604 bytes .../BufferObjectUpdateWithOffset.png | Bin 0 -> 3804 bytes .../test/expected_images/ColorMagnify.png | Bin 2718 -> 2718 bytes .../test/expected_images/ColorMinify.png | Bin 3299 -> 3299 bytes .../test/expected_images/ColorResolve.png | Bin 1484 -> 1484 bytes .../expected_images/DepthAndStencilBuffer.png | Bin 0 -> 3140 bytes .../test/expected_images/FeedbackLoops.png | Bin 0 -> 982 bytes .../expected_images/RGB FLOAT to RGB16F.png | Bin 0 -> 4208 bytes ...RGB32F (subregions and buffer padding).png | Bin 0 -> 4208 bytes ... FLOAT to RGB32F (with buffer padding).png | Bin 0 -> 4208 bytes .../expected_images/RGB FLOAT to RGB32F.png | Bin 0 -> 4208 bytes .../RGB HALF to R11F_G11F_B10F.png | Bin 0 -> 4208 bytes ...UINT_10F_11F_11F_REV to R11F_G11F_B10F.png | Bin 0 -> 4208 bytes .../RGBA FLOAT to RGBA16F (subregions).png | Bin 0 -> 4208 bytes ...FLOAT to RGBA16F (with buffer padding).png | Bin 0 -> 4208 bytes .../expected_images/RGBA FLOAT to RGBA16F.png | Bin 0 -> 4208 bytes ... RGBA8 (subregions and buffer padding).png | Bin 0 -> 4208 bytes .../RGBA UBYTE to RGBA8 (subregions).png | Bin 0 -> 4208 bytes ...A UBYTE to RGBA8 (with buffer padding).png | Bin 0 -> 4208 bytes .../expected_images/RGBA UBYTE to RGBA8.png | Bin 0 -> 4208 bytes .../RGBA UINT_2_10_10_10_REV to RGB10_A2.png | Bin 0 -> 4208 bytes .../RGB_INTEGER INT to RGB32I.png | Bin 0 -> 4208 bytes .../RGB_INTEGER UBYTE to RGB8UI.png | Bin 0 -> 4208 bytes .../RGB_INTEGER USHORT to RGB16UI.png | Bin 0 -> 4208 bytes .../expected_images/RenderExternalImage.png | Bin 0 -> 4047 bytes .../ScissorViewportEdgeCases.png | Bin 0 -> 3362 bytes .../test/expected_images/StencilBuffer.png | Bin 0 -> 3140 bytes .../StencilBufferAutoResolve.png | Bin 0 -> 3838 bytes .../test/expected_images/UpdateImage3D.png | Bin 0 -> 4208 bytes .../expected_images/UpdateImageMipLevel.png | Bin 0 -> 4208 bytes .../test/expected_images/UpdateImageSRGB.png | Bin 0 -> 4774 bytes .../backend/test/expected_images/scissor.png | Bin 0 -> 2879 bytes filament/backend/test/test_Blit.cpp | 94 ++++++------------ filament/backend/test/test_BufferUpdates.cpp | 7 +- filament/backend/test/test_FeedbackLoops.cpp | 28 +----- filament/backend/test/test_LoadImage.cpp | 87 +++++++--------- filament/backend/test/test_PushConstants.cpp | 10 +- .../backend/test/test_RenderExternalImage.cpp | 8 +- filament/backend/test/test_Scissor.cpp | 21 +--- filament/backend/test/test_StencilBuffer.cpp | 10 +- 44 files changed, 123 insertions(+), 241 deletions(-) create mode 100644 filament/backend/test/expected_images/BufferObjectUpdateWithOffset.png create mode 100644 filament/backend/test/expected_images/DepthAndStencilBuffer.png create mode 100644 filament/backend/test/expected_images/FeedbackLoops.png create mode 100644 filament/backend/test/expected_images/RGB FLOAT to RGB16F.png create mode 100644 filament/backend/test/expected_images/RGB FLOAT to RGB32F (subregions and buffer padding).png create mode 100644 filament/backend/test/expected_images/RGB FLOAT to RGB32F (with buffer padding).png create mode 100644 filament/backend/test/expected_images/RGB FLOAT to RGB32F.png create mode 100644 filament/backend/test/expected_images/RGB HALF to R11F_G11F_B10F.png create mode 100644 filament/backend/test/expected_images/RGB UINT_10F_11F_11F_REV to R11F_G11F_B10F.png create mode 100644 filament/backend/test/expected_images/RGBA FLOAT to RGBA16F (subregions).png create mode 100644 filament/backend/test/expected_images/RGBA FLOAT to RGBA16F (with buffer padding).png create mode 100644 filament/backend/test/expected_images/RGBA FLOAT to RGBA16F.png create mode 100644 filament/backend/test/expected_images/RGBA UBYTE to RGBA8 (subregions and buffer padding).png create mode 100644 filament/backend/test/expected_images/RGBA UBYTE to RGBA8 (subregions).png create mode 100644 filament/backend/test/expected_images/RGBA UBYTE to RGBA8 (with buffer padding).png create mode 100644 filament/backend/test/expected_images/RGBA UBYTE to RGBA8.png create mode 100644 filament/backend/test/expected_images/RGBA UINT_2_10_10_10_REV to RGB10_A2.png create mode 100644 filament/backend/test/expected_images/RGB_INTEGER INT to RGB32I.png create mode 100644 filament/backend/test/expected_images/RGB_INTEGER UBYTE to RGB8UI.png create mode 100644 filament/backend/test/expected_images/RGB_INTEGER USHORT to RGB16UI.png create mode 100644 filament/backend/test/expected_images/RenderExternalImage.png create mode 100644 filament/backend/test/expected_images/ScissorViewportEdgeCases.png create mode 100644 filament/backend/test/expected_images/StencilBuffer.png create mode 100644 filament/backend/test/expected_images/StencilBufferAutoResolve.png create mode 100644 filament/backend/test/expected_images/UpdateImage3D.png create mode 100644 filament/backend/test/expected_images/UpdateImageMipLevel.png create mode 100644 filament/backend/test/expected_images/UpdateImageSRGB.png create mode 100644 filament/backend/test/expected_images/scissor.png diff --git a/filament/backend/test/BackendTest.cpp b/filament/backend/test/BackendTest.cpp index 9bf3cd490e..31c81040f2 100644 --- a/filament/backend/test/BackendTest.cpp +++ b/filament/backend/test/BackendTest.cpp @@ -55,14 +55,17 @@ void BackendTest::init(Backend backend, OperatingSystem operatingSystem, bool is BackendTest::BackendTest() : commandBufferQueue(CONFIG_MIN_COMMAND_BUFFERS_SIZE, CONFIG_COMMAND_BUFFERS_SIZE, /*mPaused=*/false) { initializeDriver(); + mImageExpectations.emplace(getDriverApi()); } BackendTest::~BackendTest() { + // Ensure all graphics commands and callbacks are finished. + flushAndWait(); + mImageExpectations->evaluate(); // Note: Don't terminate the driver for OpenGL, as it wipes away the context and removes the buffer from the screen. if (sBackend == Backend::OPENGL) { return; } - flushAndWait(); driver->terminate(); delete driver; } @@ -156,51 +159,6 @@ void BackendTest::renderTriangle( api.endRenderPass(); } -void BackendTest::readPixelsAndAssertHash(const char* testName, size_t width, size_t height, - Handle rt, uint32_t expectedHash, bool exportScreenshot) { - void* buffer = calloc(1, width * height * 4); - - struct Capture { - uint32_t expectedHash; - char* name; - bool exportScreenshot; - size_t width, height; - }; - auto* c = new Capture(); - c->expectedHash = expectedHash; - c->name = strdup(testName); - c->exportScreenshot = exportScreenshot; - c->width = width; - c->height = height; - - PixelBufferDescriptor pbd(buffer, width * height * 4, PixelDataFormat::RGBA, PixelDataType::UBYTE, - 1, 0, 0, width, [](void* buffer, size_t size, void* user) { - auto* c = (Capture*)user; - - // Export a screenshot, if requested. - if (c->exportScreenshot) { -#ifndef FILAMENT_IOS - LinearImage image(c->width, c->height, 4); - image = toLinearWithAlpha(c->width, c->height, c->width * 4, - (uint8_t*) buffer); - const std::string png = std::string(c->name) + ".png"; - std::ofstream outputStream(png.c_str(), std::ios::binary | std::ios::trunc); - ImageEncoder::encode(outputStream, ImageEncoder::Format::PNG, image, "", - png); -#endif - } - - // Hash the contents of the buffer and check that they match. - uint32_t hash = utils::hash::murmur3((const uint32_t*) buffer, size / 4, 0); - ASSERT_EQ(hash, c->expectedHash) << c->name << " failed: hashes do not match." << std::endl; - - free(buffer); - free(c->name); - free(c); - }, (void*)c); - getDriverApi().readPixels(rt, 0, 0, width, height, std::move(pbd)); -} - bool BackendTest::matchesEnvironment(Backend backend) { return sBackend == backend; } diff --git a/filament/backend/test/BackendTest.h b/filament/backend/test/BackendTest.h index 1cfa3f638d..c2d05cb37d 100644 --- a/filament/backend/test/BackendTest.h +++ b/filament/backend/test/BackendTest.h @@ -25,6 +25,7 @@ #include "private/backend/DriverApi.h" #include "PlatformRunner.h" +#include "ImageExpectations.h" namespace test { @@ -65,17 +66,14 @@ protected: filament::backend::Handle program, const filament::backend::RenderPassParams& params); - void readPixelsAndAssertHash(const char* testName, size_t width, size_t height, - filament::backend::Handle rt, uint32_t expectedHash, - bool exportScreenshot = false); - filament::backend::DriverApi& getDriverApi() { return *commandStream; } filament::backend::Driver& getDriver() { return *driver; } + ImageExpectations& getExpectations() { return *mImageExpectations; } + static bool matchesEnvironment(Backend backend); static bool matchesEnvironment(OperatingSystem operatingSystem); static bool matchesEnvironment(OperatingSystem operatingSystem, Backend backend); - private: filament::backend::Driver* driver = nullptr; @@ -83,6 +81,10 @@ private: std::unique_ptr commandStream; filament::backend::Handle uniform; + + // This isn't truly optional, it just needs to delay construction until after the driver has + // been initialized + std::optional mImageExpectations; }; } // namespace test diff --git a/filament/backend/test/ImageExpectations.cpp b/filament/backend/test/ImageExpectations.cpp index 623d609db8..62dbcac680 100644 --- a/filament/backend/test/ImageExpectations.cpp +++ b/filament/backend/test/ImageExpectations.cpp @@ -97,16 +97,21 @@ void ImageExpectation::evaluate() { void ImageExpectation::compareImage() const { bool bytesFilled = mResult.bytesFilled(); + // If this fails, it likely means that BackendTest::flushAndWait needs to be called before + // ImageExpectations is evaluated or destroyed. EXPECT_THAT(bytesFilled, testing::IsTrue()) << "Render target wasn't copied to the buffer for " << mFileName; if (bytesFilled) { - LoadedPng loadedImage(mParams.expectedFilePath()); // Rather than directly compare the two images compare their hashes because comparing very // large arrays generates way too much debug output to be useful. uint32_t actualHash = mResult.hash(); +#ifndef FILAMENT_IOS + LoadedPng loadedImage(mParams.expectedFilePath()); uint32_t loadedImageHash = loadedImage.hash(); - EXPECT_THAT(actualHash, testing::Eq(loadedImageHash)); - EXPECT_THAT(actualHash, testing::Eq(mParams.expectedHash())); + EXPECT_THAT(actualHash, testing::Eq(loadedImageHash)) << mParams.expectedFileName(); +#endif + // For builds that can't load PNGs (currently iOS only) use the expected hash. + EXPECT_THAT(actualHash, testing::Eq(mParams.expectedHash())) << mParams.expectedFileName(); // TODO: Add better debug output, such as generating a diff image. } } @@ -121,12 +126,13 @@ ImageExpectations::~ImageExpectations() { void ImageExpectations::addExpectation(const char* fileName, int lineNumber, filament::backend::RenderTargetHandle renderTarget, ScreenshotParams params) { - mExpectations.emplace_back(fileName, lineNumber, mApi, std::move(params), renderTarget); + mExpectations.emplace_back(std::make_unique(fileName, lineNumber, mApi, + std::move(params), renderTarget)); } void ImageExpectations::evaluate() { for (auto& expectation: mExpectations) { - expectation.evaluate(); + expectation->evaluate(); } mExpectations.clear(); } @@ -134,16 +140,13 @@ void ImageExpectations::evaluate() { RenderTargetDump::RenderTargetDump(filament::backend::DriverApi& api, filament::backend::RenderTargetHandle renderTarget, const ScreenshotParams& params) : mInternal(std::make_unique(params)) { -#ifdef FILAMENT_IOS - bytesFilled_ = true; - bytes_.resize(size); - std::fill(bytes_.begin(), bytes_.end(), 0); -#else const size_t size = mInternal->params.width() * mInternal->params.height() * 4; mInternal->bytes.resize(size); auto cb = [](void* buffer, size_t size, void* user) { auto* internal = static_cast(user); + internal->bytesFilled = true; +#ifndef FILAMENT_IOS image::LinearImage image(internal->params.width(), internal->params.width(), 4); image = image::toLinearWithAlpha(internal->params.width(), internal->params.height(), @@ -152,14 +155,13 @@ RenderTargetDump::RenderTargetDump(filament::backend::DriverApi& api, std::ofstream pngStream(filePath, std::ios::binary | std::ios::trunc); image::ImageEncoder::encode(pngStream, image::ImageEncoder::Format::PNG, image, "", filePath); - internal->bytesFilled = true; +#endif }; filament::backend::PixelBufferDescriptor pb(mInternal->bytes.data(), size, filament::backend::PixelDataFormat::RGBA, filament::backend::PixelDataType::UBYTE, cb, (void*)mInternal.get()); api.readPixels(renderTarget, 0, 0, mInternal->params.width(), mInternal->params.height(), std::move(pb)); -#endif } RenderTargetDump::~RenderTargetDump() { @@ -183,9 +185,9 @@ bool RenderTargetDump::bytesFilled() const { RenderTargetDump::Internal::Internal(const ScreenshotParams& params) : params(params) {} -LoadedPng::LoadedPng(std::string filePath) { +LoadedPng::LoadedPng(std::string filePath) : mFilePath(std::move(filePath)) { #ifndef FILAMENT_IOS - std::ifstream pngStream(filePath, std::ios::binary); + std::ifstream pngStream(mFilePath, std::ios::binary); image::LinearImage loadedImage = image::ImageDecoder::decode(pngStream, filePath, image::ImageDecoder::ColorSpace::LINEAR); size_t valuesInImage = loadedImage.getWidth() * loadedImage.getHeight() * @@ -201,7 +203,8 @@ LoadedPng::LoadedPng(std::string filePath) { } uint32_t LoadedPng::hash() const { - EXPECT_THAT(mBytes, testing::Not(testing::IsEmpty())); + EXPECT_THAT(mBytes, testing::Not(testing::IsEmpty())) + << "Failed to load expected test result: " << mFilePath; if (mBytes.empty()) { return 0; } diff --git a/filament/backend/test/ImageExpectations.h b/filament/backend/test/ImageExpectations.h index cab2b10374..afbc2b646f 100644 --- a/filament/backend/test/ImageExpectations.h +++ b/filament/backend/test/ImageExpectations.h @@ -106,6 +106,7 @@ public: uint32_t hash() const; private: + std::string mFilePath; std::vector mBytes; }; @@ -141,7 +142,8 @@ public: private: filament::backend::DriverApi& mApi; - std::vector mExpectations; + // Store expectations in unique pointers because they are self referential. + std::vector> mExpectations; }; #endif //TNT_IMAGE_EXPECTATIONS_H diff --git a/filament/backend/test/expected_images/Blit2DTextureArray.png b/filament/backend/test/expected_images/Blit2DTextureArray.png index 29fc1e3299143ed463eb41d078fc6184efc7ca90..a7c2783556adba1bf776c44007526b4fd0c38c8e 100644 GIT binary patch delta 24 gcmX@YbA)Gt3KwH>kh>GZx^prwCn^eWbYx}&0B6Jp?*IS* delta 37 tcmX@YbA)GtiWEz_qpu?a!^VE@KZ&di3=E9LLGDfr>(0r%+-S$f1_07U3n2gi diff --git a/filament/backend/test/expected_images/BufferObjectUpdateWithOffset.png b/filament/backend/test/expected_images/BufferObjectUpdateWithOffset.png new file mode 100644 index 0000000000000000000000000000000000000000..ee45ccd728508b3eb2b69dc21c3e030a7ad8ec26 GIT binary patch literal 3804 zcmeHK`%@HG8vVL$u~ES3nFy$WLl2KqKu6RdPa9}pa1fP3m=em2(M01bQ$A5}ZNvuy zs6-=jYOxEQH5aW$5aEltU~W_Q1PXF7jH{N;MTd(QdJ zy?y6gwa+Nb3miORFaQMRo8%$@7XQiu?}x+litk_Iz^o|B%Yu_v!ye&;TaY;|6X4X2 zA+P2R#JPT+sc0I&x)=au69B<04*^yg0e-Opq&NUVY|Wp~Oalm-oiAq=S2REAKD+a- zDOkQ>zVqsZWkYhA{)hOIa|6r7J+?hyn%neEe$|PW|7xlIx$pG)$La9!!GCtVJo>`V zsbl!F=SyeV;c_&qzxm?cP!X2nv^SIgiovf_bQW<#tM*po|AU-%6t(L(*l$+ z0$h=y_31lMYzI>eYh5~SfO9G*B?|C(-AI@v!cIF_ZXSVSTBfmpbFX`SkdNK(2I~U^AG__IQDs*K4pWQQY=0C3hWm;O-|bd~%Cgndx-&dO?bGp^%6U9ZrwVly z|4}RmQHve#tHozW0)2*?C#>?FYj4{l)#lgns?F|q_o}CrVOCG;OxalVQ+>Bnm3+~p zO17U_sY;&xS(V(8qh6Eqb?RZgN*LqQ>B}ouDMv4>yH!89DMbCsJ1_b6uN1SrAp)G0 z!Opn{(YtwrSEkGGla`4RU}!D5x28xqs9_q-T%!c-dRD)Ox2|G)11T*|2O}xSvKzWh z&_M`oV~k^Lg14lF z5UOAt$=JqwO9BMahK|j!P^Jw7I4PSp%#DQ+I?~XX$k+x@c#9U21X>aqo55QWAjyl; zGM;K`YbLK0Qd7BI(*7#;BoEYjjXU)orniQSU7Y zP(v--5M`vLPyCe&GyoRnLxDsrOL44KOD)gVfX=Hhi7^hR@KP=4yb8k@<7jUQQPi@n z2^`JT)&$PYQd?os5KL|L@{G%CtI}V&M9-)@8{)kmrG&N4qz%t#U--^RHQD1|@5W$tffIC~XE@eSED!V`D0LIysN&WyoYMI9Zz!H(| z5&^mkxYld{S3Pe*qBTh{PC;U%XkCWHFJ*T-5|7p@$w(~JG0%`#p2cA@NHM^8yV7Z zM!tVP4qNzs^r*?x?zy86qigU*Nf<6+;}o6p2P6~{n4Yzq^eQN;MdK_ zuLTBRXln$S9kftZyK50aR?NG^;|aPhEE4c;SX*|BDC`b8AuIUK9w?#2L7kKsw2u;- zjf)9!@;e=bXsiB#GIHLoBRxX)MU%$mOSX_jkNY7}b-wo=aVTZCAX1 zYVfI8!ib+wPr%aIM2Ifu8cLk`S4zBiFh{{nUP`BynT$L#(~KgGrN(;%sqfsO#gCVd z1wCq4qasHNraudRo(EL__jVc*a>G;ql|Kyy>DZ{TaGe9mC^TXSZPGD& z@z#j?M*MLdm!%OHFB@bj2!}Uh$q$DR(Yl@mWvlGIgTU!_Wfg|a94)gLFIsyv+hxGG zmbq38U)NsVg866-5nP10Otk(5iP^Hd2Z>wl%335A3d{;5Hpj3Jkl40~chuv{kSJOs z5Nft7$@m)^8_RZJge}bC8t|X%o(4XYWbkOg7{h?HLbRqKw5(P+h0tXNwj&aCcJrY% zsIyvhVlqo1qH`P$Num?eQYsal_#{Yc#9m@2vR0`?A6p{XU(rBl9p6SQPZpi&Xt`0A z$`CWxuB=AO**az^_Sh23owK;qpC(HaUx7r|M4=D=7h+v2 z_Qs)QPUuU*AwcLukNP^kAAjhYJQ71$hx0HD^d-y5UG>~?RvMT1@qR5UqnmIMMLH>Hr~H^=qhs3q9V&?^DPo z1CGB%F_sg=tFbMZLfKO4Bfp%g#w@3i?&usw7qb=+ukMeoQXlqk>UCEtefNT0NkldN z&FMtda+#ih%aK5dnNLMR{BRESu{ph-Y_h(Ro(Ee+U!TZ~Tm?6$|H9DwMmfLvgSY3; Qiv;|WpHnEG%(8C$Kj>X|Gynhq literal 0 HcmV?d00001 diff --git a/filament/backend/test/expected_images/ColorMagnify.png b/filament/backend/test/expected_images/ColorMagnify.png index d3bfe4249b7429f055af111505f9f52108e7614e..06f1381eeac760d2981a679ecc84e755f48768bb 100644 GIT binary patch delta 24 gcmbOyI!|kh>GZx^prwCn^eWbd2Q!0An-=6951J delta 37 tcmbOyI!|(0r%+-R4;1pvy!3q=3` diff --git a/filament/backend/test/expected_images/ColorMinify.png b/filament/backend/test/expected_images/ColorMinify.png index 764cf90ca03eb54066cc3ac5e7adf5f07ecb40d0..d379f332ff5e292ef6a9480ab472175532398b74 100644 GIT binary patch delta 24 gcmaDX`B-v-3KwH>kh>GZx^prwCn^eWbX>#(0C3g_>;M1& delta 37 tcmaDX`B-v-iWEz_qpu?a!^VE@KZ&di3=E9LLGDfr>(0r%+-SFy2LRvC3?2Xg diff --git a/filament/backend/test/expected_images/ColorResolve.png b/filament/backend/test/expected_images/ColorResolve.png index 5b4e381e038ad5f301010d35eb4c297e2ea66576..e8b0cde6008eb57eaff61c233db660b0f51d45b5 100644 GIT binary patch delta 24 gcmX@ZeTI923KwH>kh>GZx^prwCn^eWbnIpY0BRQqga7~l delta 37 tcmX@ZeTI92iWEz_qpu?a!^VE@KZ&di3=E9LLGDfr>(0r%+-TRw3INqk3$_3N diff --git a/filament/backend/test/expected_images/DepthAndStencilBuffer.png b/filament/backend/test/expected_images/DepthAndStencilBuffer.png new file mode 100644 index 0000000000000000000000000000000000000000..1e663aa397ce118b94cfe68a040d6721fccb363e GIT binary patch literal 3140 zcmeH}Yfn^17=Yg$*LD^}ShTt|h;U#RDi*ie;-W+WR{>E}G=^Gg4=PYlz@!C{OC1nW z7P%@KkV`R5@YYamtfDoB+KW+IYO1yCCFayBSrL&~FI(k9-ZShdIxA=FA*m zz_BVR&dXz(2LN~_#M_er2!2U`zJ_>OcCN&`2EZUkZ%PTQ~~BU15Dl4c6N0Xfaiq-d(7Ixwnxs$0`t7d_V2g) zKib*Xbg;{QB69TLQS0W4@x4X<;Ui%?O1)s!{hywBL+J+Jod8z`?&ky&=)BnXs+Izq zID3Y-9bo8jJ;ZYkUzHr{lN`Jy>AEO6&?R|qK=N+4q&6)0)$l>dp}!;tk4U;6NDeee z-a9UN_ll%8BKXU2ljP7z$-!%quBVa%dnE6DBYF3CN$rVXO++yG8Ucd5Jege&y`hW8 z1sHW;y&$Jg&8Zf*rDh$FOg}1_c2=-0=dxthP092@$+VY(emM@wtQN_1xjnzMGh!UI z<&xy48_+ff_;7314mc1vz*mCQaSx$!%}(arL;mt@MPSBV9AaZWGcVSOJ(R_WJ2DFTV9F$L4bveMqjnRNtGY0J9KnI$reDjg(R7ECY81 z1$8^oJkhlqSY8!Cff+svAmD6-9=u1LN3^9}QnrB0Ko|~2Sq6m+Wj@hjQ0_CZ5R~i8 z(19|g5o}z(N3;MgDI4cN83+?CD9gacr!62FE}69$*d&x0W=KNWjL+m{1kn^ODf8qq z5W=}E15>mftOvk^+q3QgQ#_&?Ov@4F(2Sv$O;leD!wk%U>*-d&5=5W}Wdq8sL`_CH z7bVWxk1~XSZ5O2Q@?)YJQ3e@UC6;vxOu^Dt4k^5RpQx)*W>Qv(rN0@bU|CoJPF`*x z>LirKl+|LHYlaB^%t~};9Lk)V|a(MIe4cX z*81vzGF)kAD}>^{iwppv!2q2NcpAjwiQ+MKVeEa3{Wy&MHvEsnU}vpAJF(%TxRp@z z${@UDWvn zfVM_a^9Zon4pxc>(0Ma?j)#)Fkvi*9S`>9Q%2t#VU|1o~vFvH3DZC6+)EtzbJ6JxJ z9SXUQW#Ivu!b=}TeH-NuRV*LNiDq&gOIsUl=H+BX#g($FRcr^ANoF#DrLCPd^U_yQ z!%_C3#4;Que`Xsstpu=EP*WnJhMM9KP1Lj)(MEeZ08|e}TaRH@6?=$bmqNM&0h;Tm z4Iim4Q?yhr9qb=2Eu^2z4r=42LD5oBrdP4QQSMhr9m9+*`z^#j z2xSND;nR95+Cr2$RqPhZQwqsN>8zvf7LbBT0#RT&=q^kmvzQ zHog!SE8Byj0ea^Z)PfFRk@FocZ>y)d-1cR=!sYY=2bbG#iZV)lCd$rzqMWo&lq=VZ z(og+XlnwhtS+-7;uYVxQHubrXds;;4$Pi^nt0+^|Q$jYjh_W(6lv7(pIl(%guWQ1b zIRfv_6o^nbmTQANv^v7XtoH6|zSzBIq;w4ld1S7TKlV$xAc&W(ZU}ieQ>^ELzgX<<;$U8G)$R!CC>C;Qu8^%~%tE>j33=qPkUyUn)3&~v#pPtT k3BNzE>|8xx<&ry!miOUr`hZ1mhB3g8ge6J#?pU?_Klwn)9{>OV literal 0 HcmV?d00001 diff --git a/filament/backend/test/expected_images/FeedbackLoops.png b/filament/backend/test/expected_images/FeedbackLoops.png new file mode 100644 index 0000000000000000000000000000000000000000..7625833de5776e8753e530cf7e3cdb25191eb929 GIT binary patch literal 982 zcmeAS@N?(olHy`uVBq!ia0y~yV9Wrrw{Wll$(?!IOo0?*age(c!@6@aFM%AEbVpxD z28NCO+Z5Ly2{$4Jv_gk=uXLII)Gs1H|AK!Fv*_!Fo*B9QlU-!H8 z_P4jk-+nWy{9ku=_qG1lX|KQU{(k)S$KreMf1UkrtK)y) zPX2woe}C5Bx5@8g{@<=U_Wb$9fAb^j|9|`Or>DC9+xOg>Kbvdk)XqOw#~1(iN4kA| zdcXbc%Tm*idox5hIxxF%W;AFp@(QRfU|hsv;xMIwtwZPnLm-osf)^o4+1sUG#TaG? z0+k>CwzGwFT^_S2yg!^BEf? zjUfS=3N#C5JW$^!cPDr_pMi!oC{Tc^o@SLnY)2S>%Fr5aJIGfcFF@Ug#WCcoekucv z8=%#o&;-SY3DEt^fq@L7c_GmRiiYV|r5O^=SwcJq^4On=0^m3->S9(nrOnB>2;?o8 zCPdnK+NuSKa!~LiSphWq)K;i9Na-&b7#6_9cM8Aiue^nO7Z@5&h*<{AcnqGdelF{r G5}E+c@=HVj literal 0 HcmV?d00001 diff --git a/filament/backend/test/expected_images/RGB FLOAT to RGB16F.png b/filament/backend/test/expected_images/RGB FLOAT to RGB16F.png new file mode 100644 index 0000000000000000000000000000000000000000..120ae640c6de32c6f55db847be90c68888de2da5 GIT binary patch literal 4208 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 U*WW~Sl!E_qGhfh-WjNRWKR2=i?EnA( literal 0 HcmV?d00001 diff --git a/filament/backend/test/expected_images/RGB FLOAT to RGB32F (subregions and buffer padding).png b/filament/backend/test/expected_images/RGB FLOAT to RGB32F (subregions and buffer padding).png new file mode 100644 index 0000000000000000000000000000000000000000..120ae640c6de32c6f55db847be90c68888de2da5 GIT binary patch literal 4208 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 U*WW~Sl!E_qGhfh-WjNRWKR2=i?EnA( literal 0 HcmV?d00001 diff --git a/filament/backend/test/expected_images/RGB FLOAT to RGB32F (with buffer padding).png b/filament/backend/test/expected_images/RGB FLOAT to RGB32F (with buffer padding).png new file mode 100644 index 0000000000000000000000000000000000000000..120ae640c6de32c6f55db847be90c68888de2da5 GIT binary patch literal 4208 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 U*WW~Sl!E_qGhfh-WjNRWKR2=i?EnA( literal 0 HcmV?d00001 diff --git a/filament/backend/test/expected_images/RGB FLOAT to RGB32F.png b/filament/backend/test/expected_images/RGB FLOAT to RGB32F.png new file mode 100644 index 0000000000000000000000000000000000000000..120ae640c6de32c6f55db847be90c68888de2da5 GIT binary patch literal 4208 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 U*WW~Sl!E_qGhfh-WjNRWKR2=i?EnA( literal 0 HcmV?d00001 diff --git a/filament/backend/test/expected_images/RGB HALF to R11F_G11F_B10F.png b/filament/backend/test/expected_images/RGB HALF to R11F_G11F_B10F.png new file mode 100644 index 0000000000000000000000000000000000000000..120ae640c6de32c6f55db847be90c68888de2da5 GIT binary patch literal 4208 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 U*WW~Sl!E_qGhfh-WjNRWKR2=i?EnA( literal 0 HcmV?d00001 diff --git a/filament/backend/test/expected_images/RGB UINT_10F_11F_11F_REV to R11F_G11F_B10F.png b/filament/backend/test/expected_images/RGB UINT_10F_11F_11F_REV to R11F_G11F_B10F.png new file mode 100644 index 0000000000000000000000000000000000000000..120ae640c6de32c6f55db847be90c68888de2da5 GIT binary patch literal 4208 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 U*WW~Sl!E_qGhfh-WjNRWKR2=i?EnA( literal 0 HcmV?d00001 diff --git a/filament/backend/test/expected_images/RGBA FLOAT to RGBA16F (subregions).png b/filament/backend/test/expected_images/RGBA FLOAT to RGBA16F (subregions).png new file mode 100644 index 0000000000000000000000000000000000000000..120ae640c6de32c6f55db847be90c68888de2da5 GIT binary patch literal 4208 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 U*WW~Sl!E_qGhfh-WjNRWKR2=i?EnA( literal 0 HcmV?d00001 diff --git a/filament/backend/test/expected_images/RGBA FLOAT to RGBA16F (with buffer padding).png b/filament/backend/test/expected_images/RGBA FLOAT to RGBA16F (with buffer padding).png new file mode 100644 index 0000000000000000000000000000000000000000..120ae640c6de32c6f55db847be90c68888de2da5 GIT binary patch literal 4208 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 U*WW~Sl!E_qGhfh-WjNRWKR2=i?EnA( literal 0 HcmV?d00001 diff --git a/filament/backend/test/expected_images/RGBA FLOAT to RGBA16F.png b/filament/backend/test/expected_images/RGBA FLOAT to RGBA16F.png new file mode 100644 index 0000000000000000000000000000000000000000..120ae640c6de32c6f55db847be90c68888de2da5 GIT binary patch literal 4208 zcmYk9dsJ0r`p3U}yMcpLfO$Yu_6Y}Wg z0Lu3N%b771SeXFm8v&uO{|GEg0q#11iF<&^vICz?e-0RQFIP+dQ~81Jjtj33dnPRN zv(nzj&(}moEUem>-HcFo|GlH;T5og@FZeDn`-|=f7_%xme%R9+3d7l?sv6LB^U9UA zE}-?R4}N|eE5kXcsiJR#1^VxO{dJ2KxYQA9a_6K0CTC9a%R@f(%a;!L^>!W@=wClI z1XdLoS)K}EU|!F3Xf$xP%jKHe{=ut{mcZFqGX^ge$*|Ymf-6iy?bO|V<~I15dBxB4 z9+UN-vvM&<{ZildT7myQ30dxND&)Vp1uEviZtv@uPuUA?)rwQm^n zn06mE>G)!^Kh_JTT32^t=GA=_>DPnCZC%m2__2($CG8;+dWe9t|wHfOdwh+dz-LH-asoHLuAiX6?%Wg z2;#M93)Tl!0#Bu?KV1HI$i9jPJwfxX3G-3S0q(c*fuX_rK%r;RUm*5c^lik87X52t zs6`Lqm70}^WK~AtUNqKP;G8LY{z3yof^~^HhppHkbW{Y|Bpk`WfCQ?p!ybo%l>OMF z5f_)dwz}o?f0_#~mapseje*{C0#k0;U<{C*5|8>uF~k*)4c0gDs4OeCSS3{35fLY& zaUTkISm4Q%oi9`Mutoop@f@?m#tVHv0dEV$!Nwi;RlF_0HM;Vl4Y|~uGwhoO_BB7f z<~zFf%<@hV`SKfb?Eyw!7lr_uyB3cso^fh21~bTK^D&s&f0h!BmuF&dJduULjH+D2 z;6!?qjRg$OyB)2pg(p?2w_0IDO7%mT{f%g4EgV>or+_toI_-Zte=j-spQl$nJj&~* zR~KRYZ5!$nC04Vw7IwyMEK=~8em@MuBUZdC9o|SQrq#idOzejzhS&|ylf-s-;)xn~ z1`}K08ArSc&uA6yK*?y=;HZ%G8W;4d+g@EAR^eOa^WDDJuvWs@Mznkp4|}5I7;8ms z4csBb7Py}v-h_J;u>tN>E9%oEBc5)3uV6Rb`pJeO26H4AWfQpg2gwLi;T$dNFH>it zg2|Q8pSEB#ukNqGIK)&g9o}#zsN;B3$>O#5Djr6{8yty4uLon#WTd=fK~w?i6)RG9 z!8w#C4U>!+JSj@nZ_@3bg0YK4rcc3>)H$tSK2f3IJt9rP z9b&nx?_l)%W1~mRtLuIDRPU!f?M-kNB;z1&ns=z=SjmId$hwWjRw;Oedwx~$cVejm zVfu=KcpACQHR3C-5f8aWGzH^hyNtd#v~ITGK^>fpLX^IV8RL1KfN2y*;J~8Gh0T6f`?Xk_gk=>o0<2n3>bq{w624ms$tqY(Al!n z_Cil2c0!LN-hv)ZY=yp^pexU~;O;MBu}yLW$VjuxdY35m8sDmWzV7C$yy5zUBDmM( zqn1ZxsW_VhM-Y((MaeH!F_0lL0>dSvzk(^W-L`G+^$oY$I+r#qUVBRvd-a(BB(T`Utngk7io;M3E2E&3x-?bW_jw|w30bq%~}Mp812 zuZm>*7zyL7QtftNUnS0F1AlhmY$nh_Os2#?^7E&o5`}d@a*XU;$j7YOqAv@EXNHQ) zanLVtu?E;o=V^REtn6ggqVg0Yn$P$Fi~gG^_qDdpu?>qm`%a0sJng28Dc5cIm6Ktl z6-$YUR$LE;Gg!qLzVT0KsE&osMvI~o7pzj*Bne5mit!PrTap!5_;`M+p-3!-OD%M5 zMwryXx%e$XUuIaPmNzL8_grU!PLwnyF6unpyG9h;N8<-?+E5n`N2!W5+PSacQ~?n0 zLOC~|50lE?1@dTh8zrmc-A9R&@&F}*pLluUQW=e&50|{WYYWm9gLSVDwc>F&KjSn! z;;3l1N?}W`MvwUJ>%Mmz*F5y~bg<3NUI;+zu6(3Y@3MxIjMb+h)ds}Kt+f4Ms#4EK z(Yw{+jFjOCvKj*w7{gWlF40fb&lBOQ{yq_+>QzLrs+SVEs-8zYp<$+l{a%TY&;IR~ z^scs_-)I+UKf<)@ZxjJ(H*Ah#nXPWIkCM=mqtw0y{OC|>w-TCC%jx$c|G0^mqSUSf z8g+|v8C_9TeP=NAkV?$rmr!zoT*!@44y8U?LW;}cGPC zVdv>J50Cqp_q5wGQY!N?mZwx|I8HauX&6fcxR4bNYzdR9aZ@FZ@dGv@QEud7jzekLPh==9yudk{(z1ofQd&M|lh0t2x6`<9g-HDJ zTQX{Q9#XRRY z7xSFsT+DNhb8wz>oP+b+p?$$mmuV9puKJ$c*3k45TfKH~2#iBTvX4I-#wW-=+GEH2 z7;TvJ1dGp(Z)E}4@y-#l=y-jS#q9XI%nLidlwil-r7AnVlwil-;Ax%?^wj6Yby0q3NTf3yg;c~wU3bCh*a(L-SLcS zA4JSn?R+a8D^%wis^q)$kAhk7Sot!&ZrouhWYC`1RVN=jJw`L;@U+ie`ZD^v*(SaA z?4qrMCYG#i{$6ChySa_2pVJ7WY|1zIqe7pr8P5^#X~r<(j%Jh-@h<%zJmo@|be*T{ zQspy@B`I4eVo%n`S<6OCF#f3-%czqdE?p6e13C_BBEZmwJR0F0Exj*!GWd>0zkV`#e3Ir5R1)r90pD-{#X7B~x>LPreQ~=cZ;0 zymm56U{$Js-a1C66OTUrUxj8L6z{e$KJVuPt#+n)+g%gu&YP%w-^8XW6B|oS9LzHj zI#c!VrF*NS>GlFqc;=qJ7}lR)@Sc8cV1H12G)kfL9yh6D_sw?*Kcc~z$L zN~I~i;u44~oFq0B&ATalD*NlqSO;KyIm_JG??{9=Ch)~4h0cHv^AyqYTiNpeZGSwY zPx-7%M6c%-oAFi_XA0?Du_h2uy-k?f5;atu7V*?baavNbCX!Lua!JJIoIcy!xarSB zOq~^(Vll_P!o=T7OdOo8h>!MPx_Wl7>3H{hhxg2FG6Dcw>8GZ~`|;xFINy9zy0=}# zG|f0EEVx}OR0rUQDG?Dm{#as4=^vPw-fZIK8WT%;1dPB6)1|4aYlQbt{8pu}h5JPK U*WW~Sl!E_qGhfh-WjNRWKR2=i?EnA( literal 0 HcmV?d00001 diff --git a/filament/backend/test/expected_images/RGBA UBYTE to RGBA8 (subregions and buffer padding).png b/filament/backend/test/expected_images/RGBA UBYTE to RGBA8 (subregions and buffer padding).png new file mode 100644 index 0000000000000000000000000000000000000000..120ae640c6de32c6f55db847be90c68888de2da5 GIT binary patch literal 4208 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 U*WW~Sl!E_qGhfh-WjNRWKR2=i?EnA( literal 0 HcmV?d00001 diff --git a/filament/backend/test/expected_images/RGBA UBYTE to RGBA8 (subregions).png b/filament/backend/test/expected_images/RGBA UBYTE to RGBA8 (subregions).png new file mode 100644 index 0000000000000000000000000000000000000000..120ae640c6de32c6f55db847be90c68888de2da5 GIT binary patch literal 4208 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 U*WW~Sl!E_qGhfh-WjNRWKR2=i?EnA( literal 0 HcmV?d00001 diff --git a/filament/backend/test/expected_images/RGBA UBYTE to RGBA8 (with buffer padding).png b/filament/backend/test/expected_images/RGBA UBYTE to RGBA8 (with buffer padding).png new file mode 100644 index 0000000000000000000000000000000000000000..120ae640c6de32c6f55db847be90c68888de2da5 GIT binary patch literal 4208 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 U*WW~Sl!E_qGhfh-WjNRWKR2=i?EnA( literal 0 HcmV?d00001 diff --git a/filament/backend/test/expected_images/RGBA UBYTE to RGBA8.png b/filament/backend/test/expected_images/RGBA UBYTE to RGBA8.png new file mode 100644 index 0000000000000000000000000000000000000000..120ae640c6de32c6f55db847be90c68888de2da5 GIT binary patch literal 4208 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 U*WW~Sl!E_qGhfh-WjNRWKR2=i?EnA( literal 0 HcmV?d00001 diff --git a/filament/backend/test/expected_images/RGBA UINT_2_10_10_10_REV to RGB10_A2.png b/filament/backend/test/expected_images/RGBA UINT_2_10_10_10_REV to RGB10_A2.png new file mode 100644 index 0000000000000000000000000000000000000000..120ae640c6de32c6f55db847be90c68888de2da5 GIT binary patch literal 4208 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 U*WW~Sl!E_qGhfh-WjNRWKR2=i?EnA( literal 0 HcmV?d00001 diff --git a/filament/backend/test/expected_images/RGB_INTEGER INT to RGB32I.png b/filament/backend/test/expected_images/RGB_INTEGER INT to RGB32I.png new file mode 100644 index 0000000000000000000000000000000000000000..120ae640c6de32c6f55db847be90c68888de2da5 GIT binary patch literal 4208 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 U*WW~Sl!E_qGhfh-WjNRWKR2=i?EnA( literal 0 HcmV?d00001 diff --git a/filament/backend/test/expected_images/RGB_INTEGER UBYTE to RGB8UI.png b/filament/backend/test/expected_images/RGB_INTEGER UBYTE to RGB8UI.png new file mode 100644 index 0000000000000000000000000000000000000000..120ae640c6de32c6f55db847be90c68888de2da5 GIT binary patch literal 4208 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 U*WW~Sl!E_qGhfh-WjNRWKR2=i?EnA( literal 0 HcmV?d00001 diff --git a/filament/backend/test/expected_images/RGB_INTEGER USHORT to RGB16UI.png b/filament/backend/test/expected_images/RGB_INTEGER USHORT to RGB16UI.png new file mode 100644 index 0000000000000000000000000000000000000000..120ae640c6de32c6f55db847be90c68888de2da5 GIT binary patch literal 4208 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 U*WW~Sl!E_qGhfh-WjNRWKR2=i?EnA( literal 0 HcmV?d00001 diff --git a/filament/backend/test/expected_images/RenderExternalImage.png b/filament/backend/test/expected_images/RenderExternalImage.png new file mode 100644 index 0000000000000000000000000000000000000000..6e2f19df6ab65654681771a4fe0e79cc3480255e GIT binary patch literal 4047 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 CGG?Lx literal 0 HcmV?d00001 diff --git a/filament/backend/test/expected_images/ScissorViewportEdgeCases.png b/filament/backend/test/expected_images/ScissorViewportEdgeCases.png new file mode 100644 index 0000000000000000000000000000000000000000..f81906d36d87f151a894b7d84f82148ead09a873 GIT binary patch literal 3362 zcmeH~{a00G7RSHm;TY#42$!3JCdlhW%?PJS2@NkS1TF|FWzy2{wq`^p-&iS0ntIAq zKoS$Vb15@sS@ePuN-CAhPCCx4Npk5VhBK14HOrRHh{Gfy%h8lmLQ%3K$Pi2CB~Arf926^0Lu(X6!XC^d(tES-`>i z;dh=N#&z6p@=J<4|bRe|Zos;!+)t2du+q8I04V5O}Zk8!RMrIJhWKq@s1Tr4^>Ld?AW06V-^1T$EEwB0~2NT?&l?)7!)Y| zn%1yDif3Ch0?hTnZ5hD^-MY-W73tQr1el|QKZq$llq-O#NlvS|)nj?i$u0C)I+ zv?pr)AY7?in*-2}*#Vf1>2AUxt->_msTBS=+I+2B!)enRiAN(f?9a!ZfP*nw1p}}O zbgL!+Baq@CbYUT3+BB`gPS~YeTL?QM5k=UQk5E30zBdrf4ALB0+D=|FN_f&}8me1i zG+pb!RAza}jZ67DDx$QC#|UF|ODEiCGu?dZawFlOOTJshFa*8-z`|l})(Bj_q`?hma@xCu;5E2_M$26NGs-^HdG6BLWYx zBGU`8JexM5T6-X&eY#ann|eZ);!X~h7ZAp1?UM=T>(-Bi@7ghpGR|g3^0&C9y8;JS ziRL;3tY#yTXx?q$suQ&}Fv~>q9xjr=%eLrn=fL%lX3e04Yu2V}m?MNagL2n~%w&N< zCx&(z==nYT3liX&EzEIra@RmCU+=*LRQU+E!9Rg8T$mpa{%petX1mORu}*;t$*AJ1 zRN4UlV%j_@%%|x6uz_OM@FlE2KDFuCJ#m-j%BO{#3>5QWammRSg`@lWO4D{s-B?eP8v< z_I#<&tMu9trB^N}{b5jQ-4r!A}fk#erFx2Ws7TS8?RjVy7V7{i=Rc_{_QIWF`xVTgUgGhg_F*-v9^W^e!|A~uPz237n#d!mHj9e{=z z#QxgqKrmbQGftGzL1`nZ-lWY;;n!)?ZI}&o@Js@V>7aBA(whi}3BMq`XfwAHmOGJ3 z=xanL`>7{acmlK1a@~rfO_O21%1b&Tu$h;X$6+Ne>3kcV%+g;h{JFIG!Z6<^yb%W{ zVRR8@Wpm=$1z$DYJ*cIPraMD;vT4eixoOSc!eSqmTM0e^__XoMX$b0*_ClY~)h zSn1nQ$|=GhDm+<)^9gyfEFPnHGQ9wkiaF}Mjvmf#{%3{9L7OFp`34=tCSwX)coiXM zE`N&fJVp3#LOM8}fGOV2ARtn{VK;6x8zIMh6x%*&2MvdPLy;9Jr3&(|X0L W?>zWYS1SLBfqQ0gPFuF;wf_NVb1fkN literal 0 HcmV?d00001 diff --git a/filament/backend/test/expected_images/StencilBuffer.png b/filament/backend/test/expected_images/StencilBuffer.png new file mode 100644 index 0000000000000000000000000000000000000000..1e663aa397ce118b94cfe68a040d6721fccb363e GIT binary patch literal 3140 zcmeH}Yfn^17=Yg$*LD^}ShTt|h;U#RDi*ie;-W+WR{>E}G=^Gg4=PYlz@!C{OC1nW z7P%@KkV`R5@YYamtfDoB+KW+IYO1yCCFayBSrL&~FI(k9-ZShdIxA=FA*m zz_BVR&dXz(2LN~_#M_er2!2U`zJ_>OcCN&`2EZUkZ%PTQ~~BU15Dl4c6N0Xfaiq-d(7Ixwnxs$0`t7d_V2g) zKib*Xbg;{QB69TLQS0W4@x4X<;Ui%?O1)s!{hywBL+J+Jod8z`?&ky&=)BnXs+Izq zID3Y-9bo8jJ;ZYkUzHr{lN`Jy>AEO6&?R|qK=N+4q&6)0)$l>dp}!;tk4U;6NDeee z-a9UN_ll%8BKXU2ljP7z$-!%quBVa%dnE6DBYF3CN$rVXO++yG8Ucd5Jege&y`hW8 z1sHW;y&$Jg&8Zf*rDh$FOg}1_c2=-0=dxthP092@$+VY(emM@wtQN_1xjnzMGh!UI z<&xy48_+ff_;7314mc1vz*mCQaSx$!%}(arL;mt@MPSBV9AaZWGcVSOJ(R_WJ2DFTV9F$L4bveMqjnRNtGY0J9KnI$reDjg(R7ECY81 z1$8^oJkhlqSY8!Cff+svAmD6-9=u1LN3^9}QnrB0Ko|~2Sq6m+Wj@hjQ0_CZ5R~i8 z(19|g5o}z(N3;MgDI4cN83+?CD9gacr!62FE}69$*d&x0W=KNWjL+m{1kn^ODf8qq z5W=}E15>mftOvk^+q3QgQ#_&?Ov@4F(2Sv$O;leD!wk%U>*-d&5=5W}Wdq8sL`_CH z7bVWxk1~XSZ5O2Q@?)YJQ3e@UC6;vxOu^Dt4k^5RpQx)*W>Qv(rN0@bU|CoJPF`*x z>LirKl+|LHYlaB^%t~};9Lk)V|a(MIe4cX z*81vzGF)kAD}>^{iwppv!2q2NcpAjwiQ+MKVeEa3{Wy&MHvEsnU}vpAJF(%TxRp@z z${@UDWvn zfVM_a^9Zon4pxc>(0Ma?j)#)Fkvi*9S`>9Q%2t#VU|1o~vFvH3DZC6+)EtzbJ6JxJ z9SXUQW#Ivu!b=}TeH-NuRV*LNiDq&gOIsUl=H+BX#g($FRcr^ANoF#DrLCPd^U_yQ z!%_C3#4;Que`Xsstpu=EP*WnJhMM9KP1Lj)(MEeZ08|e}TaRH@6?=$bmqNM&0h;Tm z4Iim4Q?yhr9qb=2Eu^2z4r=42LD5oBrdP4QQSMhr9m9+*`z^#j z2xSND;nR95+Cr2$RqPhZQwqsN>8zvf7LbBT0#RT&=q^kmvzQ zHog!SE8Byj0ea^Z)PfFRk@FocZ>y)d-1cR=!sYY=2bbG#iZV)lCd$rzqMWo&lq=VZ z(og+XlnwhtS+-7;uYVxQHubrXds;;4$Pi^nt0+^|Q$jYjh_W(6lv7(pIl(%guWQ1b zIRfv_6o^nbmTQANv^v7XtoH6|zSzBIq;w4ld1S7TKlV$xAc&W(ZU}ieQ>^ELzgX<<;$U8G)$R!CC>C;Qu8^%~%tE>j33=qPkUyUn)3&~v#pPtT k3BNzE>|8xx<&ry!miOUr`hZ1mhB3g8ge6J#?pU?_Klwn)9{>OV literal 0 HcmV?d00001 diff --git a/filament/backend/test/expected_images/StencilBufferAutoResolve.png b/filament/backend/test/expected_images/StencilBufferAutoResolve.png new file mode 100644 index 0000000000000000000000000000000000000000..f5618225a1e5c4efcea4ff65404ad187c2bee369 GIT binary patch literal 3838 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 literal 0 HcmV?d00001 diff --git a/filament/backend/test/expected_images/UpdateImage3D.png b/filament/backend/test/expected_images/UpdateImage3D.png new file mode 100644 index 0000000000000000000000000000000000000000..120ae640c6de32c6f55db847be90c68888de2da5 GIT binary patch literal 4208 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 U*WW~Sl!E_qGhfh-WjNRWKR2=i?EnA( literal 0 HcmV?d00001 diff --git a/filament/backend/test/expected_images/UpdateImageMipLevel.png b/filament/backend/test/expected_images/UpdateImageMipLevel.png new file mode 100644 index 0000000000000000000000000000000000000000..120ae640c6de32c6f55db847be90c68888de2da5 GIT binary patch literal 4208 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 U*WW~Sl!E_qGhfh-WjNRWKR2=i?EnA( literal 0 HcmV?d00001 diff --git a/filament/backend/test/expected_images/UpdateImageSRGB.png b/filament/backend/test/expected_images/UpdateImageSRGB.png new file mode 100644 index 0000000000000000000000000000000000000000..6aff04d1a485091db73f4ee8d0f2e21370aa9bd3 GIT binary patch literal 4774 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 B)rbH9 literal 0 HcmV?d00001 diff --git a/filament/backend/test/expected_images/scissor.png b/filament/backend/test/expected_images/scissor.png new file mode 100644 index 0000000000000000000000000000000000000000..e21b97b89dbce36d9f856a6a9d1e45270864cc19 GIT binary patch literal 2879 zcmeI!|8Em@9LMq3=feSaKUDU8f6wIERTzxoAOUk+SwfO}Fvej@#0Lluzsanugq*O>mTFS0HWF^7LL zV#i;{XY^Prb;mlks$t2GTb|#1GPC)+?%v)psJ(vif`EHn<46P0y?|N5akW6`WzMh! z5azjV8`@#$cNn@J{>%HK^Z22OiNn3UPyT-VXnfNo6`Z7AT0X(TorV%g;B*ipiX*kRnc&PJ&phD}&{=Ac8FW+L2=EOqb3K;!GmTjsSuz z8(%~!S2jpz9WkP-;Vdr)FpgzU6JoiU_es@#Jw1Ng~Cs2w3K_c-ca?Gw05sbUGDTIkuUBgL|axJIfb z;&TQ%i04bt_$sjtPCjv(R6it%I-ccW&s*qwO-BJsllYWWpAy#^7)$)D1eIwbXWmLI zlj`dn>Zs45g-Vt^9msn9$S#xWB=Mq-X~eD~^subl2S+EyrCLF}s^dkT(CH!+v=Teu z)DmMvp6xkeP@NvpiS`kt#8(Gd}c{h>e=LQb2oLGz$%N~{n zv0AFfSe`Mkhvk}L#8?iz0w+q`L}Yo0$g;W=F_r`Eu)-RSmg0md@Q)As*>5$l&W1wn ze_StBnFqTKd}U){04IDRv=gdM!%T_4i>2}kJe@>m4cw7_Og3@F@ZexQ+or7(JnSW63BPBlfRE)v z8s@XyL@e^4Y98GEHm-~&vV4=svdu(>Gy92t9`+W2Q7qrnP{#5IkuwKvxNoqWKxDa; z$a0?trX^LI20MxDQ~}-+1G5oo(a~Lp&@LU6W~}nT49d=V2&Hw!uawNK58Uq6emuc@ zd9SX<3LGt#om{AFHASXcVDntf{hk)^;39WDV&h;GnB^6ji30t$<}TBas34kfmlIiT z@QLzS0#(F*mV63aWx3eKDV7U}lLRi+Xl`6X<~AbBE+Wg1h@4qS?BihzJUGYlbsH@# zn~0p5CdP>4i7ekCvV6-Y5;Fzj#KZsh!e;uJYd1Fj$p>b> srcLevel, kSrcTexHeight >> srcLevel }, SamplerMagFilter::LINEAR); - { - ImageExpectations expectations(api); - - EXPECT_IMAGE(dstRenderTargets[0], expectations, - ScreenshotParams(kDstTexWidth, kDstTexHeight, "ColorMinify", 0xf3d9c53f)); - - flushAndWait(); - } + EXPECT_IMAGE(dstRenderTargets[0], getExpectations(), + ScreenshotParams(kDstTexWidth, kDstTexHeight, "ColorMinify", 0xf3d9c53f)); } TEST_F(BlitTest, ColorResolve) { @@ -351,14 +339,8 @@ TEST_F(BlitTest, ColorResolve) { srcRenderTarget, { 0, 0, kSrcTexWidth, kSrcTexHeight }, SamplerMagFilter::NEAREST); - { - ImageExpectations expectations(api); - - EXPECT_IMAGE(dstRenderTarget, expectations, - ScreenshotParams(kDstTexWidth, kDstTexHeight, "ColorResolve", 0xebfac2ef)); - - flushAndWait(); - } + EXPECT_IMAGE(dstRenderTarget, getExpectations(), + ScreenshotParams(kDstTexWidth, kDstTexHeight, "ColorResolve", 0xebfac2ef)); } TEST_F(BlitTest, Blit2DTextureArray) { @@ -423,17 +405,11 @@ TEST_F(BlitTest, Blit2DTextureArray) { } { - ImageExpectations expectations(api); - - { - RenderFrame frame(api); - EXPECT_IMAGE(dstRenderTarget, expectations, - ScreenshotParams(kDstTexWidth, kDstTexHeight, "Blit2DTextureArray", - 0x8de7d55b)); - api.commit(swapChain); - } - - flushAndWait(); + RenderFrame frame(api); + EXPECT_IMAGE(dstRenderTarget, getExpectations(), + ScreenshotParams(kDstTexWidth, kDstTexHeight, "Blit2DTextureArray", + 0x8de7d55b)); + api.commit(swapChain); } } @@ -503,18 +479,12 @@ TEST_F(BlitTest, BlitRegion) { } { - ImageExpectations expectations(api); - - { - RenderFrame frame(api); - // TODO: for some reason, this test has very, very slight (as in one pixel) differences - // between OpenGL and Metal. So disable golden checking for now. - // EXPECT_IMAGE(dstRenderTarget, expectations, ScreenshotParams(kDstTexWidth, - // kDstTexHeight, "BlitRegion", 0x74fa34ed)); - api.commit(swapChain); - } - - flushAndWait(); + RenderFrame frame(api); + // TODO: for some reason, this test has very, very slight (as in one pixel) differences + // between OpenGL and Metal. So disable golden checking for now. + // EXPECT_IMAGE(dstRenderTarget, expectations, ScreenshotParams(kDstTexWidth, + // kDstTexHeight, "BlitRegion", 0x74fa34ed)); + api.commit(swapChain); } } @@ -567,25 +537,19 @@ TEST_F(BlitTest, BlitRegionToSwapChain) { }; { - ImageExpectations expectations(api); - { - { - RenderFrame frame(api); + RenderFrame frame(api); - api.blitDEPRECATED(TargetBufferFlags::COLOR0, dstRenderTarget, - dstRect, srcRenderTargets[srcLevel], - srcRect, SamplerMagFilter::LINEAR); + api.blitDEPRECATED(TargetBufferFlags::COLOR0, dstRenderTarget, + dstRect, srcRenderTargets[srcLevel], + srcRect, SamplerMagFilter::LINEAR); - api.commit(swapChain); - } - - // TODO: for some reason, this test has been disabled. It needs to be tested on all - // machines. - // EXPECT_IMAGE(dstRenderTarget, expectations, - // ScreenshotParams(kDstTexWidth, kDstTexHeight, "BlitRegionToSwapChain", 0x0)); - } - flushAndWait(); + api.commit(swapChain); } + + // TODO: for some reason, this test has been disabled. It needs to be tested on all + // machines. + // EXPECT_IMAGE(dstRenderTarget, expectations, + // ScreenshotParams(kDstTexWidth, kDstTexHeight, "BlitRegionToSwapChain", 0x0)); } } // namespace test diff --git a/filament/backend/test/test_BufferUpdates.cpp b/filament/backend/test/test_BufferUpdates.cpp index 908ab45d7c..3c661e3bb5 100644 --- a/filament/backend/test/test_BufferUpdates.cpp +++ b/filament/backend/test/test_BufferUpdates.cpp @@ -16,6 +16,7 @@ #include "BackendTest.h" +#include "ImageExpectations.h" #include "Lifetimes.h" #include "Shader.h" #include "SharedShaders.h" @@ -220,9 +221,9 @@ TEST_F(BufferUpdatesTest, BufferObjectUpdateWithOffset) { renderTriangle({{ DescriptorSetLayoutHandle{}, shader.getDescriptorSetLayout() }}, renderTarget, swapChain, shader.getProgram(), params); - static const uint32_t expectedHash = 91322442; - readPixelsAndAssertHash( - "BufferObjectUpdateWithOffset", 512, 512, renderTarget, expectedHash, true); + + EXPECT_IMAGE(renderTarget, getExpectations(), + ScreenshotParams(512, 512, "BufferObjectUpdateWithOffset", 91322442)); api.flush(); api.commit(swapChain); diff --git a/filament/backend/test/test_FeedbackLoops.cpp b/filament/backend/test/test_FeedbackLoops.cpp index 2b137264df..5b7b2579d0 100644 --- a/filament/backend/test/test_FeedbackLoops.cpp +++ b/filament/backend/test/test_FeedbackLoops.cpp @@ -71,8 +71,6 @@ void main() { fragColor = textureLod(test_tex, uv, params.sourceLevel); })"; -static uint32_t sPixelHashResult = 0; - // Selecting a NPOT texture size seems to exacerbate the bug seen with Intel GPU's. // Note that Filament uses a higher precision format (R11F_G11F_B10F) but this does not seem // necessary to trigger the bug. @@ -96,25 +94,6 @@ struct MaterialParams { float unused; }; -static void dumpScreenshot(DriverApi& dapi, Handle rt) { - const size_t size = kTexWidth * kTexHeight * 4; - void* buffer = calloc(1, size); - auto cb = [](void* buffer, size_t size, void* user) { - int w = kTexWidth, h = kTexHeight; - const uint32_t* texels = (uint32_t*) buffer; - sPixelHashResult = utils::hash::murmur3(texels, size / 4, 0); -#ifndef FILAMENT_IOS - LinearImage image(w, h, 4); - image = toLinearWithAlpha(w, h, w * 4, (uint8_t*) buffer); - std::ofstream pngstrm("feedback.png", std::ios::binary | std::ios::trunc); - ImageEncoder::encode(pngstrm, ImageEncoder::Format::PNG, image, "", "feedback.png"); -#endif - free(buffer); - }; - PixelBufferDescriptor pb(buffer, size, PixelDataFormat::RGBA, PixelDataType::UBYTE, cb); - dapi.readPixels(rt, 0, 0, kTexWidth, kTexHeight, std::move(pb)); -} - // TODO: This test needs work to get Metal and OpenGL to agree on results. // The problems are caused by both uploading and rendering into the same texture, since the OpenGL // backend's readPixels does not work correctly with textures that have image data uploaded. @@ -259,7 +238,8 @@ TEST_F(BackendTest, FeedbackLoops) { // NOTE: Calling glReadPixels on any miplevel other than the base level // seems to be un-reliable on some GPU's. if (frame == kNumFrames - 1) { - dumpScreenshot(api, renderTargets[0]); + EXPECT_IMAGE(renderTargets[0], getExpectations(), + ScreenshotParams(kTexWidth, kTexHeight, "FeedbackLoops", 0x70695aa1)); } api.flush(); @@ -270,10 +250,6 @@ TEST_F(BackendTest, FeedbackLoops) { getDriver().purge(); } } - - const uint32_t expected = 0x70695aa1; - printf("Computed hash is 0x%8.8x, Expected 0x%8.8x\n", sPixelHashResult, expected); - EXPECT_TRUE(sPixelHashResult == expected); } } // namespace test diff --git a/filament/backend/test/test_LoadImage.cpp b/filament/backend/test/test_LoadImage.cpp index 47d434ed4e..592431993a 100644 --- a/filament/backend/test/test_LoadImage.cpp +++ b/filament/backend/test/test_LoadImage.cpp @@ -246,42 +246,42 @@ TEST_F(LoadImageTest, UpdateImage2D) { std::vector testCases; // Test basic upload. - testCases.emplace_back("RGBA, UBYTE -> RGBA8", PixelDataFormat::RGBA, PixelDataType::UBYTE, TextureFormat::RGBA8); + testCases.emplace_back("RGBA UBYTE to RGBA8", PixelDataFormat::RGBA, PixelDataType::UBYTE, TextureFormat::RGBA8); // Test format conversion. // TODO: Vulkan crashes with `Texture at colorAttachment[0] has usage (0x01) which doesn't specify MTLTextureUsageRenderTarget (0x04)' - testCases.emplace_back("RGBA, FLOAT -> RGBA16F", PixelDataFormat::RGBA, PixelDataType::FLOAT, TextureFormat::RGBA16F); + testCases.emplace_back("RGBA FLOAT to RGBA16F", PixelDataFormat::RGBA, PixelDataType::FLOAT, TextureFormat::RGBA16F); // Test texture formats not all backends support natively. // TODO: Vulkan crashes with "VK_FORMAT_R32G32B32_SFLOAT is not supported" - testCases.emplace_back("RGB, FLOAT -> RGB32F", PixelDataFormat::RGB, PixelDataType::FLOAT, TextureFormat::RGB32F); - testCases.emplace_back("RGB, FLOAT -> RGB16F", PixelDataFormat::RGB, PixelDataType::FLOAT, TextureFormat::RGB16F); + testCases.emplace_back("RGB FLOAT to RGB32F", PixelDataFormat::RGB, PixelDataType::FLOAT, TextureFormat::RGB32F); + testCases.emplace_back("RGB FLOAT to RGB16F", PixelDataFormat::RGB, PixelDataType::FLOAT, TextureFormat::RGB16F); // Test packed format uploads. // TODO: Vulkan crashes with "Texture at colorAttachment[0] has usage (0x01) which doesn't specify MTLTextureUsageRenderTarget (0x04)" - testCases.emplace_back("RGBA, UINT_2_10_10_10_REV -> RGB10_A2", PixelDataFormat::RGBA, PixelDataType::UINT_2_10_10_10_REV, TextureFormat::RGB10_A2); - testCases.emplace_back("RGB, UINT_10F_11F_11F_REV -> R11F_G11F_B10F", PixelDataFormat::RGB, PixelDataType::UINT_10F_11F_11F_REV, TextureFormat::R11F_G11F_B10F); - testCases.emplace_back("RGB, HALF -> R11F_G11F_B10F", PixelDataFormat::RGB, PixelDataType::HALF, TextureFormat::R11F_G11F_B10F); + testCases.emplace_back("RGBA UINT_2_10_10_10_REV to RGB10_A2", PixelDataFormat::RGBA, PixelDataType::UINT_2_10_10_10_REV, TextureFormat::RGB10_A2); + testCases.emplace_back("RGB UINT_10F_11F_11F_REV to R11F_G11F_B10F", PixelDataFormat::RGB, PixelDataType::UINT_10F_11F_11F_REV, TextureFormat::R11F_G11F_B10F); + testCases.emplace_back("RGB HALF to R11F_G11F_B10F", PixelDataFormat::RGB, PixelDataType::HALF, TextureFormat::R11F_G11F_B10F); // Test integer format uploads. // TODO: These cases fail on OpenGL and Vulkan. // TODO: These cases now also fail on Metal, but at some point previously worked. - testCases.emplace_back("RGB_INTEGER, UBYTE -> RGB8UI", PixelDataFormat::RGB_INTEGER, PixelDataType::UBYTE, TextureFormat::RGB8UI); - testCases.emplace_back("RGB_INTEGER, USHORT -> RGB16UI", PixelDataFormat::RGB_INTEGER, PixelDataType::USHORT, TextureFormat::RGB16UI); - testCases.emplace_back("RGB_INTEGER, INT -> RGB32I", PixelDataFormat::RGB_INTEGER, PixelDataType::INT, TextureFormat::RGB32I); + testCases.emplace_back("RGB_INTEGER UBYTE to RGB8UI", PixelDataFormat::RGB_INTEGER, PixelDataType::UBYTE, TextureFormat::RGB8UI); + testCases.emplace_back("RGB_INTEGER USHORT to RGB16UI", PixelDataFormat::RGB_INTEGER, PixelDataType::USHORT, TextureFormat::RGB16UI); + testCases.emplace_back("RGB_INTEGER INT to RGB32I", PixelDataFormat::RGB_INTEGER, PixelDataType::INT, TextureFormat::RGB32I); // Test uploads with buffer padding. // TODO: Vulkan crashes with "Assertion failed: (offset + size <= allocationSize)" - testCases.emplace_back("RGBA, UBYTE -> RGBA8 (with buffer padding)", PixelDataFormat::RGBA, PixelDataType::UBYTE, TextureFormat::RGBA8, 64u); - testCases.emplace_back("RGBA, FLOAT -> RGBA16F (with buffer padding)", PixelDataFormat::RGBA, PixelDataType::FLOAT, TextureFormat::RGBA16F, 64u); - testCases.emplace_back("RGB, FLOAT -> RGB32F (with buffer padding)", PixelDataFormat::RGB, PixelDataType::FLOAT, TextureFormat::RGB32F, 64u); + testCases.emplace_back("RGBA UBYTE to RGBA8 (with buffer padding)", PixelDataFormat::RGBA, PixelDataType::UBYTE, TextureFormat::RGBA8, 64u); + testCases.emplace_back("RGBA FLOAT to RGBA16F (with buffer padding)", PixelDataFormat::RGBA, PixelDataType::FLOAT, TextureFormat::RGBA16F, 64u); + testCases.emplace_back("RGB FLOAT to RGB32F (with buffer padding)", PixelDataFormat::RGB, PixelDataType::FLOAT, TextureFormat::RGB32F, 64u); // Upload subregions separately. // TODO: Vulkan crashes with "Offsets not yet supported" - testCases.emplace_back("RGBA, UBYTE -> RGBA8 (subregions)", PixelDataFormat::RGBA, PixelDataType::UBYTE, TextureFormat::RGBA8, 0u, true); - testCases.emplace_back("RGBA, FLOAT -> RGBA16F (subregions)", PixelDataFormat::RGBA, PixelDataType::FLOAT, TextureFormat::RGBA16F, 0u, true); - testCases.emplace_back("RGBA, UBYTE -> RGBA8 (subregions, buffer padding)", PixelDataFormat::RGBA, PixelDataType::UBYTE, TextureFormat::RGBA8, 64u, true); - testCases.emplace_back("RGB, FLOAT -> RGB32F (subregions, buffer padding)", PixelDataFormat::RGB, PixelDataType::FLOAT, TextureFormat::RGB32F, 64u, true); + testCases.emplace_back("RGBA UBYTE to RGBA8 (subregions)", PixelDataFormat::RGBA, PixelDataType::UBYTE, TextureFormat::RGBA8, 0u, true); + testCases.emplace_back("RGBA FLOAT to RGBA16F (subregions)", PixelDataFormat::RGBA, PixelDataType::FLOAT, TextureFormat::RGBA16F, 0u, true); + testCases.emplace_back("RGBA UBYTE to RGBA8 (subregions and buffer padding)", PixelDataFormat::RGBA, PixelDataType::UBYTE, TextureFormat::RGBA8, 64u, true); + testCases.emplace_back("RGB FLOAT to RGB32F (subregions and buffer padding)", PixelDataFormat::RGB, PixelDataType::FLOAT, TextureFormat::RGB32F, 64u, true); auto& api = getDriverApi(); @@ -339,16 +339,14 @@ TEST_F(LoadImageTest, UpdateImage2D) { renderTriangle({{ DescriptorSetLayoutHandle{}, shader.getDescriptorSetLayout() }}, defaultRenderTarget, swapChain, shader.getProgram()); - readPixelsAndAssertHash(t.name, 512, 512, defaultRenderTarget, expectedHash); + EXPECT_IMAGE(defaultRenderTarget, getExpectations(), + ScreenshotParams(512, 512, t.name, expectedHash)); api.commit(swapChain); api.endFrame(0); } - api.finish(); api.stopCapture(); - - flushAndWait(); } TEST_F(LoadImageTest, UpdateImageSRGB) { @@ -372,7 +370,7 @@ TEST_F(LoadImageTest, UpdateImageSRGB) { getSamplerTypeName(textureFormat), fragmentTemplate); Shader shader(api, cleanup, ShaderConfig{ .vertexShader = mVertexShader, .fragmentShader = fragment, .uniforms = {{ - "text_tex", DescriptorType::SAMPLER, samplerInfo + "test_tex", DescriptorType::SAMPLER, samplerInfo }}}); // Create a texture. @@ -416,15 +414,12 @@ TEST_F(LoadImageTest, UpdateImageSRGB) { renderTriangle({{ DescriptorSetLayoutHandle{}, shader.getDescriptorSetLayout() }}, defaultRenderTarget, swapChain, shader.getProgram()); - static const uint32_t expectedHash = 359858623; - readPixelsAndAssertHash("UpdateImageSRGB", 512, 512, defaultRenderTarget, expectedHash); + EXPECT_IMAGE(defaultRenderTarget, getExpectations(), + ScreenshotParams(512, 512, "UpdateImageSRGB", 359858623)); - api.flush(); api.commit(swapChain); api.endFrame(0); - // This ensures all driver commands have finished before exiting the test. - api.finish(); api.stopCapture(); } @@ -478,15 +473,12 @@ TEST_F(LoadImageTest, UpdateImageMipLevel) { renderTriangle({{ DescriptorSetLayoutHandle{}, shader.getDescriptorSetLayout() }}, defaultRenderTarget, swapChain, shader.getProgram()); - static const uint32_t expectedHash = 3644679986; - readPixelsAndAssertHash("UpdateImageMipLevel", 512, 512, defaultRenderTarget, expectedHash); + EXPECT_IMAGE(defaultRenderTarget, getExpectations(), + ScreenshotParams(512, 512, "UpdateImageMipLevel", 3644679986)); - api.flush(); api.commit(swapChain); api.endFrame(0); - // This ensures all driver commands have finished before exiting the test. - api.finish(); api.stopCapture(); } @@ -538,29 +530,24 @@ TEST_F(LoadImageTest, UpdateImage3D) { api.update3DImage(texture, 0, 0, 0, 0, 512, 512, 4, std::move(descriptor)); - api.beginFrame(0, 0, 0); + { + RenderFrame frame(api); - // Update samplers. - DescriptorSetHandle descriptorSet = shader.createDescriptorSet(api); - api.updateDescriptorSetTexture(descriptorSet, 0, texture, { - .filterMag = SamplerMagFilter::LINEAR, - .filterMin = SamplerMinFilter::LINEAR_MIPMAP_NEAREST - }); + // Update samplers. + DescriptorSetHandle descriptorSet = shader.createDescriptorSet(api); + api.updateDescriptorSetTexture(descriptorSet, 0, texture, + { .filterMag = SamplerMagFilter::LINEAR, + .filterMin = SamplerMinFilter::LINEAR_MIPMAP_NEAREST }); - api.bindDescriptorSet(descriptorSet, 1, {}); + api.bindDescriptorSet(descriptorSet, 1, {}); - renderTriangle({{ DescriptorSetLayoutHandle{}, shader.getDescriptorSetLayout() }}, - defaultRenderTarget, swapChain, shader.getProgram()); + renderTriangle({ { DescriptorSetLayoutHandle{}, shader.getDescriptorSetLayout() } }, + defaultRenderTarget, swapChain, shader.getProgram()); - static const uint32_t expectedHash = 3644679986; - readPixelsAndAssertHash("UpdateImage3D", 512, 512, defaultRenderTarget, expectedHash); + EXPECT_IMAGE(defaultRenderTarget, getExpectations(), + ScreenshotParams(512, 512, "UpdateImage3D", 3644679986)); + } - api.flush(); - api.commit(swapChain); - api.endFrame(0); - - // This ensures all driver commands have finished before exiting the test. - api.finish(); api.stopCapture(); } diff --git a/filament/backend/test/test_PushConstants.cpp b/filament/backend/test/test_PushConstants.cpp index 90b2e8d999..34b43525fe 100644 --- a/filament/backend/test/test_PushConstants.cpp +++ b/filament/backend/test/test_PushConstants.cpp @@ -16,6 +16,7 @@ #include "BackendTest.h" +#include "ImageExpectations.h" #include "Lifetimes.h" #include "ShaderGenerator.h" #include "Skip.h" @@ -151,19 +152,14 @@ TEST_F(BackendTest, PushConstants) { api.endRenderPass(); - readPixelsAndAssertHash("pushConstants", 512, 512, renderTarget, 1957275826, true); + EXPECT_IMAGE(renderTarget, getExpectations(), + ScreenshotParams(512, 512, "pushConstants", 1957275826)); api.commit(swapChain); api.endFrame(0); } api.stopCapture(0); - - // Wait for the ReadPixels result to come back. - api.finish(); - - executeCommands(); - getDriver().purge(); } } // namespace test diff --git a/filament/backend/test/test_RenderExternalImage.cpp b/filament/backend/test/test_RenderExternalImage.cpp index 6c5e8aa5ce..6f0129f98e 100644 --- a/filament/backend/test/test_RenderExternalImage.cpp +++ b/filament/backend/test/test_RenderExternalImage.cpp @@ -16,6 +16,7 @@ #include "BackendTest.h" +#include "ImageExpectations.h" #include "Lifetimes.h" #include "Shader.h" #include "SharedShaders.h" @@ -200,17 +201,16 @@ TEST_F(BackendTest, RenderExternalImage) { api.draw(state, triangle.getRenderPrimitive(), 0, 3, 1); api.endRenderPass(); - readPixelsAndAssertHash("RenderExternalImage", 512, 512, defaultRenderTarget, 267229901, true); - api.flush(); api.commit(swapChain); api.endFrame(0); + EXPECT_IMAGE(defaultRenderTarget, getExpectations(), + ScreenshotParams(512, 512, "RenderExternalImage", 267229901)); api.stopCapture(0); - api.finish(); + flushAndWait(); - executeCommands(); } } // namespace test diff --git a/filament/backend/test/test_Scissor.cpp b/filament/backend/test/test_Scissor.cpp index 7f261b049d..2ae776ddc8 100644 --- a/filament/backend/test/test_Scissor.cpp +++ b/filament/backend/test/test_Scissor.cpp @@ -16,6 +16,7 @@ #include "BackendTest.h" +#include "ImageExpectations.h" #include "Lifetimes.h" #include "Shader.h" #include "SharedShaders.h" @@ -130,20 +131,14 @@ TEST_F(BackendTest, ScissorViewportRegion) { api.draw(ps, triangle.getRenderPrimitive(), 0, 3, 1); api.endRenderPass(); - readPixelsAndAssertHash("scissor", kSrcTexWidth >> 1, kSrcTexHeight >> 1, fullRenderTarget, - 0xAB3D1C53, true); + EXPECT_IMAGE(fullRenderTarget, getExpectations(), + ScreenshotParams(kSrcTexWidth >> 1, kSrcTexHeight >> 1, "scissor", 0xAB3D1C53)); api.commit(swapChain); api.endFrame(0); api.stopCapture(0); } - - // Wait for the ReadPixels result to come back. - api.finish(); - - executeCommands(); - getDriver().purge(); } // Verify that a negative Viewport origin works with scissor. @@ -226,20 +221,14 @@ TEST_F(BackendTest, ScissorViewportEdgeCases) { api.draw(ps, triangle.getRenderPrimitive(), 0, 3, 1); api.endRenderPass(); - readPixelsAndAssertHash( - "ScissorViewportEdgeCases", 512, 512, renderTarget, 0x6BF00F31, true); + EXPECT_IMAGE(renderTarget, getExpectations(), + ScreenshotParams(512, 512, "ScissorViewportEdgeCases", 0x6BF00F31)); api.commit(swapChain); api.endFrame(0); api.stopCapture(0); } - - // Wait for the ReadPixels result to come back. - api.finish(); - - executeCommands(); - getDriver().purge(); } } // namespace test diff --git a/filament/backend/test/test_StencilBuffer.cpp b/filament/backend/test/test_StencilBuffer.cpp index 7703a69db9..d3c75f5b13 100644 --- a/filament/backend/test/test_StencilBuffer.cpp +++ b/filament/backend/test/test_StencilBuffer.cpp @@ -16,6 +16,7 @@ #include "BackendTest.h" +#include "ImageExpectations.h" #include "Lifetimes.h" #include "Shader.h" #include "SharedShaders.h" @@ -129,7 +130,8 @@ TEST_F(BasicStencilBufferTest, StencilBuffer) { RunTest(renderTarget); - readPixelsAndAssertHash("StencilBuffer", 512, 512, renderTarget, 0x3B1AEF0F, true); + EXPECT_IMAGE(renderTarget, getExpectations(), + ScreenshotParams(512, 512, "StencilBuffer", 0x3B1AEF0F)); flushAndWait(); getDriver().purge(); @@ -151,7 +153,8 @@ TEST_F(BasicStencilBufferTest, DepthAndStencilBuffer) { RunTest(renderTarget); - readPixelsAndAssertHash("DepthAndStencilBuffer", 512, 512, renderTarget, 0x3B1AEF0F, true); + EXPECT_IMAGE(renderTarget, getExpectations(), + ScreenshotParams(512, 512, "DepthAndStencilBuffer", 0x3B1AEF0F)); flushAndWait(); getDriver().purge(); @@ -233,7 +236,8 @@ TEST_F(BasicStencilBufferTest, StencilBufferMSAA) { api.stopCapture(0); api.endFrame(0); - readPixelsAndAssertHash("StencilBufferAutoResolve", 512, 512, renderTarget1, 0x6CEFAC8F, true); + EXPECT_IMAGE(renderTarget1, getExpectations(), + ScreenshotParams(512, 512, "StencilBufferAutoResolve", 0x6CEFAC8F)); flushAndWait(); getDriver().purge();