@@ -11,6 +11,7 @@ import { kAddressModes, kMipmapFilterModes } from '../../../capability_info.js';
1111import {
1212 EncodableTextureFormat ,
1313 getTextureFormatType ,
14+ isTextureFormatColorRenderable ,
1415 kPossibleColorRenderableTextureFormats ,
1516} from '../../../format_info.js' ;
1617import { AllFeaturesMaxLimitsGPUTest , TextureTestMixin } from '../../../gpu_test.js' ;
@@ -46,6 +47,12 @@ class FilterModeTest extends TextureTestMixin(AllFeaturesMaxLimitsGPUTest) {
4647 vertexCount : number ,
4748 instanceCount : number
4849 ) {
50+ let renderTargetFormat = format ;
51+ if ( ! isTextureFormatColorRenderable ( this . device , format ) ) {
52+ // If the format is not renderable, we use rgba32float as the render target format
53+ // to verify the result, which is always renderable.
54+ renderTargetFormat = 'rgba32float' ;
55+ }
4956 const sampleTexture = this . createTextureFromTexelView (
5057 TexelView . fromTexelsAsColors ( format , coord => {
5158 const id = coord . x + coord . y * kCheckerTextureSize ;
@@ -57,7 +64,7 @@ class FilterModeTest extends TextureTestMixin(AllFeaturesMaxLimitsGPUTest) {
5764 }
5865 ) ;
5966 const renderTexture = this . createTextureTracked ( {
60- format,
67+ format : renderTargetFormat ,
6168 size : renderSize ,
6269 usage : GPUTextureUsage . RENDER_ATTACHMENT | GPUTextureUsage . COPY_SRC ,
6370 } ) ;
@@ -70,7 +77,7 @@ class FilterModeTest extends TextureTestMixin(AllFeaturesMaxLimitsGPUTest) {
7077 fragment : {
7178 module,
7279 entryPoint : 'fs_main' ,
73- targets : [ { format } ] ,
80+ targets : [ { format : renderTargetFormat } ] ,
7481 } ,
7582 } ) ;
7683 const bindgroup = this . device . createBindGroup ( {
@@ -96,7 +103,7 @@ class FilterModeTest extends TextureTestMixin(AllFeaturesMaxLimitsGPUTest) {
96103 renderPass . draw ( vertexCount , instanceCount ) ;
97104 renderPass . end ( ) ;
98105 this . device . queue . submit ( [ commandEncoder . finish ( ) ] ) ;
99- return renderTexture ;
106+ return { texture : renderTexture , format : renderTargetFormat } ;
100107 }
101108}
102109
@@ -548,8 +555,8 @@ g.test('magFilter,nearest')
548555 instanceCount
549556 ) ;
550557 t . expectTexelViewComparisonIsOkInTexture (
551- { texture : render } ,
552- expectedColors ( format , 'nearest' , addressModeU , addressModeV ) ,
558+ { texture : render . texture } ,
559+ expectedColors ( render . format , 'nearest' , addressModeU , addressModeV ) ,
553560 kNearestRenderDim
554561 ) ;
555562 } ) ;
@@ -663,8 +670,8 @@ g.test('magFilter,linear')
663670 instanceCount
664671 ) ;
665672 t . expectTexelViewComparisonIsOkInTexture (
666- { texture : render } ,
667- expectedColors ( format , 'linear' , addressModeU , addressModeV ) ,
673+ { texture : render . texture } ,
674+ expectedColors ( render . format , 'linear' , addressModeU , addressModeV ) ,
668675 kLinearRenderDim
669676 ) ;
670677 } ) ;
@@ -790,8 +797,8 @@ g.test('minFilter,nearest')
790797 instanceCount
791798 ) ;
792799 t . expectTexelViewComparisonIsOkInTexture (
793- { texture : render } ,
794- expectedColors ( format , 'nearest' , addressModeU , addressModeV ) ,
800+ { texture : render . texture } ,
801+ expectedColors ( render . format , 'nearest' , addressModeU , addressModeV ) ,
795802 kNearestRenderDim
796803 ) ;
797804 } ) ;
@@ -915,8 +922,8 @@ g.test('minFilter,linear')
915922 instanceCount
916923 ) ;
917924 t . expectTexelViewComparisonIsOkInTexture (
918- { texture : render } ,
919- expectedColors ( format , 'linear' , addressModeU , addressModeV ) ,
925+ { texture : render . texture } ,
926+ expectedColors ( render . format , 'linear' , addressModeU , addressModeV ) ,
920927 kLinearRenderDim
921928 ) ;
922929 } ) ;
@@ -939,6 +946,12 @@ g.test('mipmapFilter')
939946 const { format, filterMode } = t . params ;
940947 t . skipIfTextureFormatNotSupported ( format ) ;
941948 t . skipIfTextureFormatNotFilterable ( format ) ;
949+ let renderTargetFormat = format ;
950+ if ( ! isTextureFormatColorRenderable ( t . device , format ) ) {
951+ // If the format is not renderable, we use rgba32float as the render target format
952+ // to verify the result, which is always renderable.
953+ renderTargetFormat = 'rgba32float' ;
954+ }
942955 // Takes a 8x8/4x4 mipmapped texture and renders it on multiple quads with different UVs such
943956 // that each instanced quad from left to right emulates moving the quad further and further from
944957 // the camera. Each quad is then rendered to a single pixel in a 1-dimensional texture. Since
@@ -966,7 +979,7 @@ g.test('mipmapFilter')
966979 }
967980 ) ;
968981 const renderTexture = t . createTextureTracked ( {
969- format,
982+ format : renderTargetFormat ,
970983 size : [ kRenderSize , 1 ] ,
971984 usage : GPUTextureUsage . RENDER_ATTACHMENT | GPUTextureUsage . COPY_SRC ,
972985 } ) ;
@@ -1016,7 +1029,7 @@ g.test('mipmapFilter')
10161029 fragment : {
10171030 module,
10181031 entryPoint : 'fs_main' ,
1019- targets : [ { format } ] ,
1032+ targets : [ { format : renderTargetFormat } ] ,
10201033 } ,
10211034 } ) ;
10221035 const bindgroup = t . device . createBindGroup ( {
@@ -1050,8 +1063,8 @@ g.test('mipmapFilter')
10501063 buffer ,
10511064 actual => {
10521065 // Convert the buffer to texel view so we can do comparisons.
1053- const layout = getTextureCopyLayout ( format , '2d' , [ kRenderSize , 1 , 1 ] ) ;
1054- const view = TexelView . fromTextureDataByReference ( format , actual , {
1066+ const layout = getTextureCopyLayout ( renderTargetFormat , '2d' , [ kRenderSize , 1 , 1 ] ) ;
1067+ const view = TexelView . fromTextureDataByReference ( renderTargetFormat , actual , {
10551068 bytesPerRow : layout . bytesPerRow ,
10561069 rowsPerImage : layout . rowsPerImage ,
10571070 subrectOrigin : [ 0 , 0 , 0 ] ,
0 commit comments