es3fRboStateQueryTests.js (11261B)
1 /*------------------------------------------------------------------------- 2 * drawElements Quality Program OpenGL ES Utilities 3 * ------------------------------------------------ 4 * 5 * Copyright 2014 The Android Open Source Project 6 * 7 * Licensed under the Apache License, Version 2.0 (the 'License'); 8 * you may not use this file except in compliance with the License. 9 * You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, software 14 * distributed under the License is distributed on an 'AS IS' BASIS, 15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 16 * See the License for the specific language governing permissions and 17 * limitations under the License. 18 * 19 */ 20 21 'use strict'; 22 goog.provide('functional.gles3.es3fRboStateQueryTests'); 23 goog.require('framework.common.tcuTestCase'); 24 goog.require('framework.delibs.debase.deRandom'); 25 goog.require('functional.gles3.es3fApiCase'); 26 goog.require('modules.shared.glsStateQuery'); 27 28 goog.scope(function() { 29 var es3fRboStateQueryTests = functional.gles3.es3fRboStateQueryTests; 30 var tcuTestCase = framework.common.tcuTestCase; 31 var glsStateQuery = modules.shared.glsStateQuery; 32 var es3fApiCase = functional.gles3.es3fApiCase; 33 var deRandom = framework.delibs.debase.deRandom; 34 35 var setParentClass = function(child, parent) { 36 child.prototype = Object.create(parent.prototype); 37 child.prototype.constructor = child; 38 }; 39 40 /** 41 * @this {es3fApiCase.ApiCase} 42 */ 43 var checkRenderbufferComponentSize = function(r, g, b, a, d, s) { 44 var referenceSizes = [r, g, b, a, d, s]; 45 var paramNames = [ 46 gl.RENDERBUFFER_RED_SIZE, 47 gl.RENDERBUFFER_GREEN_SIZE, 48 gl.RENDERBUFFER_BLUE_SIZE, 49 gl.RENDERBUFFER_ALPHA_SIZE, 50 gl.RENDERBUFFER_DEPTH_SIZE, 51 gl.RENDERBUFFER_STENCIL_SIZE 52 ]; 53 54 for (var ndx = 0; ndx < referenceSizes.length; ++ndx) { 55 if (referenceSizes[ndx] == -1) 56 continue; 57 var value = /** @type {number} */ (gl.getRenderbufferParameter(gl.RENDERBUFFER, paramNames[ndx])); 58 59 this.check(value >= referenceSizes[ndx], 'Expected greater or equal to ' + referenceSizes[ndx] + ' got ' + value); 60 } 61 }; 62 63 /** 64 * @constructor 65 * @extends {es3fApiCase.ApiCase} 66 * @param {string} name 67 * @param {string} description 68 */ 69 es3fRboStateQueryTests.RboSizeCase = function(name, description) { 70 es3fApiCase.ApiCase.call(this, name, description, gl); 71 }; 72 73 setParentClass(es3fRboStateQueryTests.RboSizeCase, es3fApiCase.ApiCase); 74 75 es3fRboStateQueryTests.RboSizeCase.prototype.test = function() { 76 var rnd = new deRandom.Random(0xabcdef); 77 78 var renderbufferID = gl.createRenderbuffer(); 79 gl.bindRenderbuffer(gl.RENDERBUFFER, renderbufferID); 80 81 this.check(glsStateQuery.verifyRenderbuffer(gl.RENDERBUFFER_WIDTH, 0)); 82 this.check(glsStateQuery.verifyRenderbuffer(gl.RENDERBUFFER_HEIGHT, 0)); 83 84 var numIterations = 60; 85 for (var i = 0; i < numIterations; ++i) { 86 var w = rnd.getInt(0, 128); 87 var h = rnd.getInt(0, 128); 88 89 gl.renderbufferStorage(gl.RENDERBUFFER, gl.RGB8, w, h); 90 91 this.check(glsStateQuery.verifyRenderbuffer(gl.RENDERBUFFER_WIDTH, w)); 92 this.check(glsStateQuery.verifyRenderbuffer(gl.RENDERBUFFER_HEIGHT, h)); 93 } 94 gl.deleteRenderbuffer(renderbufferID); 95 }; 96 97 /** 98 * @constructor 99 * @extends {es3fApiCase.ApiCase} 100 * @param {string} name 101 * @param {string} description 102 */ 103 es3fRboStateQueryTests.RboInternalFormatCase = function(name, description) { 104 es3fApiCase.ApiCase.call(this, name, description, gl); 105 }; 106 107 setParentClass(es3fRboStateQueryTests.RboInternalFormatCase, es3fApiCase.ApiCase); 108 109 es3fRboStateQueryTests.RboInternalFormatCase.prototype.test = function() { 110 var renderbufferID = gl.createRenderbuffer(); 111 gl.bindRenderbuffer(gl.RENDERBUFFER, renderbufferID); 112 113 this.check(glsStateQuery.verifyRenderbuffer(gl.RENDERBUFFER_INTERNAL_FORMAT, gl.RGBA4)); 114 115 var requiredColorformats = [ 116 gl.R8, gl.RG8, gl.RGB8, gl.RGB565, gl.RGBA4, gl.RGB5_A1, gl.RGBA8, gl.RGB10_A2, 117 gl.RGB10_A2UI, gl.SRGB8_ALPHA8, gl.R8I, gl.R8UI, gl.R16I, gl.R16UI, gl.R32I, gl.R32UI, 118 gl.RG8I, gl.RG8UI, gl.RG16I, gl.RG16UI, gl.RG32I, gl.RG32UI, gl.RGBA8I, gl.RGBA8UI, 119 gl.RGBA16I, gl.RGBA16UI, gl.RGBA32I, gl.RGBA32UI 120 ]; 121 122 for (var ndx = 0; ndx < requiredColorformats.length; ++ndx) { 123 gl.renderbufferStorage(gl.RENDERBUFFER, requiredColorformats[ndx], 128, 128); 124 125 this.check(glsStateQuery.verifyRenderbuffer(gl.RENDERBUFFER_INTERNAL_FORMAT, requiredColorformats[ndx])); 126 } 127 gl.deleteRenderbuffer(renderbufferID); 128 }; 129 130 /** 131 * @constructor 132 * @extends {es3fApiCase.ApiCase} 133 * @param {string} name 134 * @param {string} description 135 */ 136 es3fRboStateQueryTests.RboComponentSizeColorCase = function(name, description) { 137 es3fApiCase.ApiCase.call(this, name, description, gl); 138 }; 139 140 setParentClass(es3fRboStateQueryTests.RboComponentSizeColorCase, es3fApiCase.ApiCase); 141 142 es3fRboStateQueryTests.RboComponentSizeColorCase.prototype.test = function() { 143 var renderbufferID = gl.createRenderbuffer(); 144 gl.bindRenderbuffer(gl.RENDERBUFFER, renderbufferID); 145 146 checkRenderbufferComponentSize.bind(this, 0, 0, 0, 0, 0, 0); 147 148 var requiredColorFormats = [ 149 // format, r, g, b, a 150 [gl.R8, 8, 0, 0, 0], 151 [gl.RG8, 8, 8, 0, 0], 152 [gl.RGB8, 8, 8, 8, 0], 153 [gl.RGB565, 5, 6, 5, 0], 154 [gl.RGBA4, 4, 4, 4, 4], 155 [gl.RGB5_A1, 5, 5, 5, 1], 156 [gl.RGBA8, 8, 8, 8, 8], 157 [gl.RGB10_A2, 10, 10, 10, 2], 158 [gl.RGB10_A2UI, 10, 10, 10, 2], 159 [gl.SRGB8_ALPHA8, 8, 8, 8, 8], 160 [gl.R8I, 8, 0, 0, 0], 161 [gl.R8UI, 8, 0, 0, 0], 162 [gl.R16I, 16, 0, 0, 0], 163 [gl.R16UI, 16, 0, 0, 0], 164 [gl.R32I, 32, 0, 0, 0], 165 [gl.R32UI, 32, 0, 0, 0], 166 [gl.RG8I, 8, 8, 0, 0], 167 [gl.RG8UI, 8, 8, 0, 0], 168 [gl.RG16I, 16, 16, 0, 0], 169 [gl.RG16UI, 16, 16, 0, 0], 170 [gl.RG32I, 32, 32, 0, 0], 171 [gl.RG32UI, 32, 32, 0, 0], 172 [gl.RGBA8I, 8, 8, 8, 8], 173 [gl.RGBA8UI, 8, 8, 8, 8], 174 [gl.RGBA16I, 16, 16, 16, 16], 175 [gl.RGBA16UI, 16, 16, 16, 16], 176 [gl.RGBA32I, 32, 32, 32, 32], 177 [gl.RGBA32UI, 32, 32, 32, 32] 178 ]; 179 180 for (var ndx = 0; ndx < requiredColorFormats.length; ++ndx) { 181 gl.renderbufferStorage(gl.RENDERBUFFER, requiredColorFormats[ndx][0], 128, 128); 182 183 checkRenderbufferComponentSize.bind(this, requiredColorFormats[ndx][1], requiredColorFormats[ndx][2], requiredColorFormats[ndx][3], requiredColorFormats[ndx][4], -1, -1); 184 } 185 gl.deleteRenderbuffer(renderbufferID); 186 }; 187 188 /** 189 * @constructor 190 * @extends {es3fApiCase.ApiCase} 191 * @param {string} name 192 * @param {string} description 193 */ 194 es3fRboStateQueryTests.RboComponentSizeDepthCase = function(name, description) { 195 es3fApiCase.ApiCase.call(this, name, description, gl); 196 }; 197 198 setParentClass(es3fRboStateQueryTests.RboComponentSizeDepthCase, es3fApiCase.ApiCase); 199 200 es3fRboStateQueryTests.RboComponentSizeDepthCase.prototype.test = function() { 201 var renderbufferID = gl.createRenderbuffer(); 202 gl.bindRenderbuffer(gl.RENDERBUFFER, renderbufferID); 203 204 var requiredDepthFormats = [ 205 // format, depth, stencil 206 [gl.DEPTH_COMPONENT16, 16, 0], 207 [gl.DEPTH_COMPONENT24, 24, 0], 208 [gl.DEPTH_COMPONENT32F, 32, 0], 209 [gl.DEPTH24_STENCIL8, 24, 8], 210 [gl.DEPTH32F_STENCIL8, 32, 8] 211 ]; 212 213 for (var ndx = 0; ndx < requiredDepthFormats.length; ++ndx) { 214 gl.renderbufferStorage(gl.RENDERBUFFER, requiredDepthFormats[ndx][0], 128, 128); 215 216 checkRenderbufferComponentSize.bind(this, -1, -1, -1, -1, requiredDepthFormats[ndx][1], requiredDepthFormats[ndx][2]); 217 } 218 219 // STENCIL_INDEX8 is required, in that case sBits >= 8 220 gl.renderbufferStorage(gl.RENDERBUFFER, gl.STENCIL_INDEX8, 128, 128); 221 222 var value = /** @type {number} */ (gl.getRenderbufferParameter(gl.RENDERBUFFER, gl.RENDERBUFFER_STENCIL_SIZE)); 223 this.check(value >= 8, 'Expected greater or equal to 8; got ' + value); 224 225 gl.deleteRenderbuffer(renderbufferID); 226 }; 227 228 /** 229 * @constructor 230 * @extends {es3fApiCase.ApiCase} 231 * @param {string} name 232 * @param {string} description 233 */ 234 es3fRboStateQueryTests.RboSamplesCase = function(name, description) { 235 es3fApiCase.ApiCase.call(this, name, description, gl); 236 }; 237 238 setParentClass(es3fRboStateQueryTests.RboSamplesCase, es3fApiCase.ApiCase); 239 240 es3fRboStateQueryTests.RboSamplesCase.prototype.test = function() { 241 var rnd = new deRandom.Random(0xabcdef); 242 243 var renderbufferID = gl.createRenderbuffer(); 244 gl.bindRenderbuffer(gl.RENDERBUFFER, renderbufferID); 245 246 this.check(glsStateQuery.verifyRenderbuffer(gl.RENDERBUFFER_SAMPLES, 0)); 247 248 var max_samples = /** @type {number} */ (gl.getParameter(gl.MAX_SAMPLES)); 249 250 // 0 samples is a special case 251 gl.renderbufferStorageMultisample(gl.RENDERBUFFER, 0, gl.RGBA8, 128, 128); 252 253 this.check(glsStateQuery.verifyRenderbuffer(gl.RENDERBUFFER_SAMPLES, 0)); 254 255 // test [1, n] samples 256 for (var samples = 1; samples <= max_samples; ++samples) { 257 gl.renderbufferStorageMultisample(gl.RENDERBUFFER, samples, gl.RGBA8, 128, 128); 258 var value = /** @type {number} */ (gl.getRenderbufferParameter(gl.RENDERBUFFER, gl.RENDERBUFFER_SAMPLES)); 259 this.check(value >= samples, 'Expected greater or equal to ' + samples + ' got ' + value); 260 } 261 262 gl.deleteRenderbuffer(renderbufferID); 263 }; 264 265 /** 266 * @constructor 267 * @extends {tcuTestCase.DeqpTest} 268 */ 269 es3fRboStateQueryTests.RboStateQueryTests = function() { 270 tcuTestCase.DeqpTest.call(this, 'rbo', 'Rbo State Query tests'); 271 }; 272 273 es3fRboStateQueryTests.RboStateQueryTests.prototype = Object.create(tcuTestCase.DeqpTest.prototype); 274 es3fRboStateQueryTests.RboStateQueryTests.prototype.constructor = es3fRboStateQueryTests.RboStateQueryTests; 275 276 es3fRboStateQueryTests.RboStateQueryTests.prototype.init = function() { 277 this.addChild(new es3fRboStateQueryTests.RboSizeCase('renderbuffer_size', 'RENDERBUFFER_WIDTH and RENDERBUFFER_HEIGHT')); 278 this.addChild(new es3fRboStateQueryTests.RboInternalFormatCase('renderbuffer_internal_format', 'RENDERBUFFER_INTERNAL_FORMAT')); 279 this.addChild(new es3fRboStateQueryTests.RboComponentSizeColorCase('renderbuffer_component_size_color', 'RENDERBUFFER_x_SIZE')); 280 this.addChild(new es3fRboStateQueryTests.RboComponentSizeDepthCase('renderbuffer_component_size_depth', 'RENDERBUFFER_x_SIZE')); 281 this.addChild(new es3fRboStateQueryTests.RboSamplesCase('renderbuffer_samples', 'RENDERBUFFER_SAMPLES')); 282 }; 283 284 /** 285 * Run test 286 * @param {WebGL2RenderingContext} context 287 */ 288 es3fRboStateQueryTests.run = function(context) { 289 gl = context; 290 //Set up Test Root parameters 291 var state = tcuTestCase.runner; 292 state.setRoot(new es3fRboStateQueryTests.RboStateQueryTests()); 293 294 //Set up name and description of this test series. 295 setCurrentTestName(state.testCases.fullName()); 296 description(state.testCases.getDescription()); 297 298 try { 299 //Run test cases 300 tcuTestCase.runTestCases(); 301 } 302 catch (err) { 303 testFailedOptions('Failed to es3fRboStateQueryTests.run tests', false); 304 tcuTestCase.runner.terminate(); 305 } 306 }; 307 308 });