1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ 2 /* This Source Code Form is subject to the terms of the Mozilla Public 3 * License, v. 2.0. If a copy of the MPL was not distributed with this 4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 5 6 #ifndef WEBGLTYPES_H_ 7 #define WEBGLTYPES_H_ 8 9 // Most WebIDL typedefs are identical to their OpenGL counterparts. 10 #include "GLTypes.h" 11 12 // Manual reflection of WebIDL typedefs that are different from their 13 // OpenGL counterparts. 14 typedef int64_t WebGLsizeiptr; 15 typedef int64_t WebGLintptr; 16 typedef bool WebGLboolean; 17 18 namespace mozilla { 19 namespace gl { 20 class GLContext; // This is going to be needed a lot. 21 } // namespace gl 22 23 /* 24 * WebGLTextureFakeBlackStatus is an enum to track what needs to use a dummy 1x1 black 25 * texture, which we refer to as a 'fake black' texture. 26 * 27 * There are two things that can cause us to use such 'fake black' textures: 28 * 29 * (1) OpenGL ES rules on sampling incomplete textures specify that they 30 * must be sampled as RGBA(0, 0, 0, 1) (opaque black). We have to implement these rules 31 * ourselves, if only because we do not always run on OpenGL ES, and also 32 * because this is dangerously close to the kind of case where we don't 33 * want to trust the driver with corner cases of texture memory accesses. 34 * 35 * (2) OpenGL has cases where a renderbuffer, or a texture image, can contain 36 * uninitialized image data. See below the comment about WebGLImageDataStatus. 37 * WebGL must never have access to uninitialized image data. The WebGL 1 spec, 38 * section 4.1 'Resource Restrictions', specifies that in any such case, the 39 * uninitialized image data must be exposed to WebGL as if it were filled 40 * with zero bytes, which means it's either opaque or transparent black 41 * depending on whether the image format has alpha. 42 */ 43 44 enum class FakeBlackType : uint8_t { 45 None, 46 RGBA0001, // Incomplete textures and uninitialized no-alpha color textures. 47 RGBA0000, // Uninitialized with-alpha color textures. 48 }; 49 50 /* 51 * Implementing WebGL (or OpenGL ES 2.0) on top of desktop OpenGL requires 52 * emulating the vertex attrib 0 array when it's not enabled. Indeed, 53 * OpenGL ES 2.0 allows drawing without vertex attrib 0 array enabled, but 54 * desktop OpenGL does not allow that. 55 */ 56 enum class WebGLVertexAttrib0Status : uint8_t { 57 Default, // default status - no emulation needed 58 EmulatedUninitializedArray, // need an artificial attrib 0 array, but contents may be left uninitialized 59 EmulatedInitializedArray // need an artificial attrib 0 array, and contents must be initialized 60 }; 61 62 /* 63 * Enum to track the status of image data (renderbuffer or texture image) presence 64 * and initialization. 65 * 66 * - NoImageData is the initial state before any image data is allocated. 67 * - InitializedImageData is the state after image data is allocated and initialized. 68 * - UninitializedImageData is an intermediate state where data is allocated but not 69 * initialized. It is the state that renderbuffers are in after a renderbufferStorage call, 70 * and it is the state that texture images are in after a texImage2D call with null data. 71 */ 72 enum class WebGLImageDataStatus : uint8_t { 73 NoImageData, 74 UninitializedImageData, 75 InitializedImageData 76 }; 77 78 /* 79 * The formats that may participate, either as source or destination formats, 80 * in WebGL texture conversions. This includes: 81 * - all the formats accepted by WebGL.texImage2D, e.g. RGBA4444 82 * - additional formats provided by extensions, e.g. RGB32F 83 * - additional source formats, depending on browser details, used when uploading 84 * textures from DOM elements. See gfxImageSurface::Format(). 85 */ 86 enum class WebGLTexelFormat : uint8_t { 87 // returned by SurfaceFromElementResultToImageSurface to indicate absence of image data 88 None, 89 // common value for formats for which format conversions are not supported 90 FormatNotSupportingAnyConversion, 91 // dummy pseudo-format meaning "use the other format". 92 // For example, if SrcFormat=Auto and DstFormat=RGB8, then the source 93 // is implicitly treated as being RGB8 itself. 94 Auto, 95 // 1-channel formats 96 A8, 97 A16F, // OES_texture_half_float 98 A32F, // OES_texture_float 99 R8, 100 R16F, // OES_texture_half_float 101 R32F, // OES_texture_float 102 // 2-channel formats 103 RA8, 104 RA16F, // OES_texture_half_float 105 RA32F, // OES_texture_float 106 RG8, 107 RG16F, 108 RG32F, 109 // 3-channel formats 110 RGB8, 111 RGB565, 112 RGB11F11F10F, 113 RGB16F, // OES_texture_half_float 114 RGB32F, // OES_texture_float 115 // 4-channel formats 116 RGBA8, 117 RGBA5551, 118 RGBA4444, 119 RGBA16F, // OES_texture_half_float 120 RGBA32F, // OES_texture_float 121 // DOM element source only formats. 122 RGBX8, 123 BGRX8, 124 BGRA8 125 }; 126 127 enum class WebGLTexImageFunc : uint8_t { 128 TexImage, 129 TexSubImage, 130 CopyTexImage, 131 CopyTexSubImage, 132 CompTexImage, 133 CompTexSubImage, 134 }; 135 136 enum class WebGLTexDimensions : uint8_t { 137 Tex2D, 138 Tex3D 139 }; 140 141 // Please keep extensions in alphabetic order. 142 enum class WebGLExtensionID : uint8_t { 143 ANGLE_instanced_arrays, 144 EXT_blend_minmax, 145 EXT_color_buffer_float, 146 EXT_color_buffer_half_float, 147 EXT_frag_depth, 148 EXT_sRGB, 149 EXT_shader_texture_lod, 150 EXT_texture_filter_anisotropic, 151 EXT_disjoint_timer_query, 152 OES_element_index_uint, 153 OES_standard_derivatives, 154 OES_texture_float, 155 OES_texture_float_linear, 156 OES_texture_half_float, 157 OES_texture_half_float_linear, 158 OES_vertex_array_object, 159 WEBGL_color_buffer_float, 160 WEBGL_compressed_texture_atc, 161 WEBGL_compressed_texture_etc, 162 WEBGL_compressed_texture_etc1, 163 WEBGL_compressed_texture_pvrtc, 164 WEBGL_compressed_texture_s3tc, 165 WEBGL_debug_renderer_info, 166 WEBGL_debug_shaders, 167 WEBGL_depth_texture, 168 WEBGL_draw_buffers, 169 WEBGL_lose_context, 170 Max, 171 Unknown 172 }; 173 174 } // namespace mozilla 175 176 #endif 177