mirror of
https://github.com/roytam1/palemoon27.git
synced 2026-05-26 14:18:48 +00:00
f29aba536a
- Bug 1085783 (Part 1) - Snap both the fill and dest rects using UserToDeviceSnapped() when pixel snapping images. r=roc (97c8ea37a9) - Bug 1085783 (Part 2) - Add a test for rounding behavior when high-quality downscaling. r=roc (2851c696c4) - Bug 1218851. Fix comments related to nsIPresShell::RenderDocument and flags RENDER_DOCUMENT_RELATIVE and RENDER_IGNORE_VIEWPORT_SCROLLING. r=roc (897eb061a2) - Bug 1223255 - Use Animation::AnimationTimeToTimeStamp instead of timeline->ToTimeStamp. r=bbirtles (b05fc6c868) - Bug 1216030 - Part 1: Remove CanAnimate_HasGeometricProperty. r=dbaron (8f8f380828) - Bug 1216030 - Part 2: Remove gfxPlatform::OffMainThreadCompositingEnabled from CanAnimatePropertyOnCompositor. r=dbaron (983f626f3d) - Bug 1216030 - Part 3: Move AreAsyncAnimationsEnabled check outside animation properties loop. r=dbaron (273b21d3a9) - Bug 1216030 - Part 4: Move IsCompositorAnimationDisabledForFrame outside animation properties loop. r=dbaron (4f5ba30f2d) - Bug 1216030 - Part 5: Add KeyframeEffectReadOnly::CanAnimateTransformOnCompositor. r=bbirtles (a87ab8f397) - Bug 1216030 - Part 6: Add KeyframeEffectReadOnly::IsGeometricProperty. r=bbirtles (9dbb1c9fe0) - Bug 1216030 - Part 7: Add nsIFrame::RefusedAsyncAnimation. r=dbaron (9b0582e9e7) - Bug 1216030 - Part 8: Add KeyframeEffectReadOnly::GetAnimationFrame. r=bbirtles (3915b03b48) - Bug 1216030 - Part 9: We don't need to call CanPerformOnCompositorThread in RequestRestyle. (fe46feecdb) - Bug 1216030 - Part 8.5: Animation::CanThrottle() should check that all animation properties are running on compositor. r=bbirtles (dbee36ccc7) - Bug 1216030 - Part 10: Remove CanAnimate_AllowPartial flag. r=bbirtles (eb30ac714f) - Bug 1216030 - Part 11: Add KeyframeEffect::CanAnimatePropertyOnCompositor. r=bbirtles (f71cb641ec) - Bug 1216030 - Part 12: Pass nsIFrame to CanPerformOnCompositorThread to avoid redundant process for getting nsIFrame. r=dbaron (c9dbe043ad) - Bug 1216030 - Part 13: Remove existsProperty check from CanPerformOnCompositorThread. r=dbaron (e3dde151af) - Bug 1216030 - Part 14: Add KeyframeEffectReadOnly::GetPresContext and KeyframeEffectReadonly::GetRenderedDocument. r=bbirtles (7edbf430e9) - Bug 1216030 - Part 15: Add KeyframeEffectReadOnly::GetCollection. r=bbirtles (2652435de5) - Bug 1216030 - Part 16: Move CanThrottleAnimation and CanThrottleTransformChanges from AnimationCollection into KeyframeEffectReadOnly::CanThrottle. r=bbirtles (d890691ebb) - Bug 1216030 - Part 17: Do not calculate unthrottle interval for transform animation every time. r=bbirtles (c7a3767422) - Bug 1216030 - Part 18: Remove IsCurrent() check in assertion in CanThrottle. r=bbirtles (6de694634a) - Bug 1181976 - Rename WillChangeBudgetWarning in dom/dom.properties to reflect string change. r=flod (abc159ebba) - Bug 1191412 - Fix logic and text for the WillChange warning. r=roc (f2900114f1) - Bug 1180899 - Do not clobber frame metrics on the root layer added during a previous paint if there is no other frame metrics for the root scroll frame. r=tn (30f2dcf21b) - Bug 1208673 - Do HitTest with skipping non-leaf preserve-3d transform items. r=roc (a042872d32) - Bug 947062 - Layerize background images with animated background-position if possible. r=mattwoodrow (075dedff4a) - Bug 1172310. Don't add viewport frame bounds to the layer event regions because they are never the result of hit testing. r=roc (1ecdd06c0d) - Bug 1213582. Don't flatten away opacity:0 containers. r=mattwoodrow (d1f9c205e1) - Bug 1213582. Skip display items in ProcessDisplayItems if we only need items for event regions, and this item isn't one and doesn't have descendants. r=mattwoodrow (3511595652) - Bug 1183085 - Correct the name for nsDisplayItem; r=roc (fb1a59294f) - Bug 1183085 - Update description for nsDisplayList methods; r=roc (39eafdb099) - Bug 1216851 - Don't include event regions when deciding if we can flatten opacity. r=roc (fc518688a4) - Bug 1215412 - Apply perspective origin after transform origin. r=jwatt (a30f0351a3) - Bug 1152263 - Ensure Matrix4x4::ProjectRectBounds being functional for Rect with zero width/height. r=mattwoodrow (5ca3086e04) - Bug 1217012 - Use doubles when untransforming points since we need the extra precision. r=kip (81acd626e8) - Bug 1042536 - Allow ImageLayer optimization to be used for some clipped background images. r=mstange (b9b89b2d25) - Bug 1221677 - "[css-grid] Put the 'subgrid' support behind a pref, disabled by default". r=mats (400e9d865a) - Bug 1150042 - Make nsLayoutUtils::DrawSingleUnscaledImage use CSSIntSize instead of unitless nsIntSize. r=dholbert (393062cd87) - Bug 1173305 - Convert BasicTableLayoutStrategy to work with logical coordinates. r=dholbert (e133cad49a) - namespace comment (6fc3ad3f4a) - Bug 1220621. When removing a <col>, only create an anonymous colframe to replace it if one is really needed. r=dbaron (e29d8a7248) - Bug 1178250 - Don't call ConsiderChildOverflow until the child has been placed in the right location when reflowing a vertical-rl table. r=dholbert (1327793032) - Bug 1186998 - Align overflowing table-cell content to content-box. r=dholbert (d2356a20c0) - Bug 1213465 - Combine DrawResults correctly in nsTablePainter. r=tn (61e725a4ad) - minor (0df6057957) - bits of Bug 1163227: Part5 (6a99380110) - minor (59f78b2265) - Bug 1206982 - getUserMedia s/PermissionDeniedError/SecurityError/. r=jesup (782b3536a2) - Bug 1218799: Shutdown MediaManager engines from the MediaManager thread r=jib (351bba0486) - Bug 1186708 - Fix debug-only assert (crash) on advanced browserWindow constraint. r=jesup (86fcfa999d) - Bug 1170958 - Remove ProcessedMediaStream::ForwardTrackEnabled. r=roc,jesup (4663d7a46c) - Bug 1223916 - Prohibit direct method calls at the parser level in self-hosted code. (r=till) (1489fbb2f3) - Bug 1219057 - Do not show "Unable to print stack trace" for exception thrown while compiling top-level script. r=jandem (df74029ee8) - Bug 1186973 - Evaluate assertEqBytecode: Print length as numbers. r=h4writer (57f9e68d53) - Bug 1218636 - IonMonkey: MIPS64: Add support into shell. r=lth (dc4de53cf5) - Bug 1192329 - Change JS shell to default to the standard version of JS (not 1.7+) 1/2; r=jorendorff (e40087f5b8) - Bug 1192329 - Change JS shell to default to the standard version of JS (not 1.7+) 2/2; r=jorendorff (4d74d1f639) - Bug 1192329 - Fix broken asm tests by explicitly setting js version; r=jorendorff (adf502c8db) - Bug 1108603 - Evaluate ensure that the global is configured such that we can always clone singletons. r=jonco (8a888042dd) - Bug 1184393 - Rename some js shell test variables for better readability; r=sfink (06e2293f34) - Bug 1213104 - Pass the ProgressBar directly, since we are no longer using results; r=sfink (16b4af8c3e) - Bug 1212756 - Fix jstests --debug option r=terrence (89caa65dc5) - Bug 1213365 - Share environment control code between js and jit test harnesses; r=sfink (274c4f2d2e) - Bug 1206987 - Only disable the GPF dialog during testing; r=sfink (a507b1b591) - Bug 1212349 - Encapsulate the shell's per-runtime state r=jandem (4ec884973d) - Bug 1215063 - Implement a simple module loader for the shell r=shu r=froydnj (a916f0ee03) - Bug 1214051 - Reject NaN as a sampling probability, and test the floating point value range harder. r=jimb (842e822471) - Bug 1225176 - Don't call wrap() in JitActivation constructor, it can GC and crash. r=fitzgen (d989a2b157) - Bug 1218643 - remove support for deprecated asm.js heap length. r=luke (6ad156f10d) - Bug 1224280 - Fix asm.js console warning when disabled by debugger and parsing off-thread. r=luke (7bf76d0a1f) - Bug 1221660 - Part 1: Stop populating ParseNode::pn_offset most of the time. r=Waldo. (24d013fe30) - Bug 1221660 - Part 2: Move pn_offset into a branch of the ParseNode::pn_u union. Add a subclass of ParseNode for PNK_CASE nodes. Merge PNK_DEFAULT with PNK_CASE. r=Waldo. (12514bc644) - Bug 1200609 - Odin: Update comments and code mentioning interrupting via mprotect (r=benj) (a60ec9d0d0) - Bug 1218644 - OdinMonkey: MIPS64: Add support for Loongson3. r=lth (57a1865d1d) - Bug 1225392 part 1. Expose JSAPI for getting %IteratorPrototype%. r=efaust (816e68dddd) - Bug 1225392 part 2. WebIDL autogenerated iterators should chain up to %IteratorPrototype%. r=qdot (834fc71f90) - No bug. Reword a comment slightly because it confused me. r=woof!, DONTBUILD (c2c41d535a) - Bug 1147752 - Keep typedefs consistent. r=jgilbert (605d63c0e4) - Bug 1207672 - Add support for APPLE_framebuffer_multisample r=snorp (0f4ef4420d) - Bug 1207205 - Remove fGetActiveUniformName. r=jrmuizel (9d1c97f194) - Bug 1208513 - Add support for GL_APPLE_sync r=jgilbert (6d70401d89) - Bug 1222175 - initialize base of ScaledFontDWrite before its members; r=Bas (120c5fa334) - Bug 1217941 - remove <iomanip> from ScaleFactors2D.h; r=jrmuizel (e5a08d95e2) - Bug 1222569 - fix initialization order in SourceSurfaceD2D1; r=Bas (484084f551) - Bug 1208661 - Implement SourceSurfaceDual::GetDataSurface() for debugging purposes. r=BenWa (de255f344a) - Bug 1185011: Add 'override' annotations to DataSourceSurface subclasses in SourceSurfaceRawData.h, to fix clang -Winconsistent-missing-override build warnings/errors. rs=ehsan (dc3ff4fa07) - Bug 1222298 - GFX: 2D: Make convolverLS3 more like upstream. r=seth (06e555709d) - Bug 1157065- GFX: 2D: Implement AlphaBoxBlur in LS3 MMI. r=jrmuizel (ca818df231) - Bug 1220673 - Make DrawTargetCG::Mask() MOZ_CRASH (a649db3d99) - Bug 1221616: Use ID2D1CommandList instead of a bitmap for temporary D2D drawing. r=jrmuizel (9785977521) - Bug 1220624: Make MaskSurface properly take into account the possibilities of partial uploads. r=jrmuizel (9dd3d65880) - Bug 1222569 - remove unused variable from DrawTargetD2D1.cpp; r=Bas (e6c5aa717b)
874 lines
23 KiB
C++
874 lines
23 KiB
C++
/* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
|
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
|
|
#include "GLContext.h"
|
|
#include "nsPrintfCString.h"
|
|
|
|
#ifdef XP_MACOSX
|
|
#include "nsCocoaFeatures.h"
|
|
#endif
|
|
|
|
namespace mozilla {
|
|
namespace gl {
|
|
|
|
const size_t kMAX_EXTENSION_GROUP_SIZE = 5;
|
|
|
|
enum class GLVersion : uint32_t {
|
|
NONE = 0, // Feature is not supported natively by GL
|
|
GL1_2 = 120,
|
|
GL1_3 = 130,
|
|
GL2 = 200,
|
|
GL2_1 = 210,
|
|
GL3 = 300,
|
|
GL3_1 = 310,
|
|
GL3_2 = 320,
|
|
GL3_3 = 330,
|
|
GL4 = 400,
|
|
GL4_1 = 410,
|
|
GL4_2 = 420,
|
|
GL4_3 = 430,
|
|
};
|
|
|
|
enum class GLESVersion : uint32_t {
|
|
NONE = 0, // Feature is not support natively by GL ES
|
|
ES2 = 200,
|
|
ES3 = 300,
|
|
ES3_1 = 310,
|
|
};
|
|
|
|
// ARB_ES2_compatibility is natively supported in OpenGL 4.1.
|
|
static const GLVersion kGLCoreVersionForES2Compat = GLVersion::GL4_1;
|
|
|
|
// ARB_ES3_compatibility is natively supported in OpenGL 4.3.
|
|
static const GLVersion kGLCoreVersionForES3Compat = GLVersion::GL4_3;
|
|
|
|
struct FeatureInfo
|
|
{
|
|
const char* mName;
|
|
|
|
/* The (desktop) OpenGL version that provides this feature */
|
|
GLVersion mOpenGLVersion;
|
|
|
|
/* The OpenGL ES version that provides this feature */
|
|
GLESVersion mOpenGLESVersion;
|
|
|
|
/* If there is an ARB extension, and its function symbols are
|
|
* not decorated with an ARB suffix, then its extension ID should go
|
|
* here, and NOT in mExtensions. For example, ARB_vertex_array_object
|
|
* functions do not have an ARB suffix, because it is an extension that
|
|
* was created to match core GL functionality and will never differ.
|
|
* Some ARB extensions do have a suffix, if they were created before
|
|
* a core version of the functionality existed.
|
|
*
|
|
* If there is no such ARB extension, pass 0 (GLContext::Extension_None)
|
|
*/
|
|
GLContext::GLExtensions mARBExtensionWithoutARBSuffix;
|
|
|
|
/* Extensions that also provide this feature */
|
|
GLContext::GLExtensions mExtensions[kMAX_EXTENSION_GROUP_SIZE];
|
|
};
|
|
|
|
static const FeatureInfo sFeatureInfoArr[] = {
|
|
{
|
|
"bind_buffer_offset",
|
|
GLVersion::NONE,
|
|
GLESVersion::NONE,
|
|
GLContext::Extension_None,
|
|
{
|
|
|
|
GLContext::EXT_transform_feedback,
|
|
GLContext::NV_transform_feedback2,
|
|
GLContext::Extensions_End
|
|
}
|
|
},
|
|
{
|
|
"blend_minmax",
|
|
GLVersion::GL2,
|
|
GLESVersion::ES3,
|
|
GLContext::Extension_None,
|
|
{
|
|
GLContext::EXT_blend_minmax,
|
|
GLContext::Extensions_End
|
|
}
|
|
},
|
|
{
|
|
"clear_buffers",
|
|
GLVersion::GL3,
|
|
GLESVersion::ES3,
|
|
GLContext::Extension_None,
|
|
{
|
|
GLContext::Extensions_End
|
|
}
|
|
},
|
|
{
|
|
"copy_buffer",
|
|
GLVersion::GL3_1,
|
|
GLESVersion::ES3,
|
|
GLContext::ARB_copy_buffer,
|
|
{
|
|
GLContext::Extensions_End
|
|
}
|
|
},
|
|
{
|
|
"depth_texture",
|
|
GLVersion::GL2,
|
|
GLESVersion::ES3,
|
|
GLContext::Extension_None,
|
|
{
|
|
GLContext::ARB_depth_texture,
|
|
GLContext::OES_depth_texture,
|
|
// Intentionally avoid putting ANGLE_depth_texture here,
|
|
// it does not offer quite the same functionality.
|
|
GLContext::Extensions_End
|
|
}
|
|
},
|
|
{
|
|
"draw_buffers",
|
|
GLVersion::GL2,
|
|
GLESVersion::NONE,
|
|
GLContext::Extension_None,
|
|
{
|
|
GLContext::ARB_draw_buffers,
|
|
GLContext::EXT_draw_buffers,
|
|
GLContext::Extensions_End
|
|
}
|
|
},
|
|
{
|
|
"draw_instanced",
|
|
GLVersion::GL3_1,
|
|
GLESVersion::ES3,
|
|
GLContext::Extension_None,
|
|
{
|
|
GLContext::ARB_draw_instanced,
|
|
GLContext::EXT_draw_instanced,
|
|
GLContext::NV_draw_instanced,
|
|
GLContext::ANGLE_instanced_arrays,
|
|
GLContext::Extensions_End
|
|
}
|
|
},
|
|
{
|
|
"draw_range_elements",
|
|
GLVersion::GL1_2,
|
|
GLESVersion::ES3,
|
|
GLContext::Extension_None,
|
|
{
|
|
GLContext::EXT_draw_range_elements,
|
|
GLContext::Extensions_End
|
|
}
|
|
},
|
|
{
|
|
"element_index_uint",
|
|
GLVersion::GL2,
|
|
GLESVersion::ES3,
|
|
GLContext::Extension_None,
|
|
{
|
|
GLContext::OES_element_index_uint,
|
|
GLContext::Extensions_End
|
|
}
|
|
},
|
|
{
|
|
"ES2_compatibility",
|
|
kGLCoreVersionForES2Compat,
|
|
GLESVersion::ES2, // OpenGL ES version
|
|
GLContext::ARB_ES2_compatibility, // no suffix on ARB extension
|
|
{
|
|
GLContext::Extensions_End
|
|
}
|
|
},
|
|
{
|
|
"ES3_compatibility",
|
|
kGLCoreVersionForES3Compat,
|
|
GLESVersion::ES3, // OpenGL ES version
|
|
GLContext::ARB_ES3_compatibility, // no suffix on ARB extension
|
|
{
|
|
GLContext::Extensions_End
|
|
}
|
|
},
|
|
{
|
|
// Removes clamping for float color outputs from frag shaders.
|
|
"frag_color_float",
|
|
GLVersion::GL3,
|
|
GLESVersion::ES3,
|
|
GLContext::Extension_None,
|
|
{
|
|
GLContext::ARB_color_buffer_float,
|
|
GLContext::EXT_color_buffer_float,
|
|
GLContext::EXT_color_buffer_half_float,
|
|
GLContext::Extensions_End
|
|
}
|
|
},
|
|
{
|
|
"frag_depth",
|
|
GLVersion::GL2,
|
|
GLESVersion::ES3,
|
|
GLContext::Extension_None,
|
|
{
|
|
GLContext::EXT_frag_depth,
|
|
GLContext::Extensions_End
|
|
}
|
|
},
|
|
{
|
|
// Check for just the blit framebuffer blit part of
|
|
// ARB_framebuffer_object
|
|
"framebuffer_blit",
|
|
GLVersion::GL3,
|
|
GLESVersion::ES3,
|
|
GLContext::ARB_framebuffer_object,
|
|
{
|
|
GLContext::ANGLE_framebuffer_blit,
|
|
GLContext::EXT_framebuffer_blit,
|
|
GLContext::NV_framebuffer_blit,
|
|
GLContext::Extensions_End
|
|
}
|
|
},
|
|
{
|
|
// Check for just the multisample renderbuffer part of
|
|
// ARB_framebuffer_object
|
|
"framebuffer_multisample",
|
|
GLVersion::GL3,
|
|
GLESVersion::ES3,
|
|
GLContext::ARB_framebuffer_object,
|
|
{
|
|
GLContext::ANGLE_framebuffer_multisample,
|
|
GLContext::APPLE_framebuffer_multisample,
|
|
GLContext::EXT_framebuffer_multisample,
|
|
GLContext::EXT_multisampled_render_to_texture,
|
|
GLContext::Extensions_End
|
|
}
|
|
},
|
|
{
|
|
// ARB_framebuffer_object support
|
|
"framebuffer_object",
|
|
GLVersion::GL3,
|
|
GLESVersion::ES3,
|
|
GLContext::ARB_framebuffer_object,
|
|
{
|
|
GLContext::Extensions_End
|
|
}
|
|
},
|
|
{
|
|
// EXT_framebuffer_object/OES_framebuffer_object support
|
|
"framebuffer_object_EXT_OES",
|
|
GLVersion::GL3,
|
|
GLESVersion::ES2,
|
|
GLContext::Extension_None,
|
|
{
|
|
GLContext::EXT_framebuffer_object,
|
|
GLContext::OES_framebuffer_object,
|
|
GLContext::Extensions_End
|
|
}
|
|
},
|
|
{
|
|
"get_integer_indexed",
|
|
GLVersion::GL3,
|
|
GLESVersion::ES3,
|
|
GLContext::Extension_None,
|
|
{
|
|
GLContext::EXT_draw_buffers2,
|
|
GLContext::Extensions_End
|
|
}
|
|
},
|
|
{
|
|
"get_integer64_indexed",
|
|
GLVersion::GL3_2,
|
|
GLESVersion::ES3,
|
|
GLContext::Extension_None,
|
|
{
|
|
GLContext::Extensions_End
|
|
}
|
|
},
|
|
{
|
|
"get_query_object_i64v",
|
|
GLVersion::GL3_3,
|
|
GLESVersion::NONE,
|
|
GLContext::ARB_timer_query,
|
|
{
|
|
GLContext::ANGLE_timer_query,
|
|
GLContext::EXT_disjoint_timer_query,
|
|
GLContext::EXT_timer_query,
|
|
GLContext::Extensions_End
|
|
}
|
|
},
|
|
{
|
|
"get_query_object_iv",
|
|
GLVersion::GL2,
|
|
GLESVersion::NONE,
|
|
GLContext::Extension_None,
|
|
{
|
|
GLContext::Extensions_End
|
|
}
|
|
/*
|
|
* XXX_get_query_object_iv only provide GetQueryObjectiv provided by
|
|
* ARB_occlusion_query (added by OpenGL 2.0).
|
|
*/
|
|
},
|
|
{
|
|
"get_string_indexed",
|
|
GLVersion::GL3,
|
|
GLESVersion::ES3,
|
|
GLContext::Extension_None,
|
|
{
|
|
GLContext::Extensions_End
|
|
}
|
|
// glGetStringi
|
|
},
|
|
{
|
|
"gpu_shader4",
|
|
GLVersion::GL3,
|
|
GLESVersion::ES3,
|
|
GLContext::Extension_None,
|
|
{
|
|
GLContext::EXT_gpu_shader4,
|
|
GLContext::Extensions_End
|
|
}
|
|
},
|
|
{
|
|
"instanced_arrays",
|
|
GLVersion::GL3_3,
|
|
GLESVersion::ES3,
|
|
GLContext::Extension_None,
|
|
{
|
|
GLContext::ARB_instanced_arrays,
|
|
GLContext::NV_instanced_arrays,
|
|
GLContext::ANGLE_instanced_arrays,
|
|
GLContext::Extensions_End
|
|
}
|
|
},
|
|
{
|
|
"instanced_non_arrays",
|
|
GLVersion::GL3_3,
|
|
GLESVersion::ES3,
|
|
GLContext::Extension_None,
|
|
{
|
|
GLContext::ARB_instanced_arrays,
|
|
GLContext::Extensions_End
|
|
}
|
|
/* This is an expanded version of `instanced_arrays` that allows for all
|
|
* enabled active attrib arrays to have non-zero divisors.
|
|
* ANGLE_instanced_arrays and NV_instanced_arrays forbid this, but GLES3
|
|
* has no such restriction.
|
|
*/
|
|
},
|
|
{
|
|
"internalformat_query",
|
|
GLVersion::GL4_2,
|
|
GLESVersion::ES3,
|
|
GLContext::ARB_internalformat_query,
|
|
{
|
|
GLContext::Extensions_End
|
|
}
|
|
},
|
|
{
|
|
"invalidate_framebuffer",
|
|
GLVersion::GL4_3,
|
|
GLESVersion::ES3,
|
|
GLContext::ARB_invalidate_subdata,
|
|
{
|
|
GLContext::Extensions_End
|
|
}
|
|
},
|
|
{
|
|
"map_buffer_range",
|
|
GLVersion::GL3,
|
|
GLESVersion::ES3,
|
|
GLContext::ARB_map_buffer_range,
|
|
{
|
|
GLContext::Extensions_End
|
|
}
|
|
},
|
|
{
|
|
"occlusion_query",
|
|
GLVersion::GL2,
|
|
GLESVersion::NONE,
|
|
GLContext::Extension_None,
|
|
{
|
|
GLContext::Extensions_End
|
|
}
|
|
// XXX_occlusion_query depend on ARB_occlusion_query (added in OpenGL 2.0)
|
|
},
|
|
{
|
|
"occlusion_query_boolean",
|
|
kGLCoreVersionForES3Compat,
|
|
GLESVersion::ES3,
|
|
GLContext::ARB_ES3_compatibility,
|
|
{
|
|
GLContext::EXT_occlusion_query_boolean,
|
|
GLContext::Extensions_End
|
|
}
|
|
/*
|
|
* XXX_occlusion_query_boolean provide ANY_SAMPLES_PASSED_CONSERVATIVE,
|
|
* but EXT_occlusion_query_boolean is only a OpenGL ES extension. But
|
|
* it is supported on desktop if ARB_ES3_compatibility because
|
|
* EXT_occlusion_query_boolean (added in OpenGL ES 3.0).
|
|
*/
|
|
},
|
|
{
|
|
"occlusion_query2",
|
|
GLVersion::GL3_3,
|
|
GLESVersion::ES3,
|
|
GLContext::Extension_None,
|
|
{
|
|
GLContext::ARB_occlusion_query2,
|
|
GLContext::ARB_ES3_compatibility,
|
|
GLContext::EXT_occlusion_query_boolean,
|
|
GLContext::Extensions_End
|
|
}
|
|
/*
|
|
* XXX_occlusion_query2 (add in OpenGL 3.3) provide ANY_SAMPLES_PASSED,
|
|
* which is provided by ARB_occlusion_query2, EXT_occlusion_query_boolean
|
|
* (added in OpenGL ES 3.0) and ARB_ES3_compatibility
|
|
*/
|
|
},
|
|
{
|
|
"packed_depth_stencil",
|
|
GLVersion::GL3,
|
|
GLESVersion::ES3,
|
|
GLContext::Extension_None,
|
|
{
|
|
GLContext::EXT_packed_depth_stencil,
|
|
GLContext::OES_packed_depth_stencil,
|
|
GLContext::Extensions_End
|
|
}
|
|
},
|
|
{
|
|
"query_counter",
|
|
GLVersion::GL3_3,
|
|
GLESVersion::NONE,
|
|
GLContext::ARB_timer_query,
|
|
{
|
|
GLContext::ANGLE_timer_query,
|
|
GLContext::EXT_disjoint_timer_query,
|
|
// EXT_timer_query does NOT support GL_TIMESTAMP retrieval with
|
|
// QueryCounter.
|
|
GLContext::Extensions_End
|
|
}
|
|
},
|
|
{
|
|
"query_objects",
|
|
GLVersion::GL2,
|
|
GLESVersion::ES3,
|
|
GLContext::Extension_None,
|
|
{
|
|
GLContext::ANGLE_timer_query,
|
|
GLContext::EXT_disjoint_timer_query,
|
|
GLContext::EXT_occlusion_query_boolean,
|
|
GLContext::Extensions_End
|
|
}
|
|
/*
|
|
* XXX_query_objects only provide entry points commonly supported by
|
|
* ARB_occlusion_query (added in OpenGL 2.0), EXT_occlusion_query_boolean
|
|
* (added in OpenGL ES 3.0), and ARB_timer_query (added in OpenGL 3.3)
|
|
*/
|
|
},
|
|
{
|
|
"query_time_elapsed",
|
|
GLVersion::GL3_3,
|
|
GLESVersion::NONE,
|
|
GLContext::ARB_timer_query,
|
|
{
|
|
GLContext::ANGLE_timer_query,
|
|
GLContext::EXT_disjoint_timer_query,
|
|
GLContext::EXT_timer_query,
|
|
GLContext::Extensions_End
|
|
}
|
|
},
|
|
{
|
|
"read_buffer",
|
|
GLVersion::GL2,
|
|
GLESVersion::ES3,
|
|
GLContext::Extension_None,
|
|
{
|
|
GLContext::Extensions_End
|
|
}
|
|
},
|
|
{
|
|
"renderbuffer_color_float",
|
|
GLVersion::GL3,
|
|
GLESVersion::ES3,
|
|
GLContext::Extension_None,
|
|
{
|
|
GLContext::ARB_texture_float,
|
|
GLContext::EXT_color_buffer_float,
|
|
GLContext::Extensions_End
|
|
}
|
|
},
|
|
{
|
|
"renderbuffer_color_half_float",
|
|
GLVersion::GL3,
|
|
GLESVersion::ES3,
|
|
GLContext::Extension_None,
|
|
{
|
|
GLContext::ARB_texture_float,
|
|
GLContext::EXT_color_buffer_half_float,
|
|
GLContext::Extensions_End
|
|
}
|
|
},
|
|
{
|
|
"robustness",
|
|
GLVersion::NONE,
|
|
GLESVersion::NONE,
|
|
GLContext::Extension_None,
|
|
{
|
|
GLContext::ARB_robustness,
|
|
GLContext::EXT_robustness,
|
|
GLContext::Extensions_End
|
|
}
|
|
},
|
|
{
|
|
"sRGB_framebuffer",
|
|
GLVersion::GL3,
|
|
GLESVersion::ES3,
|
|
GLContext::ARB_framebuffer_sRGB,
|
|
{
|
|
GLContext::EXT_framebuffer_sRGB,
|
|
GLContext::EXT_sRGB_write_control,
|
|
GLContext::Extensions_End
|
|
}
|
|
},
|
|
{
|
|
"sRGB_texture",
|
|
GLVersion::GL2_1,
|
|
GLESVersion::ES3,
|
|
GLContext::Extension_None,
|
|
{
|
|
GLContext::EXT_sRGB,
|
|
GLContext::EXT_texture_sRGB,
|
|
GLContext::Extensions_End
|
|
}
|
|
},
|
|
{
|
|
"sampler_objects",
|
|
GLVersion::GL3_3,
|
|
GLESVersion::ES3,
|
|
GLContext::ARB_sampler_objects,
|
|
{
|
|
GLContext::Extensions_End
|
|
}
|
|
},
|
|
{
|
|
// Do we have separate DRAW and READ framebuffer bind points?
|
|
"split_framebuffer",
|
|
GLVersion::GL3,
|
|
GLESVersion::ES3,
|
|
GLContext::ARB_framebuffer_object,
|
|
{
|
|
GLContext::ANGLE_framebuffer_blit,
|
|
GLContext::APPLE_framebuffer_multisample,
|
|
GLContext::EXT_framebuffer_blit,
|
|
GLContext::NV_framebuffer_blit,
|
|
GLContext::Extensions_End
|
|
}
|
|
},
|
|
{
|
|
"standard_derivatives",
|
|
GLVersion::GL2,
|
|
GLESVersion::ES3,
|
|
GLContext::Extension_None,
|
|
{
|
|
GLContext::OES_standard_derivatives,
|
|
GLContext::Extensions_End
|
|
}
|
|
},
|
|
{
|
|
"sync",
|
|
GLVersion::GL3_2,
|
|
GLESVersion::ES3,
|
|
GLContext::Extension_None,
|
|
{
|
|
GLContext::ARB_sync,
|
|
GLContext::APPLE_sync,
|
|
GLContext::Extensions_End
|
|
}
|
|
},
|
|
{
|
|
"texture_3D",
|
|
GLVersion::GL1_2,
|
|
GLESVersion::ES3,
|
|
GLContext::Extension_None,
|
|
{
|
|
GLContext::EXT_texture3D,
|
|
GLContext::OES_texture_3D,
|
|
GLContext::Extensions_End
|
|
}
|
|
},
|
|
{
|
|
"texture_3D_compressed",
|
|
GLVersion::GL1_3,
|
|
GLESVersion::ES3,
|
|
GLContext::Extension_None,
|
|
{
|
|
GLContext::ARB_texture_compression,
|
|
GLContext::OES_texture_3D,
|
|
GLContext::Extensions_End
|
|
}
|
|
},
|
|
{
|
|
"texture_3D_copy",
|
|
GLVersion::GL1_2,
|
|
GLESVersion::ES3,
|
|
GLContext::Extension_None,
|
|
{
|
|
GLContext::EXT_copy_texture,
|
|
GLContext::OES_texture_3D,
|
|
GLContext::Extensions_End
|
|
}
|
|
},
|
|
{
|
|
"texture_float",
|
|
GLVersion::GL3,
|
|
GLESVersion::ES3,
|
|
GLContext::Extension_None,
|
|
{
|
|
GLContext::ARB_texture_float,
|
|
GLContext::OES_texture_float,
|
|
GLContext::Extensions_End
|
|
}
|
|
},
|
|
{
|
|
"texture_float_linear",
|
|
GLVersion::GL3_1,
|
|
GLESVersion::ES3,
|
|
GLContext::Extension_None,
|
|
{
|
|
GLContext::ARB_texture_float,
|
|
GLContext::OES_texture_float_linear,
|
|
GLContext::Extensions_End
|
|
}
|
|
},
|
|
{
|
|
"texture_half_float",
|
|
GLVersion::GL3,
|
|
GLESVersion::ES3,
|
|
GLContext::Extension_None,
|
|
{
|
|
GLContext::ARB_half_float_pixel,
|
|
GLContext::ARB_texture_float,
|
|
GLContext::NV_half_float,
|
|
GLContext::Extensions_End
|
|
}
|
|
/**
|
|
* We are not including OES_texture_half_float in this feature, because:
|
|
* GL_HALF_FLOAT = 0x140B
|
|
* GL_HALF_FLOAT_ARB = 0x140B == GL_HALF_FLOAT
|
|
* GL_HALF_FLOAT_NV = 0x140B == GL_HALF_FLOAT
|
|
* GL_HALF_FLOAT_OES = 0x8D61 != GL_HALF_FLOAT
|
|
* WebGL handles this specifically with an OES_texture_half_float check.
|
|
*/
|
|
},
|
|
{
|
|
"texture_half_float_linear",
|
|
GLVersion::GL3_1,
|
|
GLESVersion::ES3,
|
|
GLContext::Extension_None,
|
|
{
|
|
GLContext::ARB_half_float_pixel,
|
|
GLContext::ARB_texture_float,
|
|
GLContext::NV_half_float,
|
|
GLContext::OES_texture_half_float_linear,
|
|
GLContext::Extensions_End
|
|
}
|
|
},
|
|
{
|
|
"texture_non_power_of_two",
|
|
GLVersion::GL2,
|
|
GLESVersion::ES3,
|
|
GLContext::Extension_None,
|
|
{
|
|
GLContext::ARB_texture_non_power_of_two,
|
|
GLContext::OES_texture_npot,
|
|
GLContext::Extensions_End
|
|
}
|
|
},
|
|
{
|
|
"texture_storage",
|
|
GLVersion::GL4_2,
|
|
GLESVersion::ES3,
|
|
GLContext::ARB_texture_storage,
|
|
{
|
|
/*
|
|
* Not including GL_EXT_texture_storage here because it
|
|
* doesn't guarantee glTexStorage3D, which is required for
|
|
* WebGL 2.
|
|
*/
|
|
GLContext::Extensions_End
|
|
}
|
|
},
|
|
{
|
|
"texture_swizzle",
|
|
GLVersion::GL3_3,
|
|
GLESVersion::ES3,
|
|
GLContext::ARB_texture_swizzle,
|
|
{
|
|
GLContext::Extensions_End
|
|
}
|
|
},
|
|
{
|
|
"transform_feedback2",
|
|
GLVersion::GL4,
|
|
GLESVersion::ES3,
|
|
GLContext::ARB_transform_feedback2,
|
|
{
|
|
GLContext::NV_transform_feedback2,
|
|
GLContext::Extensions_End
|
|
}
|
|
},
|
|
{
|
|
"uniform_buffer_object",
|
|
GLVersion::GL3_1,
|
|
GLESVersion::ES3,
|
|
GLContext::ARB_uniform_buffer_object,
|
|
{
|
|
GLContext::Extensions_End
|
|
}
|
|
},
|
|
{
|
|
"uniform_matrix_nonsquare",
|
|
GLVersion::GL2_1,
|
|
GLESVersion::ES3,
|
|
GLContext::Extension_None,
|
|
{
|
|
GLContext::Extensions_End
|
|
}
|
|
},
|
|
{
|
|
"vertex_array_object",
|
|
GLVersion::GL3,
|
|
GLESVersion::ES3,
|
|
GLContext::ARB_vertex_array_object, // ARB extension
|
|
{
|
|
GLContext::OES_vertex_array_object,
|
|
GLContext::APPLE_vertex_array_object,
|
|
GLContext::Extensions_End
|
|
}
|
|
}
|
|
};
|
|
|
|
static inline const FeatureInfo&
|
|
GetFeatureInfo(GLFeature feature)
|
|
{
|
|
static_assert(MOZ_ARRAY_LENGTH(sFeatureInfoArr) == size_t(GLFeature::EnumMax),
|
|
"Mismatched lengths for sFeatureInfoInfos and GLFeature enums");
|
|
|
|
MOZ_ASSERT(feature < GLFeature::EnumMax,
|
|
"GLContext::GetFeatureInfoInfo : unknown <feature>");
|
|
|
|
return sFeatureInfoArr[size_t(feature)];
|
|
}
|
|
|
|
static inline uint32_t
|
|
ProfileVersionForFeature(GLFeature feature, ContextProfile profile)
|
|
{
|
|
MOZ_ASSERT(profile != ContextProfile::Unknown,
|
|
"GLContext::ProfileVersionForFeature : unknown <profile>");
|
|
|
|
const FeatureInfo& featureInfo = GetFeatureInfo(feature);
|
|
|
|
if (profile == ContextProfile::OpenGLES)
|
|
return (uint32_t)featureInfo.mOpenGLESVersion;
|
|
|
|
return (uint32_t)featureInfo.mOpenGLVersion;
|
|
}
|
|
|
|
bool
|
|
IsFeaturePartOfProfileVersion(GLFeature feature,
|
|
ContextProfile profile, unsigned int version)
|
|
{
|
|
unsigned int profileVersion = ProfileVersionForFeature(feature, profile);
|
|
|
|
/**
|
|
* if `profileVersion` is zero, it means that no version of the profile
|
|
* added support for the feature.
|
|
*/
|
|
return profileVersion && version >= profileVersion;
|
|
}
|
|
|
|
bool
|
|
GLContext::IsFeatureProvidedByCoreSymbols(GLFeature feature)
|
|
{
|
|
if (IsFeaturePartOfProfileVersion(feature, mProfile, mVersion))
|
|
return true;
|
|
|
|
if (IsExtensionSupported(GetFeatureInfo(feature).mARBExtensionWithoutARBSuffix))
|
|
return true;
|
|
|
|
return false;
|
|
}
|
|
|
|
const char*
|
|
GLContext::GetFeatureName(GLFeature feature)
|
|
{
|
|
return GetFeatureInfo(feature).mName;
|
|
}
|
|
|
|
void
|
|
GLContext::InitFeatures()
|
|
{
|
|
for (size_t featureId = 0; featureId < size_t(GLFeature::EnumMax); featureId++) {
|
|
GLFeature feature = GLFeature(featureId);
|
|
|
|
if (IsFeaturePartOfProfileVersion(feature, mProfile, mVersion)) {
|
|
mAvailableFeatures[featureId] = true;
|
|
continue;
|
|
}
|
|
|
|
mAvailableFeatures[featureId] = false;
|
|
|
|
const FeatureInfo& featureInfo = GetFeatureInfo(feature);
|
|
|
|
if (IsExtensionSupported(featureInfo.mARBExtensionWithoutARBSuffix)) {
|
|
mAvailableFeatures[featureId] = true;
|
|
continue;
|
|
}
|
|
|
|
for (size_t j = 0; true; j++) {
|
|
MOZ_ASSERT(j < kMAX_EXTENSION_GROUP_SIZE,
|
|
"kMAX_EXTENSION_GROUP_SIZE too small");
|
|
|
|
if (featureInfo.mExtensions[j] == GLContext::Extensions_End)
|
|
break;
|
|
|
|
if (IsExtensionSupported(featureInfo.mExtensions[j])) {
|
|
mAvailableFeatures[featureId] = true;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (WorkAroundDriverBugs()) {
|
|
#ifdef XP_MACOSX
|
|
// MacOSX 10.6 reports to support EXT_framebuffer_sRGB and EXT_texture_sRGB but
|
|
// fails to convert from sRGB to linear when reading from an sRGB texture attached
|
|
// to an FBO. (bug 843668)
|
|
if (!nsCocoaFeatures::OnLionOrLater())
|
|
MarkUnsupported(GLFeature::sRGB_framebuffer);
|
|
#endif // XP_MACOSX
|
|
}
|
|
}
|
|
|
|
void
|
|
GLContext::MarkUnsupported(GLFeature feature)
|
|
{
|
|
mAvailableFeatures[size_t(feature)] = false;
|
|
|
|
const FeatureInfo& featureInfo = GetFeatureInfo(feature);
|
|
|
|
for (size_t i = 0; true; i++) {
|
|
MOZ_ASSERT(i < kMAX_EXTENSION_GROUP_SIZE, "kMAX_EXTENSION_GROUP_SIZE too small");
|
|
|
|
if (featureInfo.mExtensions[i] == GLContext::Extensions_End)
|
|
break;
|
|
|
|
MarkExtensionUnsupported(featureInfo.mExtensions[i]);
|
|
}
|
|
|
|
MOZ_ASSERT(!IsSupported(feature), "GLContext::MarkUnsupported has failed!");
|
|
|
|
NS_WARNING(nsPrintfCString("%s marked as unsupported",
|
|
GetFeatureName(feature)).get());
|
|
}
|
|
|
|
} /* namespace gl */
|
|
} /* namespace mozilla */
|