2 Copyright (c) 2019 The Khronos Group Inc.
3 Use of this source code is governed by an MIT-style license that can be
4 found in the LICENSE.txt file.
10 <meta charset=
"utf-8">
11 <title>WebGL EXT_texture_compression_bptc Conformance Tests
</title>
12 <LINK rel=
"stylesheet" href=
"../../resources/js-test-style.css"/>
13 <script src=
"../../js/js-test-pre.js"></script>
14 <script src=
"../../js/webgl-test-utils.js"></script>
15 <script src=
"../../js/tests/compressed-texture-utils.js"></script>
18 <div id=
"description"></div>
19 <div id=
"console"></div>
22 description("This test verifies the functionality of the EXT_texture_compression_bptc extension, if it is available.");
27 COMPRESSED_RGBA_BPTC_UNORM_EXT
: 0x8E8C,
28 COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT
: 0x8E8D,
29 COMPRESSED_RGB_BPTC_SIGNED_FLOAT_EXT
: 0x8E8E,
30 COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_EXT
: 0x8E8F
33 function expectedByteLength(width
, height
, format
) {
34 return Math
.ceil(width
/ 4) * Math
.ceil(height
/ 4) * 16;
37 function getBlockDimensions(format
) {
38 return {width
: 4, height
: 4};
41 var wtu
= WebGLTestUtils
;
42 var ctu
= CompressedTextureUtils
;
43 var contextVersion
= wtu
.getDefault3DContextVersion();
44 var gl
= wtu
.create3DContext();
49 function runTestExtension() {
50 // Test that enum values are listed correctly in supported formats and in the extension object.
51 ctu
.testCompressedFormatsListed(gl
, validFormats
);
52 ctu
.testCorrectEnumValuesInExt(ext
, validFormats
);
53 // Test that texture upload buffer size is validated correctly.
54 ctu
.testFormatRestrictionsOnBufferSize(gl
, validFormats
, expectedByteLength
, getBlockDimensions
);
55 // Test TexSubImage validation on dimensions
56 // CompressedTexSubImage* will result in an
57 // INVALID_OPERATION error only if one of the following conditions occurs:
58 // * <width> is not a multiple of four, and <width> plus <xoffset> is not
59 // equal to TEXTURE_WIDTH;
60 // * <height> is not a multiple of four, and <height> plus <yoffset> is
61 // not equal to TEXTURE_HEIGHT; or
62 // * <xoffset> or <yoffset> is not a multiple of four.
63 ctu
.testTexSubImageDimensions(gl
, ext
, validFormats
, expectedByteLength
, getBlockDimensions
,
65 { xoffset
: 0, yoffset
: 0, width
: 4, height
: 3,
66 expectation
: gl
.INVALID_OPERATION
, message
: "height is not a multiple of 4" },
67 { xoffset
: 0, yoffset
: 0, width
: 3, height
: 4,
68 expectation
: gl
.INVALID_OPERATION
, message
: "width is not a multiple of 4" },
69 { xoffset
: 1, yoffset
: 0, width
: 4, height
: 4,
70 expectation
: gl
.INVALID_OPERATION
, message
: "xoffset is not a multiple of 4" },
71 { xoffset
: 0, yoffset
: 1, width
: 4, height
: 4,
72 expectation
: gl
.INVALID_OPERATION
, message
: "yoffset is not a multiple of 4" },
73 { xoffset
: 12, yoffset
: 12, width
: 4, height
: 4,
74 expectation
: gl
.NO_ERROR
, message
: "is valid" },
77 // Test TexImage validation on level dimensions combinations.
78 // When level equals 0, width and height must be a multiple of 4.
79 // When level is larger than 0, this constraint doesn't apply.
81 let npotExpectation
, npotMessage
;
82 if (contextVersion
>= 2) {
83 npotExpectation
= gl
.NO_ERROR
;
84 npotMessage
= "valid";
86 npotExpectation
= gl
.INVALID_VALUE
;
87 npotMessage
= "invalid";
90 ctu
.testTexImageLevelDimensions(gl
, ext
, validFormats
, expectedByteLength
, getBlockDimensions
,
92 { level
: 0, width
: 4, height
: 3,
93 expectation
: gl
.INVALID_OPERATION
, message
: "level is 0, height is not a multiple of 4" },
94 { level
: 0, width
: 3, height
: 4,
95 expectation
: gl
.INVALID_OPERATION
, message
: "level is 0, width is not a multiple of 4" },
96 { level
: 0, width
: 2, height
: 2,
97 expectation
: gl
.INVALID_OPERATION
, message
: "level is 0, width is not a multiple of 4" },
98 { level
: 0, width
: 4, height
: 4,
99 expectation
: gl
.NO_ERROR
, message
: "is valid" },
100 { level
: 1, width
: 1, height
: 1,
101 expectation
: gl
.INVALID_OPERATION
, message
: "implied base mip 2x2 is invalid" },
102 { level
: 1, width
: 1, height
: 2,
103 expectation
: gl
.INVALID_OPERATION
, message
: "implied base mip 2x4 is invalid" },
104 { level
: 1, width
: 2, height
: 1,
105 expectation
: gl
.INVALID_OPERATION
, message
: "implied base mip 4x2 is invalid" },
106 { level
: 1, width
: 2, height
: 2,
107 expectation
: gl
.NO_ERROR
, message
: "implied base mip 4x4 is valid" },
108 { level
: 2, width
: 1, height
: 3,
109 expectation
: npotExpectation
, message
: "implied base mip 4x12 is " + npotMessage
},
112 // Test that BPTC enums are not accepted by texImage2D
114 var tex
= gl
.createTexture();
115 gl
.bindTexture(gl
.TEXTURE_2D
, tex
);
117 gl
.texImage2D(gl
.TEXTURE_2D
, 0, ext
.COMPRESSED_RGBA_BPTC_UNORM_EXT
, 4, 4, 0, gl
.RGBA
, gl
.UNSIGNED_BYTE
, null);
118 wtu
.glErrorShouldBe(gl
, [gl
.INVALID_VALUE
, gl
.INVALID_OPERATION
], "COMPRESSED_RGBA_BPTC_UNORM_EXT fails with texImage2D");
120 gl
.texImage2D(gl
.TEXTURE_2D
, 0, ext
.COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT
, 4, 4, 0, gl
.RGBA
, gl
.UNSIGNED_BYTE
, null);
121 wtu
.glErrorShouldBe(gl
, [gl
.INVALID_VALUE
, gl
.INVALID_OPERATION
], "COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT fails with texImage2D");
123 if (contextVersion
>= 2) {
124 gl
.texImage2D(gl
.TEXTURE_2D
, 0, ext
.COMPRESSED_RGB_BPTC_SIGNED_FLOAT_EXT
, 4, 4, 0, gl
.RGB
, gl
.FLOAT
, null);
125 wtu
.glErrorShouldBe(gl
, [gl
.INVALID_VALUE
, gl
.INVALID_OPERATION
], "COMPRESSED_RGB_BPTC_SIGNED_FLOAT_EXT fails with texImage2D");
127 gl
.texImage2D(gl
.TEXTURE_2D
, 0, ext
.COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_EXT
, 4, 4, 0, gl
.RGB
, gl
.FLOAT
, null);
128 wtu
.glErrorShouldBe(gl
, [gl
.INVALID_VALUE
, gl
.INVALID_OPERATION
], "COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_EXT fails with texImage2D");
131 gl
.deleteTexture(tex
);
137 testFailed("context does not exist");
139 testPassed("context exists");
141 ctu
.testCompressedFormatsUnavailableWhenExtensionDisabled(gl
, validFormats
, expectedByteLength
, 4);
143 ext
= gl
.getExtension("EXT_texture_compression_bptc");
145 wtu
.runExtensionSupportedTest(gl
, "EXT_texture_compression_bptc", ext
!== null);
155 var successfullyParsed
= true;
157 <script src=
"../../js/js-test-post.js"></script>