tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

sglrGLContext.js (8319B)


      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('framework.opengl.simplereference.sglrGLContext');
     23 goog.require('framework.common.tcuPixelFormat');
     24 goog.require('framework.common.tcuTexture');
     25 goog.require('framework.common.tcuTextureUtil');
     26 goog.require('framework.delibs.debase.deMath');
     27 goog.require('framework.delibs.debase.deUtil');
     28 goog.require('framework.opengl.gluShaderProgram');
     29 goog.require('framework.opengl.gluShaderUtil');
     30 goog.require('framework.opengl.gluTextureUtil');
     31 goog.require('framework.opengl.simplereference.sglrShaderProgram');
     32 goog.require('framework.referencerenderer.rrDefs');
     33 goog.require('framework.referencerenderer.rrMultisamplePixelBufferAccess');
     34 goog.require('framework.referencerenderer.rrRenderState');
     35 goog.require('framework.referencerenderer.rrRenderer');
     36 goog.require('framework.referencerenderer.rrVertexAttrib');
     37 
     38 goog.scope(function() {
     39 
     40    var sglrGLContext = framework.opengl.simplereference.sglrGLContext;
     41    var tcuTexture = framework.common.tcuTexture;
     42    var deUtil = framework.delibs.debase.deUtil;
     43    var deMath = framework.delibs.debase.deMath;
     44    var tcuTextureUtil = framework.common.tcuTextureUtil;
     45    var tcuPixelFormat = framework.common.tcuPixelFormat;
     46    var gluShaderProgram = framework.opengl.gluShaderProgram;
     47    var gluShaderUtil = framework.opengl.gluShaderUtil;
     48    var gluTextureUtil = framework.opengl.gluTextureUtil;
     49    var sglrShaderProgram = framework.opengl.simplereference.sglrShaderProgram;
     50    var rrDefs = framework.referencerenderer.rrDefs;
     51    var rrMultisamplePixelBufferAccess = framework.referencerenderer.rrMultisamplePixelBufferAccess;
     52    var rrRenderer = framework.referencerenderer.rrRenderer;
     53    var rrRenderState = framework.referencerenderer.rrRenderState;
     54    var rrVertexAttrib = framework.referencerenderer.rrVertexAttrib;
     55 
     56    var DE_ASSERT = function(x) {
     57        if (!x)
     58            throw new Error('Assert failed');
     59    };
     60 
     61    /**
     62     * sglrGLContext.GLContext wraps the standard WebGL context to be able to be used interchangeably with the ReferenceContext
     63     * @constructor
     64     * @extends {WebGL2RenderingContext}
     65     * @param {?WebGL2RenderingContext} context
     66     * @param {Array<number>=} viewport
     67     */
     68    sglrGLContext.GLContext = function(context, viewport) {
     69        DE_ASSERT(context);
     70 
     71        var functionwrapper = function(context, fname) {
     72            return function() {
     73                return context[fname].apply(context, arguments);
     74            };
     75        };
     76 
     77        var wrap = {};
     78        for (var i in context) {
     79            try {
     80              if (typeof context[i] == 'function') {
     81                wrap[i] = functionwrapper(context, i);
     82              } else {
     83                wrap[i] = context[i];
     84              }
     85            } catch (e) {
     86              throw new Error('GLContext: Error accessing ' + i);
     87            }
     88        }
     89        if (viewport)
     90            context.viewport(viewport[0], viewport[1], viewport[2], viewport[3]);
     91 
     92        /**
     93         * createProgram
     94         * @override
     95         * @param {sglrShaderProgram.ShaderProgram=} shader
     96         * @return {!WebGLProgram}
     97         */
     98        this.createProgram = function(shader) {
     99            var program = new gluShaderProgram.ShaderProgram(
    100                    context,
    101                    gluShaderProgram.makeVtxFragSources(
    102                        shader.m_vertSrc,
    103                        shader.m_fragSrc
    104                    )
    105                );
    106 
    107            if (!program.isOk()) {
    108                bufferedLogToConsole(program.toString());
    109                testFailedOptions('Compile failed', true);
    110            }
    111            return program.getProgram();
    112        };
    113        wrap['createProgram'] = this.createProgram;
    114 
    115        /**
    116         * Draws quads from vertex arrays
    117         * @param {number} primitive Primitive type
    118         * @param {number} first First vertex to begin drawing with
    119         * @param {number} count Number of vertices
    120         */
    121        var drawQuads = function(primitive, first, count) {
    122            context.drawArrays(primitive, first, count);
    123        };
    124        wrap['drawQuads'] = drawQuads;
    125 
    126        /**
    127         * @return {number}
    128         */
    129        var getWidth = function() {
    130            if(viewport)
    131                return viewport[2];
    132            else
    133                return context.drawingBufferWidth;
    134        };
    135        wrap['getWidth'] = getWidth;
    136 
    137        /**
    138         * @return {number}
    139         */
    140        var getHeight = function() {
    141            if(viewport)
    142                return viewport[3];
    143            else
    144                return context.drawingBufferHeight;
    145        };
    146        wrap['getHeight'] = getHeight;
    147 
    148        /**
    149         * @param {number} x
    150         * @param {number} y
    151         * @param {number} width
    152         * @param {number} height
    153         * @param {number} format
    154         * @param {number} dataType
    155         * @param {ArrayBuffer|ArrayBufferView} data
    156         */
    157        var readPixels = function(x, y, width, height, format, dataType, data) {
    158            /** @type {?ArrayBufferView} */ var dataArr;
    159            if (!ArrayBuffer.isView(data)) {
    160                var type = gluTextureUtil.mapGLChannelType(dataType, true);
    161                var dataArrType = tcuTexture.getTypedArray(type);
    162                dataArr = new dataArrType(data);
    163            } else {
    164                dataArr = /** @type {?ArrayBufferView} */ (data);
    165            }
    166 
    167            context.readPixels(x, y, width, height, format, dataType, dataArr);
    168        };
    169        wrap['readPixels'] = readPixels;
    170 
    171        /**
    172         * @param {number} target
    173         * @param {number} level
    174         * @param {number} internalFormat
    175         * @param {number} width
    176         * @param {number} height
    177         */
    178        var texImage2DDelegate = function(target, level, internalFormat, width, height) {
    179            var format;
    180            var dataType;
    181 
    182            switch(internalFormat)
    183            {
    184                case gl.ALPHA:
    185                case gl.LUMINANCE:
    186                case gl.LUMINANCE_ALPHA:
    187                case gl.RGB:
    188                case gl.RGBA:
    189                    format = internalFormat;
    190                    dataType = gl.UNSIGNED_BYTE;
    191                    break;
    192                default:
    193                {
    194                    var transferFmt = gluTextureUtil.getTransferFormat(gluTextureUtil.mapGLInternalFormat(internalFormat));
    195                    format = transferFmt.format;
    196                    dataType = transferFmt.dataType;
    197                    break;
    198                }
    199             }
    200             context.texImage2D(target, level, internalFormat, width, height, 0, format, dataType, null);
    201         };
    202         wrap['texImage2DDelegate'] = texImage2DDelegate;
    203 
    204         return wrap;
    205    };
    206 
    207    /**
    208     * createProgram - This had to be added here as dummy to remove a warning when the only context used is GLContext (no reference context)
    209     * @override
    210     * @param {sglrShaderProgram.ShaderProgram=} shader
    211     * @return {!WebGLProgram}
    212     */
    213    sglrGLContext.GLContext.prototype.createProgram = function(shader) {return this.createProgram();};
    214 
    215    /**
    216    * @param ctx GL-like context
    217    * @param {string} name
    218    * @return {boolean}
    219    */
    220    sglrGLContext.isExtensionSupported = function(ctx, name) {
    221        var extns = ctx.getSupportedExtensions();
    222        var found = false;
    223        if (extns) {
    224            var index = extns.indexOf(name);
    225            if (index != -1)
    226                found = true;
    227        }
    228        return found;
    229    };
    230 
    231 });