/*------------------------------------------------------------------------- * 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.rrMultisamplePixelBufferAccess'); goog.require('framework.common.tcuTexture'); goog.require('framework.common.tcuTextureUtil'); goog.require('framework.delibs.debase.deMath'); goog.scope(function() { var rrMultisamplePixelBufferAccess = framework.referencerenderer.rrMultisamplePixelBufferAccess; var tcuTexture = framework.common.tcuTexture; var deMath = framework.delibs.debase.deMath; var tcuTextureUtil = framework.common.tcuTextureUtil; var DE_ASSERT = function(x) { if (!x) throw new Error('Assert failed'); }; /** * \brief Read-write pixel data access to multisampled buffers. * * Multisampled data access follows the multisampled indexing convention. * * Prevents accidental usage of non-multisampled buffer as multisampled * with PixelBufferAccess. * @constructor * @param {tcuTexture.PixelBufferAccess=} rawAccess */ rrMultisamplePixelBufferAccess.MultisamplePixelBufferAccess = function(rawAccess) { this.m_access = rawAccess || new tcuTexture.PixelBufferAccess({ width: 0, height: 0}); }; /** * @return {tcuTexture.PixelBufferAccess} */ rrMultisamplePixelBufferAccess.MultisamplePixelBufferAccess.prototype.raw = function() { return this.m_access; }; /** * @return {boolean} */ rrMultisamplePixelBufferAccess.MultisamplePixelBufferAccess.prototype.isEmpty = function() { return this.m_access.isEmpty(); }; /** * @return {number} */ rrMultisamplePixelBufferAccess.MultisamplePixelBufferAccess.prototype.getNumSamples = function() { return this.raw().getWidth(); }; /** * @return {tcuTexture.PixelBufferAccess} */ rrMultisamplePixelBufferAccess.MultisamplePixelBufferAccess.prototype.toSinglesampleAccess = function() { DE_ASSERT(this.getNumSamples() == 1); return new tcuTexture.PixelBufferAccess({ format: this.m_access.getFormat(), width: this.m_access.getHeight(), height: this.m_access.getDepth(), depth: 1, rowPitch: this.m_access.getSlicePitch(), slicePitch: this.m_access.getSlicePitch() * this.m_access.getDepth(), data: this.m_access.m_data, offset: this.m_access.m_offset}); }; /** * @param {tcuTexture.PixelBufferAccess} original * @return {rrMultisamplePixelBufferAccess.MultisamplePixelBufferAccess} */ rrMultisamplePixelBufferAccess.MultisamplePixelBufferAccess.fromSinglesampleAccess = function(original) { return new rrMultisamplePixelBufferAccess.MultisamplePixelBufferAccess( new tcuTexture.PixelBufferAccess({ format: original.getFormat(), width: 1, height: original.getWidth(), depth: original.getHeight(), rowPitch: original.getFormat().getPixelSize(), slicePitch: original.getRowPitch(), data: original.m_data, offset: original.m_offset})); }; /** * @param {tcuTexture.PixelBufferAccess} multisampledAccess * @return {rrMultisamplePixelBufferAccess.MultisamplePixelBufferAccess} */ rrMultisamplePixelBufferAccess.MultisamplePixelBufferAccess.fromMultisampleAccess = function(multisampledAccess) { return new rrMultisamplePixelBufferAccess.MultisamplePixelBufferAccess(multisampledAccess); }; /** * @param {Array} region * @return {rrMultisamplePixelBufferAccess.MultisamplePixelBufferAccess} */ rrMultisamplePixelBufferAccess.MultisamplePixelBufferAccess.prototype.getSubregion = function(region) { var x = region[0]; var y = region[1]; var width = region[2]; var height = region[3]; return rrMultisamplePixelBufferAccess.MultisamplePixelBufferAccess.fromMultisampleAccess(tcuTextureUtil.getSubregion(this.raw(), 0, x, y, this.getNumSamples(), width, height)); }; /** * @return {Array} [x, y, width, height] */ rrMultisamplePixelBufferAccess.MultisamplePixelBufferAccess.prototype.getBufferSize = function() { return [0, 0, this.raw().getHeight(), this.raw().getDepth()]; }; /** * @param {tcuTexture.PixelBufferAccess} dst */ rrMultisamplePixelBufferAccess.MultisamplePixelBufferAccess.prototype.resolveMultisampleColorBuffer = function(dst) { var src = this; DE_ASSERT(dst.getWidth() == src.raw().getHeight()); DE_ASSERT(dst.getHeight() == src.raw().getDepth()); var numSamples = src.getNumSamples(); var sum = [0, 0, 0, 0]; for (var y = 0; y < dst.getHeight(); y++) { for (var x = 0; x < dst.getWidth(); x++) { sum[0] = 0; sum[1] = 0; sum[2] = 0; sum[3] = 0; for (var s = 0; s < src.raw().getWidth(); s++) { var pixel = src.raw().getPixel(s, x, y); sum[0] += pixel[0]; sum[1] += pixel[1]; sum[2] += pixel[2]; sum[3] += pixel[3]; } sum[0] /= numSamples; sum[1] /= numSamples; sum[2] /= numSamples; sum[3] /= numSamples; dst.setPixel(sum, x, y); } } }; /** * @param {number} x * @param {number} y * @return {Array} */ rrMultisamplePixelBufferAccess.MultisamplePixelBufferAccess.prototype.resolveMultisamplePixel = function(x, y) { var sum = [0, 0, 0, 0]; for (var s = 0; s < this.getNumSamples(); s++) sum = deMath.add(sum, this.raw().getPixel(s, x, y)); for (var i = 0; i < sum.length; i++) sum[i] = sum[i] / this.getNumSamples(); return sum; }; /** * @param {Array} color */ rrMultisamplePixelBufferAccess.MultisamplePixelBufferAccess.prototype.clear = function(color) { this.raw().clear(color); }; });