22/// Class: gpu_utils
33///
44/// Various utility functions / snippets of code that GPU.JS uses internally.\
5- /// This covers various snippets of code that is NOT gpu.js specific
5+ /// This covers various snippets of code that is not entirely gpu.js specific (ie. may find uses elsewhere)
66///
77/// Note that all moethods in this class is "static" by nature `gpu_utils.functionName()`
88///
@@ -11,7 +11,13 @@ var gpu_utils = (function() {
1111 function gpu_utils ( ) {
1212 throw new Error ( "This is a utility class - do not construct it" ) ;
1313 }
14-
14+
15+ //-----------------------------------------------------------------------------
16+ //
17+ // System values support (currently only endianness)
18+ //
19+ //-----------------------------------------------------------------------------
20+
1521 // system_endianness closure based memoizer
1622 var system_endianness_memoizer = null ;
1723
@@ -21,7 +27,7 @@ var gpu_utils = (function() {
2127 /// Gets the system endianness, and cache it
2228 ///
2329 /// Returns:
24- /// {String} "LE" or "BE" depending on system settings
30+ /// {String} "LE" or "BE" depending on system settings
2531 ///
2632 /// Credit: https://gist.github.com/TooTallNate/4750953
2733 function system_endianness ( ) {
@@ -38,6 +44,12 @@ var gpu_utils = (function() {
3844 throw new Error ( 'unknown endianness' ) ;
3945 }
4046 gpu_utils . system_endianness = system_endianness ;
47+
48+ //-----------------------------------------------------------------------------
49+ //
50+ // Function and function string validations
51+ //
52+ //-----------------------------------------------------------------------------
4153
4254 ///
4355 /// Function: isFunction
@@ -120,6 +132,187 @@ var gpu_utils = (function() {
120132 return result ;
121133 }
122134 gpu_utils . getParamNames_fromString = getParamNames_fromString ;
135+
136+ //-----------------------------------------------------------------------------
137+ //
138+ // Canvas validation and support
139+ //
140+ //-----------------------------------------------------------------------------
123141
142+ ///
143+ /// Function: isCanvas
144+ ///
145+ /// Return TRUE, on a valid DOM canvas object
146+ ///
147+ /// Note: This does just a VERY simply sanity check. And may give false positives.
148+ ///
149+ /// Parameters:
150+ /// canvasObj - {Canvas DOM object} Object to validate
151+ ///
152+ /// Returns:
153+ /// {Boolean} TRUE if the object is a DOM canvas
154+ ///
155+ function isCanvas ( canvasObj ) {
156+ return (
157+ canvasObj != null &&
158+ canvasObj . nodeName &&
159+ canvasObj . getContext &&
160+ canvasObj . nodeName . toUpperCase ( ) === "CANVAS"
161+ ) ;
162+ }
163+ gpu_utils . isCanvas = isCanvas ;
164+
165+ // browserSupport_canvas closure based memoizer
166+ var browserSupport_canvas_memoizer = null ;
167+ ///
168+ /// Function: browserSupport_canvas
169+ ///
170+ /// Return TRUE, if browser supports canvas
171+ ///
172+ /// Returns:
173+ /// {Boolean} TRUE if browser supports canvas
174+ ///
175+ function browserSupport_canvas ( ) {
176+ if ( browserSupport_canvas_memoizer !== null ) {
177+ return browserSupport_canvas_memoizer ;
178+ }
179+ return browserSupport_canvas_memoizer = isCanvas ( document . createElement ( 'canvas' ) ) ;
180+ }
181+ gpu_utils . browserSupport_canvas = browserSupport_canvas ;
182+
183+ ///
184+ /// Function: init_canvas
185+ ///
186+ /// Initiate and returns a canvas, for usage in init_webgl.
187+ /// Returns only if canvas is supported by browser.
188+ ///
189+ /// Returns:
190+ /// {Canvas DOM object} Canvas dom object if supported by browser, else null
191+ ///
192+ function init_canvas ( ) {
193+ // Fail fast if browser previously detected no support
194+ if ( browserSupport_canvas_memoizer === false ) {
195+ return null ;
196+ }
197+
198+ // Create a new canvas DOM
199+ var canvas = document . createElement ( 'canvas' ) ;
200+
201+ // First time setup, does the browser support check memoizer
202+ if ( browserSupport_canvas_memoizer === null ) {
203+ browserSupport_canvas_memoizer = isCanvas ( canvas ) ;
204+ if ( browserSupport_canvas_memoizer === false ) {
205+ return null ;
206+ }
207+ }
208+
209+ // Default width and height, to fix webgl issue in safari
210+ canvas . width = 2 ;
211+ canvas . height = 2 ;
212+
213+ // Returns the canvas
214+ return canvas ;
215+ }
216+ gpu_utils . init_canvas = init_canvas ;
217+
218+ //-----------------------------------------------------------------------------
219+ //
220+ // Webgl validation and support
221+ //
222+ //-----------------------------------------------------------------------------
223+
224+ ///
225+ /// Function: isWebgl
226+ ///
227+ /// Return TRUE, on a valid webgl context object
228+ ///
229+ /// Note: This does just a VERY simply sanity check. And may give false positives.
230+ ///
231+ /// Parameters:
232+ /// webglObj - {webgl context} Object to validate
233+ ///
234+ /// Returns:
235+ /// {Boolean} TRUE if the object is a webgl context object
236+ ///
237+ function isWebgl ( webglObj ) {
238+ return (
239+ webglObj != null &&
240+ webglObj . getExtension
241+ ) ;
242+ }
243+ gpu_utils . isWebgl = isWebgl ;
244+
245+ // browserSupport_canvas closure based memoizer
246+ var browserSupport_webgl_memoizer = null ;
247+ ///
248+ /// Function: browserSupport_webgl
249+ ///
250+ /// Return TRUE, if browser supports webgl
251+ ///
252+ /// Returns:
253+ /// {Boolean} TRUE if browser supports webgl
254+ ///
255+ function browserSupport_webgl ( ) {
256+ if ( browserSupport_webgl_memoizer !== null ) {
257+ return browserSupport_webgl_memoizer ;
258+ }
259+ return browserSupport_webgl_memoizer = isWebgl ( init_webgl ( init_canvas ( ) ) ) ;
260+ }
261+ gpu_utils . browserSupport_webgl = browserSupport_webgl ;
262+
263+ // Default webgl options to use
264+ var init_webgl_defaultOptions = {
265+ depth : false ,
266+ antialias : false
267+ }
268+
269+ ///
270+ /// Function: init_webgl
271+ ///
272+ /// Initiate and returns a webgl, from a canvas object
273+ /// Returns only if webgl is supported by browser.
274+ ///
275+ /// Parameters:
276+ /// canvasObj - {Canvas DOM object} Object to validate
277+ ///
278+ /// Returns:
279+ /// {Canvas DOM object} Canvas dom object if supported by browser, else null
280+ ///
281+ function init_webgl ( canvasObj ) {
282+
283+ // Fail fast for invalid canvas object
284+ if ( ! isCanvas ( canvasObj ) ) {
285+ throw new Error ( "Invalid canvas object - " + canvasObj ) ;
286+ }
287+
288+ // Fail fast if browser previously detected no support
289+ if ( browserSupport_canvas_memoizer === false || browserSupport_webgl_memoizer === false ) {
290+ return null ;
291+ }
292+
293+ // Create a new canvas DOM
294+ var webgl = (
295+ canvasObj . getContext ( "experimental-webgl" , init_webgl_defaultOptions ) ||
296+ canvasObj . getContext ( "webgl" , init_webgl_defaultOptions )
297+ ) ;
298+
299+ // First time setup, does the browser support check memoizer
300+ if ( browserSupport_webgl_memoizer === null ) {
301+ browserSupport_webgl_memoizer = isWebgl ( webgl ) ;
302+ if ( browserSupport_webgl_memoizer === false ) {
303+ return null ;
304+ }
305+ }
306+
307+ // Get the extension that is needed
308+ webgl . getExtension ( 'OES_texture_float' ) ;
309+ webgl . getExtension ( 'OES_texture_float_linear' ) ;
310+ webgl . getExtension ( 'OES_element_index_uint' ) ;
311+
312+ // Returns the canvas
313+ return webgl ;
314+ }
315+ gpu_utils . init_webgl = init_webgl ;
316+
124317 return gpu_utils ;
125318} ) ( ) ;
0 commit comments