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