| /*------------------------------------------------------------------------- |
| * drawElements Quality Program OpenGL ES Utilities |
| * ------------------------------------------------ |
| * |
| * Copyright 2014 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| * |
| */ |
| |
| 'use strict'; |
| goog.provide('framework.referencerenderer.rrVertexAttrib'); |
| goog.require('framework.common.tcuFloat'); |
| goog.require('framework.delibs.debase.deMath'); |
| goog.require('framework.referencerenderer.rrGenericVector'); |
| |
| goog.scope(function() { |
| |
| var rrVertexAttrib = framework.referencerenderer.rrVertexAttrib; |
| var deMath = framework.delibs.debase.deMath; |
| var tcuFloat = framework.common.tcuFloat; |
| var rrGenericVector = framework.referencerenderer.rrGenericVector; |
| |
| var DE_ASSERT = function(x) { |
| if (!x) |
| throw new Error('Assert failed'); |
| }; |
| |
| /** |
| * rrVertexAttrib.NormalOrder |
| * @enum |
| */ |
| rrVertexAttrib.NormalOrder = { |
| T0: 0, |
| T1: 1, |
| T2: 2, |
| T3: 3 |
| }; |
| |
| /** |
| * rrVertexAttrib.BGRAOrder |
| * @enum |
| */ |
| rrVertexAttrib.BGRAOrder = { |
| T0: 2, |
| T1: 1, |
| T2: 0, |
| T3: 3 |
| }; |
| |
| /** |
| * rrVertexAttrib.VertexAttribType enum |
| * @enum |
| */ |
| rrVertexAttrib.VertexAttribType = { |
| // Can only be rrVertexAttrib.read as floats |
| FLOAT: 0, |
| HALF: 1, |
| FIXED: 2, |
| DOUBLE: 3, |
| |
| // Can only be rrVertexAttrib.read as floats, will be normalized |
| NONPURE_UNORM8: 4, |
| NONPURE_UNORM16: 5, |
| NONPURE_UNORM32: 6, |
| NONPURE_UNORM_2_10_10_10_REV: 7, //!< Packed format, only size = 4 is allowed |
| |
| // Clamped formats, GLES3-style conversion: max{c / (2^(b-1) - 1), -1 } |
| NONPURE_SNORM8_CLAMP: 8, |
| NONPURE_SNORM16_CLAMP: 9, |
| NONPURE_SNORM32_CLAMP: 10, |
| NONPURE_SNORM_2_10_10_10_REV_CLAMP: 11, //!< Packed format, only size = 4 is allowed |
| |
| // Scaled formats, GLES2-style conversion: (2c + 1) / (2^b - 1) |
| NONPURE_SNORM8_SCALE: 12, |
| NONPURE_SNORM16_SCALE: 13, |
| NONPURE_SNORM32_SCALE: 14, |
| NONPURE_SNORM_2_10_10_10_REV_SCALE: 15, //!< Packed format, only size = 4 is allowed |
| |
| // can only be rrVertexAttrib.read as float, will not be normalized |
| NONPURE_UINT8: 16, |
| NONPURE_UINT16: 17, |
| NONPURE_UINT32: 18, |
| |
| NONPURE_INT8: 19, |
| NONPURE_INT16: 20, |
| NONPURE_INT32: 21, |
| |
| NONPURE_UINT_2_10_10_10_REV: 22, //!< Packed format, only size = 4 is allowed |
| NONPURE_INT_2_10_10_10_REV: 23, //!< Packed format, only size = 4 is allowed |
| |
| // can only be rrVertexAttrib.read as integers |
| PURE_UINT8: 24, |
| PURE_UINT16: 25, |
| PURE_UINT32: 26, |
| |
| PURE_INT8: 27, |
| PURE_INT16: 28, |
| PURE_INT32: 29, |
| |
| // reordered formats of gl.ARB_vertex_array_bgra |
| NONPURE_UNORM8_BGRA: 30, |
| NONPURE_UNORM_2_10_10_10_REV_BGRA: 31, |
| NONPURE_SNORM_2_10_10_10_REV_CLAMP_BGRA: 32, |
| NONPURE_SNORM_2_10_10_10_REV_SCALE_BGRA: 33, |
| |
| // can be rrVertexAttrib.read as anything |
| DONT_CARE: 34 //!< Do not enforce type checking when reading GENERIC attribute. Used for current client side attributes. |
| }; |
| |
| /** |
| * rrVertexAttrib.VertexAttrib class |
| * @constructor |
| */ |
| rrVertexAttrib.VertexAttrib = function() { |
| /** @type {rrVertexAttrib.VertexAttribType} */ this.type = rrVertexAttrib.VertexAttribType.FLOAT; |
| /** @type {number} */ this.size = 0; |
| /** @type {number} */ this.stride = 0; |
| /** @type {number} */ this.instanceDivisor = 0; |
| /** @type {number} */ this.offset = 0; //Added this property to compensate functionality (not in original dEQP). |
| /** @type {ArrayBuffer} */ this.pointer = null; |
| /** @type {Array<number>|rrGenericVector.GenericVec4} */ this.generic; //!< Generic attribute, used if pointer is null. |
| }; |
| |
| /** |
| * @param {rrVertexAttrib.VertexAttribType} type |
| * @return {number} |
| */ |
| rrVertexAttrib.getComponentSize = function(type) { |
| switch (type) { |
| case rrVertexAttrib.VertexAttribType.FLOAT: return 4; |
| case rrVertexAttrib.VertexAttribType.HALF: return 2; |
| case rrVertexAttrib.VertexAttribType.FIXED: return 4; |
| case rrVertexAttrib.VertexAttribType.DOUBLE: return 8; //sizeof(double); |
| case rrVertexAttrib.VertexAttribType.NONPURE_UNORM8: return 1; |
| case rrVertexAttrib.VertexAttribType.NONPURE_UNORM16: return 2; |
| case rrVertexAttrib.VertexAttribType.NONPURE_UNORM32: return 4; |
| case rrVertexAttrib.VertexAttribType.NONPURE_UNORM_2_10_10_10_REV: return 1; //sizeof(deUint32)/4; |
| case rrVertexAttrib.VertexAttribType.NONPURE_SNORM8_CLAMP: return 1; |
| case rrVertexAttrib.VertexAttribType.NONPURE_SNORM16_CLAMP: return 2; |
| case rrVertexAttrib.VertexAttribType.NONPURE_SNORM32_CLAMP: return 4; |
| case rrVertexAttrib.VertexAttribType.NONPURE_SNORM_2_10_10_10_REV_CLAMP: return 1; //sizeof(deUint32)/4; |
| case rrVertexAttrib.VertexAttribType.NONPURE_SNORM8_SCALE: return 1; |
| case rrVertexAttrib.VertexAttribType.NONPURE_SNORM16_SCALE: return 2; |
| case rrVertexAttrib.VertexAttribType.NONPURE_SNORM32_SCALE: return 4; |
| case rrVertexAttrib.VertexAttribType.NONPURE_SNORM_2_10_10_10_REV_SCALE: return 1; //sizeof(deUint32)/4; |
| case rrVertexAttrib.VertexAttribType.NONPURE_UINT8: return 1; |
| case rrVertexAttrib.VertexAttribType.NONPURE_UINT16: return 2; |
| case rrVertexAttrib.VertexAttribType.NONPURE_UINT32: return 4; |
| case rrVertexAttrib.VertexAttribType.NONPURE_INT8: return 1; |
| case rrVertexAttrib.VertexAttribType.NONPURE_INT16: return 2; |
| case rrVertexAttrib.VertexAttribType.NONPURE_INT32: return 4; |
| case rrVertexAttrib.VertexAttribType.NONPURE_UINT_2_10_10_10_REV: return 1; //sizeof(deUint32)/4; |
| case rrVertexAttrib.VertexAttribType.NONPURE_INT_2_10_10_10_REV: return 1; //sizeof(deUint32)/4; |
| case rrVertexAttrib.VertexAttribType.PURE_UINT8: return 1; |
| case rrVertexAttrib.VertexAttribType.PURE_UINT16: return 2; |
| case rrVertexAttrib.VertexAttribType.PURE_UINT32: return 4; |
| case rrVertexAttrib.VertexAttribType.PURE_INT8: return 1; |
| case rrVertexAttrib.VertexAttribType.PURE_INT16: return 2; |
| case rrVertexAttrib.VertexAttribType.PURE_INT32: return 4; |
| case rrVertexAttrib.VertexAttribType.NONPURE_UNORM8_BGRA: return 1; |
| case rrVertexAttrib.VertexAttribType.NONPURE_UNORM_2_10_10_10_REV_BGRA: return 1; //sizeof(deUint32)/4; |
| case rrVertexAttrib.VertexAttribType.NONPURE_SNORM_2_10_10_10_REV_CLAMP_BGRA: return 1; //sizeof(deUint32)/4; |
| case rrVertexAttrib.VertexAttribType.NONPURE_SNORM_2_10_10_10_REV_SCALE_BGRA: return 1; //sizeof(deUint32)/4; |
| default: |
| throw new Error('rrVertexAttrib.getComponentSize - Invalid type'); |
| } |
| }; |
| |
| /** |
| * rrVertexAttrib.isValidVertexAttrib function |
| * @param {rrVertexAttrib.VertexAttrib} vertexAttrib |
| * @return {boolean} |
| */ |
| rrVertexAttrib.isValidVertexAttrib = function(vertexAttrib) { |
| // Trivial range checks. |
| if (!deMath.deInBounds32(vertexAttrib.type, 0, Object.keys(rrVertexAttrib.VertexAttribType).length) || |
| !deMath.deInRange32(vertexAttrib.size, 0, 4) || |
| vertexAttrib.instanceDivisor < 0) |
| return false; |
| |
| // Generic attributes |
| if (!vertexAttrib.pointer && vertexAttrib.type != rrVertexAttrib.VertexAttribType.DONT_CARE) |
| return false; |
| |
| // Packed formats |
| if ((vertexAttrib.type == rrVertexAttrib.VertexAttribType.NONPURE_INT_2_10_10_10_REV || |
| vertexAttrib.type == rrVertexAttrib.VertexAttribType.NONPURE_UINT_2_10_10_10_REV || |
| vertexAttrib.type == rrVertexAttrib.VertexAttribType.NONPURE_UNORM_2_10_10_10_REV || |
| vertexAttrib.type == rrVertexAttrib.VertexAttribType.NONPURE_SNORM_2_10_10_10_REV_CLAMP || |
| vertexAttrib.type == rrVertexAttrib.VertexAttribType.NONPURE_SNORM_2_10_10_10_REV_SCALE || |
| vertexAttrib.type == rrVertexAttrib.VertexAttribType.NONPURE_UNORM_2_10_10_10_REV_BGRA || |
| vertexAttrib.type == rrVertexAttrib.VertexAttribType.NONPURE_SNORM_2_10_10_10_REV_CLAMP_BGRA || |
| vertexAttrib.type == rrVertexAttrib.VertexAttribType.NONPURE_SNORM_2_10_10_10_REV_SCALE_BGRA) && |
| vertexAttrib.size != 4) |
| return false; |
| |
| return true; |
| }; |
| |
| /** |
| * rrVertexAttrib.readVertexAttrib function |
| * @param {rrVertexAttrib.VertexAttrib} vertexAttrib |
| * @param {number} instanceNdx |
| * @param {number} vertexNdx |
| * @param {rrGenericVector.GenericVecType} genericType |
| * @return {goog.NumberArray} |
| */ |
| rrVertexAttrib.readVertexAttrib = function(vertexAttrib, instanceNdx, vertexNdx, genericType) { |
| DE_ASSERT(rrVertexAttrib.isValidVertexAttrib(vertexAttrib)); |
| /** @type {goog.NumberArray} */ var dst; |
| |
| var arrayType = null; |
| switch (genericType) { |
| case rrGenericVector.GenericVecType.INT32: |
| arrayType = Int32Array; |
| break; |
| case rrGenericVector.GenericVecType.UINT32: |
| arrayType = Uint32Array; |
| break; |
| case rrGenericVector.GenericVecType.FLOAT: |
| arrayType = Float32Array; |
| break; |
| } |
| |
| if (vertexAttrib.pointer) { |
| /** @type {number} */ var elementNdx = (vertexAttrib.instanceDivisor != 0) ? (instanceNdx / vertexAttrib.instanceDivisor) : vertexNdx; |
| /** @type {number} */ var compSize = rrVertexAttrib.getComponentSize(vertexAttrib.type); |
| /** @type {number} */ var stride = (vertexAttrib.stride != 0) ? (vertexAttrib.stride) : (vertexAttrib.size * compSize); |
| /** @type {number} */ var byteOffset = vertexAttrib.offset + (elementNdx * stride); |
| |
| dst = [0, 0, 0, 1]; // defaults |
| |
| if (arrayType != null) { |
| dst = new arrayType(dst); |
| } |
| |
| rrVertexAttrib.read(dst, vertexAttrib.type, vertexAttrib.size, new Uint8Array(vertexAttrib.pointer, byteOffset)); |
| } else { |
| dst = new arrayType(/** @type {Array<number>} */ vertexAttrib.generic.data); |
| } |
| |
| return dst; |
| }; |
| |
| /** |
| * rrVertexAttrib.readHalf |
| * @param {goog.NumberArray} dst |
| * @param {number} size |
| * @param {Uint8Array} ptr |
| */ |
| rrVertexAttrib.readHalf = function(dst, size, ptr) { |
| var arraysize16 = 2; //2 bytes |
| |
| var ptrclone = new Uint8Array(ptr.subarray(0, size * arraysize16)); //Small buffer copy (max. 8 bytes) |
| var aligned = new Uint16Array(ptrclone.buffer); |
| |
| //Reinterpret aligned's values into the dst vector. |
| dst[0] = tcuFloat.newFloat32From16(aligned[0]).getValue(); |
| if (size >= 2) dst[1] = tcuFloat.newFloat32From16(aligned[1]).getValue(); |
| if (size >= 3) dst[2] = tcuFloat.newFloat32From16(aligned[2]).getValue(); |
| if (size >= 4) dst[3] = tcuFloat.newFloat32From16(aligned[3]).getValue(); |
| }; |
| |
| /** |
| * rrVertexAttrib.readFixed |
| * @param {goog.NumberArray} dst |
| * @param {number} size |
| * @param {Uint8Array} ptr |
| */ |
| /*rrVertexAttrib.readFixed = function(dst, size, ptr) { |
| var arraysize32 = 4; //4 bytes |
| |
| //Reinterpret ptr as a uint16 array, |
| //assuming original ptr is 8-bits per element |
| var aligned = new Int32Array(ptr.buffer).subarray( |
| ptr.byteOffset / arraysize32, |
| (ptr.byteOffset + ptr.byteLength) / arraysize32); |
| |
| //Reinterpret aligned's values into the dst vector. |
| dst[0] = aligned[0] / (1 << 16); |
| if (size >= 2) dst[1] = aligned[1] / (1 << 16); |
| if (size >= 3) dst[2] = aligned[2] / (1 << 16); |
| if (size >= 4) dst[3] = aligned[3] / (1 << 16); |
| };*/ |
| |
| /** |
| * TODO: Check 64 bit numbers are handled ok |
| * rrVertexAttrib.readDouble |
| * @param {goog.NumberArray} dst |
| * @param {number} size |
| * @param {Uint8Array} ptr |
| */ |
| /*rrVertexAttrib.readDouble = function(dst, size, ptr) { |
| var arraysize64 = 8; //8 bytes |
| |
| //Reinterpret 'ptr' into 'aligned' as a float64 array, |
| //assuming original ptr is 8-bits per element. |
| var aligned = new Float64Array(ptr.buffer).subarray( |
| ptr.byteOffset / arraysize64, |
| (ptr.byteOffset + ptr.byteLength) / arraysize64); |
| |
| //Reinterpret aligned's values into the dst vector. |
| dst[0] = aligned[0]; |
| if (size >= 2) dst[1] = aligned[1]; |
| if (size >= 3) dst[2] = aligned[2]; |
| if (size >= 4) dst[3] = aligned[3]; |
| };*/ |
| |
| /** |
| * extendSign |
| * @param {number} integerLen |
| * @param {number} integer_ (deUint32) |
| * @return {number} (deInt32) |
| */ |
| rrVertexAttrib.extendSign = function(integerLen, integer_) { |
| return new Int32Array([ |
| deMath.binaryOp( |
| 0 - |
| deMath.shiftLeft( |
| deMath.binaryOp( |
| integer_, |
| deMath.shiftLeft( |
| 1, |
| (integerLen - 1) |
| ), |
| deMath.BinaryOp.AND |
| ), |
| 1 |
| ) , |
| |
| integer_, |
| deMath.BinaryOp.OR |
| ) |
| ])[0]; |
| }; |
| |
| /** |
| * rrVertexAttrib.readUint2101010Rev |
| * @param {goog.NumberArray} dst |
| * @param {number} size |
| * @param {Uint8Array} ptr |
| */ |
| rrVertexAttrib.readUint2101010Rev = function(dst, size, ptr) { |
| var arraysize32 = 4; //4 bytes |
| |
| var ptrclone = new Uint8Array(ptr.subarray(0, size * arraysize32)); //Small buffer copy (max. 16 bytes) |
| var aligned = new Uint32Array(ptrclone.buffer)[0]; |
| |
| dst[0] = deMath.binaryOp(deMath.shiftRight(aligned, 0), deMath.shiftLeft(1, 10) - 1, deMath.BinaryOp.AND); |
| if (size >= 2) dst[1] = deMath.binaryOp(deMath.shiftRight(aligned, 10), deMath.shiftLeft(1, 10) - 1, deMath.BinaryOp.AND); |
| if (size >= 3) dst[2] = deMath.binaryOp(deMath.shiftRight(aligned, 20), deMath.shiftLeft(1, 10) - 1, deMath.BinaryOp.AND); |
| if (size >= 4) dst[3] = deMath.binaryOp(deMath.shiftRight(aligned, 30), deMath.shiftLeft(1, 2) - 1, deMath.BinaryOp.AND); |
| }; |
| |
| /** |
| * rrVertexAttrib.readInt2101010Rev |
| * @param {goog.NumberArray} dst |
| * @param {number} size |
| * @param {Uint8Array} ptr |
| */ |
| rrVertexAttrib.readInt2101010Rev = function(dst, size, ptr) { |
| var arraysize32 = 4; //4 bytes |
| |
| var ptrclone = new Uint8Array(ptr.subarray(0, size * arraysize32)); //Small buffer copy (max. 16 bytes) |
| var aligned = new Uint32Array(ptrclone.buffer)[0]; |
| |
| dst[0] = rrVertexAttrib.extendSign(10, deMath.binaryOp(deMath.shiftRight(aligned, 0), deMath.shiftLeft(1, 10) - 1, deMath.BinaryOp.AND)); |
| if (size >= 2) dst[1] = rrVertexAttrib.extendSign(10, deMath.binaryOp(deMath.shiftRight(aligned, 10), deMath.shiftLeft(1, 10) - 1, deMath.BinaryOp.AND)); |
| if (size >= 3) dst[2] = rrVertexAttrib.extendSign(10, deMath.binaryOp(deMath.shiftRight(aligned, 20), deMath.shiftLeft(1, 10) - 1, deMath.BinaryOp.AND)); |
| if (size >= 4) dst[3] = rrVertexAttrib.extendSign(2, deMath.binaryOp(deMath.shiftRight(aligned, 30), deMath.shiftLeft(1, 2) - 1, deMath.BinaryOp.AND)); |
| }; |
| |
| /** |
| * rrVertexAttrib.readUnorm2101010RevOrder |
| * @param {goog.NumberArray} dst |
| * @param {number} size |
| * @param {Uint8Array} ptr |
| * @param {Object<rrVertexAttrib.NormalOrder|rrVertexAttrib.BGRAOrder>} order |
| */ |
| rrVertexAttrib.readUnorm2101010RevOrder = function(dst, size, ptr, order) { |
| var arraysize32 = 4; //4 bytes |
| |
| //Left shift within 32-bit range as 32-bit int. |
| var range10 = new Uint32Array([deMath.shiftLeft(1, 10) - 1])[0]; |
| var range2 = new Uint32Array([deMath.shiftLeft(1, 2) - 1])[0]; |
| |
| var ptrclone = new Uint8Array(ptr.subarray(0, size * arraysize32)); //Small buffer copy (max. 16 bytes) |
| var aligned = new Uint32Array(ptrclone.buffer)[0]; |
| |
| dst[order.T0] = deMath.binaryOp(deMath.shiftRight(aligned, 0), deMath.shiftLeft(1, 10) - 1, deMath.BinaryOp.AND) / range10; |
| if (size >= 2) dst[order.T1] = deMath.binaryOp(deMath.shiftRight(aligned, 10), deMath.shiftLeft(1, 10) - 1, deMath.BinaryOp.AND) / range10; |
| if (size >= 3) dst[order.T2] = deMath.binaryOp(deMath.shiftRight(aligned, 20), deMath.shiftLeft(1, 10) - 1, deMath.BinaryOp.AND) / range10; |
| if (size >= 4) dst[order.T3] = deMath.binaryOp(deMath.shiftRight(aligned, 30), deMath.shiftLeft(1, 2) - 1, deMath.BinaryOp.AND) / range2; |
| }; |
| |
| /** |
| * rrVertexAttrib.readSnorm2101010RevClampOrder |
| * @param {goog.NumberArray} dst |
| * @param {number} size |
| * @param {Uint8Array} ptr |
| * @param {Object<rrVertexAttrib.NormalOrder|rrVertexAttrib.BGRAOrder>} order |
| */ |
| rrVertexAttrib.readSnorm2101010RevClampOrder = function(dst, size, ptr, order) { |
| var arraysize32 = 4; //4 bytes |
| |
| //Left shift within 32-bit range as 32-bit int. |
| var range10 = new Uint32Array([deMath.shiftLeft(1, 10 - 1) - 1])[0]; |
| var range2 = new Uint32Array([deMath.shiftLeft(1, 2 - 1) - 1])[0]; |
| |
| var ptrclone = new Uint8Array(ptr.subarray(0, size * arraysize32)); //Small buffer copy (max. 16 bytes) |
| var aligned = new Uint32Array(ptrclone.buffer)[0]; |
| |
| dst[order.T0] = Math.max(-1.0, new Float32Array([rrVertexAttrib.extendSign(10, deMath.binaryOp(deMath.shiftRight(aligned, 0), deMath.shiftLeft(1, 10) - 1, deMath.BinaryOp.AND))])[0] / range10); |
| if (size >= 2) dst[order.T1] = Math.max(-1.0, new Float32Array([rrVertexAttrib.extendSign(10, deMath.binaryOp(deMath.shiftRight(aligned, 10), deMath.shiftLeft(1, 10) - 1, deMath.BinaryOp.AND))])[0] / range10); |
| if (size >= 3) dst[order.T2] = Math.max(-1.0, new Float32Array([rrVertexAttrib.extendSign(10, deMath.binaryOp(deMath.shiftRight(aligned, 20), deMath.shiftLeft(1, 10) - 1, deMath.BinaryOp.AND))])[0] / range10); |
| if (size >= 4) dst[order.T3] = Math.max(-1.0, new Float32Array([rrVertexAttrib.extendSign(2, deMath.binaryOp(deMath.shiftRight(aligned, 30), deMath.shiftLeft(1, 2) - 1, deMath.BinaryOp.AND))])[0] / range2); |
| }; |
| |
| /** |
| * rrVertexAttrib.readSnorm2101010RevScaleOrder |
| * @param {goog.NumberArray} dst |
| * @param {number} size |
| * @param {Uint8Array} ptr |
| * @param {Object<rrVertexAttrib.NormalOrder|rrVertexAttrib.BGRAOrder>} order |
| */ |
| rrVertexAttrib.readSnorm2101010RevScaleOrder = function(dst, size, ptr, order) { |
| var arraysize32 = 4; //4 bytes |
| |
| //Left shift within 32-bit range as 32-bit int. |
| var range10 = new Uint32Array([deMath.shiftLeft(1, 10) - 1])[0]; |
| var range2 = new Uint32Array([deMath.shiftLeft(1, 2) - 1])[0]; |
| |
| var ptrclone = new Uint8Array(ptr.subarray(0, size * arraysize32)); //Small buffer copy (max. 16 bytes) |
| var aligned = new Uint32Array(ptrclone.buffer)[0]; |
| |
| dst[order.T0] = new Float32Array([rrVertexAttrib.extendSign(10, deMath.binaryOp(deMath.shiftRight(aligned, 0), deMath.shiftLeft(1, 10) - 1, deMath.BinaryOp.AND)) * 2.0 + 1.0])[0] / range10; |
| if (size >= 2) dst[order.T1] = new Float32Array([rrVertexAttrib.extendSign(10, deMath.binaryOp(deMath.shiftRight(aligned, 10), deMath.shiftLeft(1, 10) - 1, deMath.BinaryOp.AND)) * 2.0 + 1.0])[0] / range10; |
| if (size >= 3) dst[order.T2] = new Float32Array([rrVertexAttrib.extendSign(10, deMath.binaryOp(deMath.shiftRight(aligned, 20), deMath.shiftLeft(1, 10) - 1, deMath.BinaryOp.AND)) * 2.0 + 1.0])[0] / range10; |
| if (size >= 4) dst[order.T3] = new Float32Array([rrVertexAttrib.extendSign(2, deMath.binaryOp(deMath.shiftRight(aligned, 30), deMath.shiftLeft(1, 2) - 1, deMath.BinaryOp.AND)) * 2.0 + 1.0])[0] / range2; |
| }; |
| |
| /** |
| * rrVertexAttrib.readUnormOrder |
| * @param {goog.NumberArray} dst |
| * @param {number} size |
| * @param {Uint8Array} ptr |
| * @param {Object<rrVertexAttrib.NormalOrder|rrVertexAttrib.BGRAOrder>} order |
| * @param readAsTypeArray |
| */ |
| rrVertexAttrib.readUnormOrder = function(dst, size, ptr, order, readAsTypeArray) { |
| var arrayelementsize = readAsTypeArray.BYTES_PER_ELEMENT; |
| |
| //Left shift within 32-bit range as 32-bit float. |
| var range = new Float32Array([deMath.shiftLeft(1, arrayelementsize * 8) - 1])[0]; |
| |
| var ptrclone = new Uint8Array(ptr.subarray(0, size * arrayelementsize)); //Small buffer copy (max. 16 bytes) |
| var aligned = new readAsTypeArray(ptrclone.buffer); |
| |
| //Reinterpret aligned's values into the dst vector. |
| dst[order.T0] = aligned[0] / range; |
| if (size >= 2) dst[order.T1] = aligned[1] / range; |
| if (size >= 3) dst[order.T2] = aligned[2] / range; |
| if (size >= 4) dst[order.T3] = aligned[3] / range; |
| }; |
| |
| /** |
| * rrVertexAttrib.readSnormClamp |
| * @param {goog.NumberArray} dst |
| * @param {number} size |
| * @param {Uint8Array} ptr |
| * @param {function(new:ArrayBufferView,(Array<number>|ArrayBuffer|ArrayBufferView|null|number), number=, number=)} readAsTypeArray |
| */ |
| rrVertexAttrib.readSnormClamp = function(dst, size, ptr, readAsTypeArray) { |
| var arrayelementsize = readAsTypeArray.BYTES_PER_ELEMENT; |
| |
| //Left shift within 32-bit range as 32-bit float. |
| var range = new Float32Array([deMath.shiftLeft(1, arrayelementsize * 8 - 1) - 1])[0]; |
| |
| var ptrclone = new Uint8Array(ptr.subarray(0, size * arrayelementsize)); //Small buffer copy (max. 16 bytes) |
| var aligned = new readAsTypeArray(ptrclone.buffer); |
| |
| //Reinterpret aligned's values into the dst vector. |
| dst[0] = Math.max(-1, aligned[0] / range); |
| if (size >= 2) dst[1] = Math.max(-1, aligned[1] / range); |
| if (size >= 3) dst[2] = Math.max(-1, aligned[2] / range); |
| if (size >= 4) dst[3] = Math.max(-1, aligned[3] / range); |
| }; |
| |
| /** |
| * rrVertexAttrib.readOrder |
| * @param {goog.NumberArray} dst |
| * @param {number} size |
| * @param {Uint8Array} ptr |
| * @param {Object<rrVertexAttrib.NormalOrder|rrVertexAttrib.BGRAOrder>} order NormalOrder or BGRAOrder |
| * @param readAsTypeArray Typed Array type |
| */ |
| rrVertexAttrib.readOrder = function(dst, size, ptr, order, readAsTypeArray) { |
| var arrayelementsize = readAsTypeArray.BYTES_PER_ELEMENT; |
| |
| var ptrclone = new Uint8Array(ptr.subarray(0, size * arrayelementsize)); //Small buffer copy (max. 16 bytes) |
| var aligned = new readAsTypeArray(ptrclone.buffer); |
| |
| //Reinterpret aligned's values into the dst vector. |
| //(automatic in JS typed arrays). |
| dst[order.T0] = aligned[0]; |
| if (size >= 2) dst[order.T1] = aligned[1]; |
| if (size >= 3) dst[order.T2] = aligned[2]; |
| if (size >= 4) dst[order.T3] = aligned[3]; |
| }; |
| |
| /** |
| * TODO: Implement readSNormScale. |
| * @param {goog.NumberArray} dst |
| * @param {rrVertexAttrib.VertexAttribType} type |
| * @param {number} size |
| * @param {Uint8Array} ptr |
| */ |
| rrVertexAttrib.read = function(dst, type, size, ptr) { |
| var order; |
| |
| switch (type) { |
| case rrVertexAttrib.VertexAttribType.FLOAT: |
| rrVertexAttrib.readOrder(dst, size, ptr, rrVertexAttrib.NormalOrder, Float32Array); |
| break; |
| case rrVertexAttrib.VertexAttribType.HALF: |
| rrVertexAttrib.readHalf(dst, size, ptr); |
| break; |
| /*case rrVertexAttrib.VertexAttribType.FIXED: |
| rrVertexAttrib.readFixed(dst, size, ptr); |
| break; |
| case rrVertexAttrib.VertexAttribType.DOUBLE: |
| rrVertexAttrib.readDouble(dst, size, ptr); |
| break;*/ |
| case rrVertexAttrib.VertexAttribType.NONPURE_UNORM8: |
| rrVertexAttrib.readUnormOrder(dst, size, ptr, rrVertexAttrib.NormalOrder, Uint8Array); |
| break; |
| case rrVertexAttrib.VertexAttribType.NONPURE_UNORM16: |
| rrVertexAttrib.readUnormOrder(dst, size, ptr, rrVertexAttrib.NormalOrder, Uint16Array); |
| break; |
| case rrVertexAttrib.VertexAttribType.NONPURE_UNORM32: |
| rrVertexAttrib.readUnormOrder(dst, size, ptr, rrVertexAttrib.NormalOrder, Uint32Array); |
| break; |
| case rrVertexAttrib.VertexAttribType.NONPURE_UNORM_2_10_10_10_REV: |
| rrVertexAttrib.readUnorm2101010RevOrder(dst, size, ptr, rrVertexAttrib.NormalOrder); |
| break; |
| case rrVertexAttrib.VertexAttribType.NONPURE_SNORM8_CLAMP: //Int8 |
| rrVertexAttrib.readSnormClamp(dst, size, ptr, Int8Array); |
| break; |
| case rrVertexAttrib.VertexAttribType.NONPURE_SNORM16_CLAMP: //Int16 |
| rrVertexAttrib.readSnormClamp(dst, size, ptr, Int16Array); |
| break; |
| case rrVertexAttrib.VertexAttribType.NONPURE_SNORM32_CLAMP: //Int32 |
| rrVertexAttrib.readSnormClamp(dst, size, ptr, Int32Array); |
| break; |
| case rrVertexAttrib.VertexAttribType.NONPURE_SNORM_2_10_10_10_REV_CLAMP: |
| rrVertexAttrib.readSnorm2101010RevClampOrder(dst, size, ptr, rrVertexAttrib.NormalOrder); |
| break; |
| /*case rrVertexAttrib.VertexAttribType.NONPURE_SNORM8_SCALE: //Int8 |
| rrVertexAttrib.readSnormScale(dst, size, ptr, Int8Array); |
| break; |
| case rrVertexAttrib.VertexAttribType.NONPURE_SNORM16_SCALE: //Int16 |
| rrVertexAttrib.readSnormScale(dst, size, ptr, Int16Array); |
| break; |
| case rrVertexAttrib.VertexAttribType.NONPURE_SNORM32_SCALE: //Int32 |
| rrVertexAttrib.readSnormScale(dst, size, ptr, Int32Array); |
| break;*/ |
| case rrVertexAttrib.VertexAttribType.NONPURE_SNORM_2_10_10_10_REV_SCALE: |
| rrVertexAttrib.readSnorm2101010RevScaleOrder(dst, size, ptr, rrVertexAttrib.NormalOrder); |
| break; |
| case rrVertexAttrib.VertexAttribType.NONPURE_UINT_2_10_10_10_REV: |
| rrVertexAttrib.readUint2101010Rev(dst, size, ptr); |
| break; |
| case rrVertexAttrib.VertexAttribType.NONPURE_INT_2_10_10_10_REV: |
| rrVertexAttrib.readInt2101010Rev(dst, size, ptr); |
| break; |
| case rrVertexAttrib.VertexAttribType.NONPURE_UNORM8_BGRA: |
| rrVertexAttrib.readUnormOrder(dst, size, ptr, rrVertexAttrib.BGRAOrder, Uint8Array); |
| break; |
| case rrVertexAttrib.VertexAttribType.NONPURE_UNORM_2_10_10_10_REV_BGRA: |
| rrVertexAttrib.readUnorm2101010RevOrder(dst, size, ptr, rrVertexAttrib.BGRAOrder); |
| break; |
| case rrVertexAttrib.VertexAttribType.NONPURE_SNORM_2_10_10_10_REV_CLAMP_BGRA: |
| rrVertexAttrib.readSnorm2101010RevClampOrder(dst, size, ptr, rrVertexAttrib.BGRAOrder); |
| break; |
| case rrVertexAttrib.VertexAttribType.NONPURE_SNORM_2_10_10_10_REV_SCALE_BGRA: |
| rrVertexAttrib.readSnorm2101010RevScaleOrder(dst, size, ptr, rrVertexAttrib.BGRAOrder); |
| break; |
| case rrVertexAttrib.VertexAttribType.NONPURE_UINT8: |
| rrVertexAttrib.readOrder(dst, size, ptr, rrVertexAttrib.NormalOrder, Uint8Array); |
| break; |
| case rrVertexAttrib.VertexAttribType.NONPURE_UINT16: |
| rrVertexAttrib.readOrder(dst, size, ptr, rrVertexAttrib.NormalOrder, Uint16Array); |
| break; |
| case rrVertexAttrib.VertexAttribType.NONPURE_UINT32: |
| rrVertexAttrib.readOrder(dst, size, ptr, rrVertexAttrib.NormalOrder, Uint32Array); |
| break; |
| case rrVertexAttrib.VertexAttribType.NONPURE_INT8: |
| rrVertexAttrib.readOrder(dst, size, ptr, rrVertexAttrib.NormalOrder, Int8Array); |
| break; |
| case rrVertexAttrib.VertexAttribType.NONPURE_INT16: |
| rrVertexAttrib.readOrder(dst, size, ptr, rrVertexAttrib.NormalOrder, Int16Array); |
| break; |
| case rrVertexAttrib.VertexAttribType.NONPURE_INT32: |
| rrVertexAttrib.readOrder(dst, size, ptr, rrVertexAttrib.NormalOrder, Int32Array); |
| break; |
| case rrVertexAttrib.VertexAttribType.PURE_UINT8: |
| rrVertexAttrib.readOrder(dst, size, ptr, rrVertexAttrib.NormalOrder, Uint8Array); |
| break; |
| case rrVertexAttrib.VertexAttribType.PURE_UINT16: |
| rrVertexAttrib.readOrder(dst, size, ptr, rrVertexAttrib.NormalOrder, Uint16Array); |
| break; |
| case rrVertexAttrib.VertexAttribType.PURE_UINT32: |
| rrVertexAttrib.readOrder(dst, size, ptr, rrVertexAttrib.NormalOrder, Uint32Array); |
| break; |
| case rrVertexAttrib.VertexAttribType.PURE_INT8: |
| rrVertexAttrib.readOrder(dst, size, ptr, rrVertexAttrib.NormalOrder, Int8Array); |
| break; |
| case rrVertexAttrib.VertexAttribType.PURE_INT16: |
| rrVertexAttrib.readOrder(dst, size, ptr, rrVertexAttrib.NormalOrder, Int16Array); |
| break; |
| case rrVertexAttrib.VertexAttribType.PURE_INT32: |
| rrVertexAttrib.readOrder(dst, size, ptr, rrVertexAttrib.NormalOrder, Int32Array); |
| break; |
| |
| default: |
| throw new Error('rrVertexAttrib.read - Invalid type'); |
| } |
| }; |
| |
| }); |