From f3a4e21fe5c5ffb255b2daa7354c43fe76e81a78 Mon Sep 17 00:00:00 2001 From: Powei Feng Date: Fri, 12 Sep 2025 15:27:46 -0700 Subject: [PATCH] backend: fix blit tests for vulkan - The rendertarget layer count should be >=1. - Add read pixels usage bit --- filament/backend/test/test_Blit.cpp | 35 ++++++++++++++++------------- 1 file changed, 19 insertions(+), 16 deletions(-) diff --git a/filament/backend/test/test_Blit.cpp b/filament/backend/test/test_Blit.cpp index 636dc40f10..9dd6cd50d1 100644 --- a/filament/backend/test/test_Blit.cpp +++ b/filament/backend/test/test_Blit.cpp @@ -22,6 +22,7 @@ #include "SharedShaders.h" #include "Skip.h" #include "TrianglePrimitive.h" +#include "Workarounds.h" #include #include @@ -172,17 +173,17 @@ TEST_F(BlitTest, ColorMagnify) { // Create a destination texture. Handle const dstTexture = mCleanup.add(api.createTexture(SamplerType::SAMPLER_2D, kNumLevels, kDstTexFormat, 1, kDstTexWidth, kDstTexHeight, 1, - TextureUsage::SAMPLEABLE | TextureUsage::COLOR_ATTACHMENT | TextureUsage::BLIT_DST)); + TextureUsage::SAMPLEABLE | TextureUsage::COLOR_ATTACHMENT | TextureUsage::BLIT_DST TEXTURE_USAGE_READ_PIXELS)); // Create a RenderTarget for each texture's miplevel. Handle srcRenderTargets[kNumLevels]; Handle dstRenderTargets[kNumLevels]; for (uint8_t level = 0; level < kNumLevels; level++) { srcRenderTargets[level] = mCleanup.add(api.createRenderTarget(TargetBufferFlags::COLOR, - kSrcTexWidth >> level, kSrcTexHeight >> level, 1, 0, { srcTexture, level, 0 }, {}, + kSrcTexWidth >> level, kSrcTexHeight >> level, 1, 1, { srcTexture, level, 0 }, {}, {})); dstRenderTargets[level] = mCleanup.add(api.createRenderTarget(TargetBufferFlags::COLOR, - kDstTexWidth >> level, kDstTexHeight >> level, 1, 0, { dstTexture, level, 0 }, {}, + kDstTexWidth >> level, kDstTexHeight >> level, 1, 1, { dstTexture, level, 0 }, {}, {})); } @@ -236,17 +237,18 @@ TEST_F(BlitTest, ColorMinify) { // Create a destination texture. Handle const dstTexture = mCleanup.add(api.createTexture(SamplerType::SAMPLER_2D, kNumLevels, kDstTexFormat, 1, kDstTexWidth, kDstTexHeight, 1, - TextureUsage::SAMPLEABLE | TextureUsage::COLOR_ATTACHMENT | TextureUsage::BLIT_DST)); + TextureUsage::SAMPLEABLE | TextureUsage::COLOR_ATTACHMENT | + TextureUsage::BLIT_DST TEXTURE_USAGE_READ_PIXELS)); // Create a RenderTarget for each texture's miplevel. Handle srcRenderTargets[kNumLevels]; Handle dstRenderTargets[kNumLevels]; for (uint8_t level = 0; level < kNumLevels; level++) { srcRenderTargets[level] = mCleanup.add(api.createRenderTarget(TargetBufferFlags::COLOR, - kSrcTexWidth >> level, kSrcTexHeight >> level, 1, 0, { srcTexture, level, 0 }, {}, + kSrcTexWidth >> level, kSrcTexHeight >> level, 1, 1, { srcTexture, level, 0 }, {}, {})); dstRenderTargets[level] = mCleanup.add(api.createRenderTarget(TargetBufferFlags::COLOR, - kDstTexWidth >> level, kDstTexHeight >> level, 1, 0, { dstTexture, level, 0 }, {}, + kDstTexWidth >> level, kDstTexHeight >> level, 1, 1, { dstTexture, level, 0 }, {}, {})); } @@ -380,17 +382,18 @@ TEST_F(BlitTest, Blit2DTextureArray) { // Create a destination texture. Handle dstTexture = mCleanup.add(api.createTexture(SamplerType::SAMPLER_2D, kNumLevels, kDstTexFormat, 1, kDstTexWidth, kDstTexHeight, 1, - TextureUsage::SAMPLEABLE | TextureUsage::COLOR_ATTACHMENT | TextureUsage::BLIT_DST)); + TextureUsage::SAMPLEABLE | TextureUsage::COLOR_ATTACHMENT | + TextureUsage::BLIT_DST TEXTURE_USAGE_READ_PIXELS)); // Create two RenderTargets. const int level = 0; Handle srcRenderTarget = mCleanup.add( api.createRenderTarget(TargetBufferFlags::COLOR, - kSrcTexWidth >> level, kSrcTexHeight >> level, 1, 0, + kSrcTexWidth >> level, kSrcTexHeight >> level, 1, 1, { srcTexture, level, kSrcTexLayer }, {}, {})); Handle dstRenderTarget = mCleanup.add( api.createRenderTarget(TargetBufferFlags::COLOR, - kDstTexWidth >> level, kDstTexHeight >> level, 1, 0, + kDstTexWidth >> level, kDstTexHeight >> level, 1, 1, { dstTexture, level, kDstTexLayer }, {}, {})); // Do a blit from kSrcTexLayer of the source RT to kDstTexLayer of the destination RT. @@ -466,10 +469,10 @@ TEST_F(BlitTest, BlitRegion) { // that this case is handled correctly. Handle srcRenderTarget = mCleanup.add(api.createRenderTarget(TargetBufferFlags::COLOR, srcRect.width, - srcRect.height, 1, 0, { srcTexture, kSrcLevel, 0 }, {}, {})); + srcRect.height, 1, 1, { srcTexture, kSrcLevel, 0 }, {}, {})); Handle dstRenderTarget = mCleanup.add(api.createRenderTarget(TargetBufferFlags::COLOR, kDstTexWidth >> kDstLevel, - kDstTexHeight >> kDstLevel, 1, 0, { dstTexture, kDstLevel, 0 }, {}, {})); + kDstTexHeight >> kDstLevel, 1, 1, { dstTexture, kDstLevel, 0 }, {}, {})); api.blitDEPRECATED(TargetBufferFlags::COLOR0, dstRenderTarget, dstRect, srcRenderTarget, srcRect, @@ -492,7 +495,6 @@ TEST_F(BlitTest, BlitRegion) { } TEST_F(BlitTest, BlitRegionToSwapChain) { - FAIL_IF(Backend::VULKAN, "Crashes due to not finding color attachment, see b/417481493"); SKIP_IF(Backend::WEBGPU, "WebGPU Crashes due to not finding color attachment"); auto& api = getDriverApi(); mCleanup.addPostCall([&]() { executeCommands(); }); @@ -511,9 +513,10 @@ TEST_F(BlitTest, BlitRegionToSwapChain) { Handle dstRenderTarget = mCleanup.add(api.createDefaultRenderTarget()); // Create a source texture. - Handle srcTexture = mCleanup.add(api.createTexture( - SamplerType::SAMPLER_2D, kNumLevels, kSrcTexFormat, 1, kSrcTexWidth, kSrcTexHeight, 1, - TextureUsage::SAMPLEABLE | TextureUsage::UPLOADABLE | TextureUsage::COLOR_ATTACHMENT)); + Handle srcTexture = mCleanup.add(api.createTexture(SamplerType::SAMPLER_2D, + kNumLevels, kSrcTexFormat, 1, kSrcTexWidth, kSrcTexHeight, 1, + TextureUsage::SAMPLEABLE | TextureUsage::UPLOADABLE | + TextureUsage::COLOR_ATTACHMENT TEXTURE_USAGE_READ_PIXELS)); const bool flipY = sBackend == Backend::OPENGL; createBitmap(api, srcTexture, kSrcTexWidth, kSrcTexHeight, 0, float3(0.5, 0, 0), flipY); createBitmap(api, srcTexture, kSrcTexWidth, kSrcTexHeight, 1, float3(0, 0, 0.5), flipY); @@ -522,7 +525,7 @@ TEST_F(BlitTest, BlitRegionToSwapChain) { Handle srcRenderTargets[kNumLevels]; for (uint8_t level = 0; level < kNumLevels; level++) { srcRenderTargets[level] = mCleanup.add(api.createRenderTarget(TargetBufferFlags::COLOR, - kSrcTexWidth >> level, kSrcTexHeight >> level, 1, 0, { srcTexture, level, 0 }, {}, + kSrcTexWidth >> level, kSrcTexHeight >> level, 1, 1, { srcTexture, level, 0 }, {}, {})); }