samplers.html (8819B)
1 <!-- 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. 5 --> 6 7 <!DOCTYPE html> 8 <html> 9 <head> 10 <meta charset="utf-8"> 11 <title>WebGL Sampler 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 </head> 16 <body> 17 <div id="description"></div> 18 <canvas id="canvas" style="width: 50px; height: 50px;"> </canvas> 19 <div id="console"></div> 20 <script> 21 "use strict"; 22 description("This test verifies the functionality of the Sampler objects."); 23 24 debug(""); 25 26 var wtu = WebGLTestUtils; 27 var canvas = document.getElementById("canvas"); 28 var gl = wtu.create3DContext(canvas, null, 2); 29 var s = null; 30 var s1 = null; 31 var s2 = null; 32 var testCases = null; 33 34 if (!gl) { 35 testFailed("WebGL context does not exist"); 36 } else { 37 testPassed("WebGL context exists"); 38 39 runBindingTest(); 40 runObjectTest(); 41 runParameterTest(); 42 wtu.glErrorShouldBe(gl, gl.NO_ERROR, "there should be no errors"); 43 } 44 45 function enumToString(value) { 46 return wtu.glEnumToString(gl, value); 47 } 48 49 function runBindingTest() { 50 debug("Testing binding enum"); 51 52 shouldBe("gl.SAMPLER_BINDING", "0x8919"); 53 54 // Default value is null 55 shouldBeNull("gl.getParameter(gl.SAMPLER_BINDING)"); 56 wtu.glErrorShouldBe(gl, gl.NO_ERROR, "SAMPLER_BINDING query should succeed"); 57 58 debug("Testing binding a Sampler object"); 59 s1 = gl.createSampler(); 60 s2 = gl.createSampler(); 61 gl.bindSampler(0, s1); 62 shouldBe("gl.getParameter(gl.SAMPLER_BINDING)", "s1"); 63 gl.bindSampler(0, s2); 64 shouldBe("gl.getParameter(gl.SAMPLER_BINDING)", "s2"); 65 66 // Bindings should not affect other units. 67 gl.bindSampler(1, s1); 68 shouldBe("gl.getParameter(gl.SAMPLER_BINDING)", "s2"); 69 gl.activeTexture(gl.TEXTURE1); 70 shouldBe("gl.getParameter(gl.SAMPLER_BINDING)", "s1"); 71 gl.activeTexture(gl.TEXTURE0); 72 73 // Should be able to bind a single sampler to multiple texture units. 74 gl.bindSampler(0, s1); 75 shouldBe("gl.getParameter(gl.SAMPLER_BINDING)", "s1"); 76 77 // Deleting samplers should unbind them. 78 gl.deleteSampler(s1); 79 gl.deleteSampler(s2); 80 shouldBeNull("gl.getParameter(gl.SAMPLER_BINDING)"); 81 gl.activeTexture(gl.TEXTURE1); 82 shouldBeNull("gl.getParameter(gl.SAMPLER_BINDING)"); 83 gl.activeTexture(gl.TEXTURE0); 84 85 // Shouldn't be able to bind a deleted sampler. 86 gl.bindSampler(0, s2); 87 wtu.glErrorShouldBe(gl, gl.INVALID_OPERATION, "binding a deleted Sampler object"); 88 gl.bindSampler(0, null); 89 shouldBeNull("gl.getParameter(gl.SAMPLER_BINDING)"); 90 wtu.glErrorShouldBe(gl, gl.NO_ERROR, "there should be no errors"); 91 } 92 93 function runObjectTest() { 94 debug("Testing object creation"); 95 96 s1 = gl.createSampler(); 97 wtu.glErrorShouldBe(gl, gl.NO_ERROR, "createSampler should not set an error"); 98 shouldBeNonNull("s1"); 99 100 // Expect true, even if never bound 101 shouldBeTrue("gl.isSampler(s1)"); 102 gl.bindSampler(0, s1); 103 shouldBeTrue("gl.isSampler(s1)"); 104 gl.bindSampler(0, null); 105 shouldBeTrue("gl.isSampler(s1)"); 106 gl.deleteSampler(s1); 107 shouldBeFalse("gl.isSampler(s1)"); 108 109 shouldBeFalse("gl.isSampler(null)"); 110 111 s1 = null; 112 } 113 114 function runParameterTest() { 115 debug("Testing getSamplerParameter and samplerParameter[if]"); 116 117 s = gl.createSampler(); 118 gl.bindSampler(0, s); 119 120 debug("Checking default param for getSamplerParameter"); 121 122 testCases = [ 123 { pname: gl.TEXTURE_WRAP_S, defaultParam: gl.REPEAT }, 124 { pname: gl.TEXTURE_WRAP_T, defaultParam: gl.REPEAT }, 125 { pname: gl.TEXTURE_WRAP_R, defaultParam: gl.REPEAT }, 126 { pname: gl.TEXTURE_MIN_FILTER, defaultParam: gl.NEAREST_MIPMAP_LINEAR }, 127 { pname: gl.TEXTURE_MAG_FILTER, defaultParam: gl.LINEAR }, 128 { pname: gl.TEXTURE_COMPARE_MODE, defaultParam: gl.NONE }, 129 { pname: gl.TEXTURE_COMPARE_FUNC, defaultParam: gl.LEQUAL }, 130 { pname: gl.TEXTURE_MIN_LOD, defaultParam: -1000 }, 131 { pname: gl.TEXTURE_MAX_LOD, defaultParam: 1000 }, 132 ]; 133 134 for (var ii = 0; ii < testCases.length; ++ii) { 135 var pname = testCases[ii].pname; 136 var defaultParam = testCases[ii].defaultParam; 137 shouldBe("gl.getSamplerParameter(s, " + pname + ")", defaultParam.toString()); 138 wtu.glErrorShouldBe(gl, gl.NO_ERROR); 139 } 140 141 debug("Checking valid pname and param for samplerParameteri"); 142 143 testCases = [ 144 { pname: gl.TEXTURE_WRAP_S, param: gl.REPEAT }, 145 { pname: gl.TEXTURE_WRAP_S, param: gl.MIRRORED_REPEAT }, 146 { pname: gl.TEXTURE_WRAP_S, param: gl.CLAMP_TO_EDGE }, 147 { pname: gl.TEXTURE_WRAP_T, param: gl.REPEAT }, 148 { pname: gl.TEXTURE_WRAP_T, param: gl.MIRRORED_REPEAT }, 149 { pname: gl.TEXTURE_WRAP_T, param: gl.CLAMP_TO_EDGE }, 150 { pname: gl.TEXTURE_WRAP_R, param: gl.REPEAT }, 151 { pname: gl.TEXTURE_WRAP_R, param: gl.MIRRORED_REPEAT }, 152 { pname: gl.TEXTURE_WRAP_R, param: gl.CLAMP_TO_EDGE }, 153 { pname: gl.TEXTURE_MIN_FILTER, param: gl.NEAREST }, 154 { pname: gl.TEXTURE_MIN_FILTER, param: gl.LINEAR }, 155 { pname: gl.TEXTURE_MIN_FILTER, param: gl.NEAREST_MIPMAP_NEAREST }, 156 { pname: gl.TEXTURE_MIN_FILTER, param: gl.NEAREST_MIPMAP_LINEAR }, 157 { pname: gl.TEXTURE_MIN_FILTER, param: gl.LINEAR_MIPMAP_NEAREST }, 158 { pname: gl.TEXTURE_MIN_FILTER, param: gl.LINEAR_MIPMAP_LINEAR }, 159 { pname: gl.TEXTURE_MAG_FILTER, param: gl.NEAREST }, 160 { pname: gl.TEXTURE_MAG_FILTER, param: gl.LINEAR }, 161 { pname: gl.TEXTURE_COMPARE_MODE, param: gl.NONE }, 162 { pname: gl.TEXTURE_COMPARE_MODE, param: gl.COMPARE_REF_TO_TEXTURE }, 163 { pname: gl.TEXTURE_COMPARE_FUNC, param: gl.LEQUAL }, 164 { pname: gl.TEXTURE_COMPARE_FUNC, param: gl.GEQUAL }, 165 { pname: gl.TEXTURE_COMPARE_FUNC, param: gl.LESS }, 166 { pname: gl.TEXTURE_COMPARE_FUNC, param: gl.GREATER }, 167 { pname: gl.TEXTURE_COMPARE_FUNC, param: gl.EQUAL }, 168 { pname: gl.TEXTURE_COMPARE_FUNC, param: gl.NOTEQUAL }, 169 { pname: gl.TEXTURE_COMPARE_FUNC, param: gl.ALWAYS }, 170 { pname: gl.TEXTURE_COMPARE_FUNC, param: gl.NEVER }, 171 ]; 172 173 for (var ii = 0; ii < testCases.length; ++ii) { 174 var pname = testCases[ii].pname; 175 var param = testCases[ii].param; 176 wtu.shouldGenerateGLError(gl, gl.NO_ERROR, "gl.samplerParameteri(s, " + pname + ", " + param + ")"); 177 shouldBe("gl.getSamplerParameter(s, " + pname + ")", param); 178 wtu.glErrorShouldBe(gl, gl.NO_ERROR); 179 } 180 181 debug("Checking valid pname and param for samplerParameterf"); 182 testCases = [ 183 { pname: gl.TEXTURE_MIN_LOD, param: -500 }, 184 { pname: gl.TEXTURE_MIN_LOD, param: 0 }, 185 { pname: gl.TEXTURE_MIN_LOD, param: 10.0 }, 186 { pname: gl.TEXTURE_MAX_LOD, param: 500 }, 187 { pname: gl.TEXTURE_MAX_LOD, param: 0 }, 188 { pname: gl.TEXTURE_MAX_LOD, param: 10.0 }, 189 ]; 190 191 for (var ii = 0; ii < testCases.length; ++ii) { 192 var pname = testCases[ii].pname; 193 var param = testCases[ii].param; 194 wtu.shouldGenerateGLError(gl, gl.NO_ERROR, "gl.samplerParameterf(s, " + pname + ", " + param + ")"); 195 shouldBe("gl.getSamplerParameter(s, " + pname + ")", param.toString()); 196 wtu.glErrorShouldBe(gl, gl.NO_ERROR); 197 } 198 199 debug("Checking invalid pname and param"); 200 201 testCases = [ 202 { pname: gl.TEXTURE_IMMUTABLE_FORMAT, param: null, expectedError: gl.INVALID_ENUM }, 203 { pname: gl.TEXTURE_BASE_LEVEL, param: null, expectedError: gl.INVALID_ENUM }, 204 { pname: gl.TEXTURE_MAX_LEVEL, param: null, expectedError: gl.INVALID_ENUM }, 205 { pname: gl.TEXTURE_WRAP_S, param: 0x812D,/* GL_CLAMP_TO_BORDER */ expectedError: gl.INVALID_ENUM }, 206 { pname: gl.TEXTURE_WRAP_T, param: 0x812D,/* GL_CLAMP_TO_BORDER */ expectedError: gl.INVALID_ENUM }, 207 { pname: gl.TEXTURE_MAG_FILTER, param: gl.LINEAR_MIPMAP_NEAREST, expectedError: gl.INVALID_ENUM }, 208 ]; 209 210 for (var ii = 0; ii < testCases.length; ++ii) { 211 var pname = testCases[ii].pname; 212 var param = testCases[ii].param; 213 var expectedError = testCases[ii].expectedError; 214 if (param == null) { 215 wtu.shouldGenerateGLError(gl, expectedError, "gl.getSamplerParameter(s, " + pname + ")"); 216 } else { 217 wtu.shouldGenerateGLError(gl, gl.NO_ERROR, "gl.getSamplerParameter(s, " + pname + ")"); 218 } 219 wtu.shouldGenerateGLError(gl, expectedError, "gl.samplerParameteri(s, " + pname + ", " + param + ")"); 220 wtu.shouldGenerateGLError(gl, expectedError, "gl.samplerParameterf(s, " + pname + ", " + param + ")"); 221 } 222 } 223 224 debug(""); 225 var successfullyParsed = true; 226 </script> 227 <script src="../../js/js-test-post.js"></script> 228 229 </body> 230 </html>