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 });