mirror of
https://github.com/servo/servo.git
synced 2025-06-13 10:54:29 +00:00
Make GL/GLES decisions based on the API in use.
This commit is contained in:
parent
812bf8d816
commit
dbaed5ed92
13 changed files with 83 additions and 52 deletions
|
@ -46,7 +46,7 @@ use canvas_traits::canvas::{
|
|||
};
|
||||
use canvas_traits::canvas::{CompositionOrBlending, LineCapStyle, LineJoinStyle, RepetitionStyle};
|
||||
use canvas_traits::webgl::GLLimits;
|
||||
use canvas_traits::webgl::{ActiveAttribInfo, ActiveUniformInfo, TexDataType, TexFormat};
|
||||
use canvas_traits::webgl::{ActiveAttribInfo, ActiveUniformInfo, GlType, TexDataType, TexFormat};
|
||||
use canvas_traits::webgl::{WebGLBufferId, WebGLChan, WebGLContextShareMode, WebGLError};
|
||||
use canvas_traits::webgl::{WebGLFramebufferId, WebGLMsgSender, WebGLPipeline, WebGLProgramId};
|
||||
use canvas_traits::webgl::{WebGLReceiver, WebGLRenderbufferId, WebGLSLVersion, WebGLSender};
|
||||
|
@ -439,7 +439,7 @@ unsafe_no_jsmanaged_fields!(StorageType);
|
|||
unsafe_no_jsmanaged_fields!(CanvasGradientStop, LinearGradientStyle, RadialGradientStyle);
|
||||
unsafe_no_jsmanaged_fields!(LineCapStyle, LineJoinStyle, CompositionOrBlending);
|
||||
unsafe_no_jsmanaged_fields!(RepetitionStyle);
|
||||
unsafe_no_jsmanaged_fields!(WebGLError, GLLimits);
|
||||
unsafe_no_jsmanaged_fields!(WebGLError, GLLimits, GlType);
|
||||
unsafe_no_jsmanaged_fields!(TimeProfilerChan);
|
||||
unsafe_no_jsmanaged_fields!(MemProfilerChan);
|
||||
unsafe_no_jsmanaged_fields!(PseudoElement);
|
||||
|
|
|
@ -7,7 +7,7 @@ use crate::dom::bindings::codegen::Bindings::EXTShaderTextureLodBinding;
|
|||
use crate::dom::bindings::reflector::{reflect_dom_object, DomObject, Reflector};
|
||||
use crate::dom::bindings::root::DomRoot;
|
||||
use crate::dom::webglrenderingcontext::WebGLRenderingContext;
|
||||
use canvas_traits::webgl::{is_gles, WebGLVersion};
|
||||
use canvas_traits::webgl::WebGLVersion;
|
||||
use dom_struct::dom_struct;
|
||||
|
||||
#[dom_struct]
|
||||
|
@ -40,7 +40,7 @@ impl WebGLExtension for EXTShaderTextureLod {
|
|||
|
||||
fn is_supported(ext: &WebGLExtensions) -> bool {
|
||||
// This extension is always available on desktop GL.
|
||||
!is_gles() || ext.supports_gl_extension("GL_EXT_shader_texture_lod")
|
||||
!ext.is_gles() || ext.supports_gl_extension("GL_EXT_shader_texture_lod")
|
||||
}
|
||||
|
||||
fn enable(_ext: &WebGLExtensions) {}
|
||||
|
|
|
@ -7,7 +7,7 @@ use crate::dom::bindings::codegen::Bindings::OESElementIndexUintBinding;
|
|||
use crate::dom::bindings::reflector::{reflect_dom_object, DomObject, Reflector};
|
||||
use crate::dom::bindings::root::DomRoot;
|
||||
use crate::dom::webglrenderingcontext::WebGLRenderingContext;
|
||||
use canvas_traits::webgl::{is_gles, WebGLVersion};
|
||||
use canvas_traits::webgl::WebGLVersion;
|
||||
use dom_struct::dom_struct;
|
||||
|
||||
#[dom_struct]
|
||||
|
@ -40,7 +40,7 @@ impl WebGLExtension for OESElementIndexUint {
|
|||
|
||||
fn is_supported(ext: &WebGLExtensions) -> bool {
|
||||
// This extension is always available in desktop OpenGL.
|
||||
!is_gles() || ext.supports_gl_extension("GL_OES_element_index_uint")
|
||||
!ext.is_gles() || ext.supports_gl_extension("GL_OES_element_index_uint")
|
||||
}
|
||||
|
||||
fn enable(ext: &WebGLExtensions) {
|
||||
|
|
|
@ -8,7 +8,7 @@ use crate::dom::bindings::codegen::Bindings::OESStandardDerivativesBinding::OESS
|
|||
use crate::dom::bindings::reflector::{reflect_dom_object, DomObject, Reflector};
|
||||
use crate::dom::bindings::root::DomRoot;
|
||||
use crate::dom::webglrenderingcontext::WebGLRenderingContext;
|
||||
use canvas_traits::webgl::{is_gles, WebGLVersion};
|
||||
use canvas_traits::webgl::WebGLVersion;
|
||||
use dom_struct::dom_struct;
|
||||
|
||||
#[dom_struct]
|
||||
|
@ -40,7 +40,7 @@ impl WebGLExtension for OESStandardDerivatives {
|
|||
|
||||
fn is_supported(ext: &WebGLExtensions) -> bool {
|
||||
// The standard derivatives are always available in desktop OpenGL.
|
||||
!is_gles() || ext.supports_any_gl_extension(&["GL_OES_standard_derivatives"])
|
||||
!ext.is_gles() || ext.supports_any_gl_extension(&["GL_OES_standard_derivatives"])
|
||||
}
|
||||
|
||||
fn enable(ext: &WebGLExtensions) {
|
||||
|
|
|
@ -18,7 +18,7 @@ use crate::dom::oestexturehalffloat::OESTextureHalfFloat;
|
|||
use crate::dom::webglcolorbufferfloat::WEBGLColorBufferFloat;
|
||||
use crate::dom::webglrenderingcontext::WebGLRenderingContext;
|
||||
use crate::dom::webgltexture::TexCompression;
|
||||
use canvas_traits::webgl::WebGLVersion;
|
||||
use canvas_traits::webgl::{GlType, WebGLVersion};
|
||||
use fnv::{FnvHashMap, FnvHashSet};
|
||||
use gleam::gl::{self, GLenum};
|
||||
use js::jsapi::JSObject;
|
||||
|
@ -146,14 +146,16 @@ pub struct WebGLExtensions {
|
|||
extensions: DomRefCell<HashMap<String, Box<dyn WebGLExtensionWrapper>>>,
|
||||
features: DomRefCell<WebGLExtensionFeatures>,
|
||||
webgl_version: WebGLVersion,
|
||||
api_type: GlType,
|
||||
}
|
||||
|
||||
impl WebGLExtensions {
|
||||
pub fn new(webgl_version: WebGLVersion) -> WebGLExtensions {
|
||||
pub fn new(webgl_version: WebGLVersion, api_type: GlType) -> WebGLExtensions {
|
||||
Self {
|
||||
extensions: DomRefCell::new(HashMap::new()),
|
||||
features: DomRefCell::new(WebGLExtensionFeatures::new(webgl_version)),
|
||||
webgl_version,
|
||||
api_type,
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -425,6 +427,10 @@ impl WebGLExtensions {
|
|||
}
|
||||
type_
|
||||
}
|
||||
|
||||
pub fn is_gles(&self) -> bool {
|
||||
self.api_type == GlType::Gles
|
||||
}
|
||||
}
|
||||
|
||||
// Helper structs
|
||||
|
|
|
@ -14,7 +14,7 @@ use crate::dom::bindings::root::DomRoot;
|
|||
use crate::dom::webglobject::WebGLObject;
|
||||
use crate::dom::webglrenderingcontext::WebGLRenderingContext;
|
||||
use canvas_traits::webgl::{
|
||||
is_gles, webgl_channel, WebGLCommand, WebGLError, WebGLRenderbufferId, WebGLResult,
|
||||
webgl_channel, GlType, WebGLCommand, WebGLError, WebGLRenderbufferId, WebGLResult,
|
||||
};
|
||||
use dom_struct::dom_struct;
|
||||
use std::cell::Cell;
|
||||
|
@ -120,7 +120,15 @@ impl WebGLRenderbuffer {
|
|||
self.ever_bound.get()
|
||||
}
|
||||
|
||||
pub fn storage(&self, internal_format: u32, width: i32, height: i32) -> WebGLResult<()> {
|
||||
pub fn storage(
|
||||
&self,
|
||||
api_type: GlType,
|
||||
internal_format: u32,
|
||||
width: i32,
|
||||
height: i32,
|
||||
) -> WebGLResult<()> {
|
||||
let is_gles = api_type == GlType::Gles;
|
||||
|
||||
// Validate the internal_format, and save it for completeness
|
||||
// validation.
|
||||
let actual_format = match internal_format {
|
||||
|
@ -131,7 +139,7 @@ impl WebGLRenderbuffer {
|
|||
constants::DEPTH_STENCIL => WebGL2RenderingContextConstants::DEPTH24_STENCIL8,
|
||||
constants::RGB5_A1 => {
|
||||
// 16-bit RGBA formats are not supported on desktop GL.
|
||||
if is_gles() {
|
||||
if is_gles {
|
||||
constants::RGB5_A1
|
||||
} else {
|
||||
WebGL2RenderingContextConstants::RGBA8
|
||||
|
@ -139,7 +147,7 @@ impl WebGLRenderbuffer {
|
|||
},
|
||||
constants::RGB565 => {
|
||||
// RGB565 is not supported on desktop GL.
|
||||
if is_gles() {
|
||||
if is_gles {
|
||||
constants::RGB565
|
||||
} else {
|
||||
WebGL2RenderingContextConstants::RGB8
|
||||
|
|
|
@ -52,8 +52,8 @@ use crate::dom::window::Window;
|
|||
use backtrace::Backtrace;
|
||||
use canvas_traits::webgl::WebGLError::*;
|
||||
use canvas_traits::webgl::{
|
||||
webgl_channel, AlphaTreatment, DOMToTextureCommand, GLContextAttributes, GLLimits, Parameter,
|
||||
TexDataType, TexFormat, TexParameter, WebGLCommand, WebGLCommandBacktrace,
|
||||
webgl_channel, AlphaTreatment, DOMToTextureCommand, GLContextAttributes, GLLimits, GlType,
|
||||
Parameter, TexDataType, TexFormat, TexParameter, WebGLCommand, WebGLCommandBacktrace,
|
||||
WebGLContextShareMode, WebGLError, WebGLFramebufferBindingRequest, WebGLMsg, WebGLMsgSender,
|
||||
WebGLProgramId, WebGLResult, WebGLSLVersion, WebGLSender, WebGLVersion, WebVRCommand,
|
||||
YAxisTreatment,
|
||||
|
@ -166,6 +166,7 @@ pub struct WebGLRenderingContext {
|
|||
default_vao: DomOnceCell<WebGLVertexArrayObjectOES>,
|
||||
current_vao: MutNullableDom<WebGLVertexArrayObjectOES>,
|
||||
textures: Textures,
|
||||
api_type: GlType,
|
||||
}
|
||||
|
||||
impl WebGLRenderingContext {
|
||||
|
@ -216,11 +217,12 @@ impl WebGLRenderingContext {
|
|||
// what was requested
|
||||
size: Cell::new(size),
|
||||
current_clear_color: Cell::new((0.0, 0.0, 0.0, 0.0)),
|
||||
extension_manager: WebGLExtensions::new(webgl_version),
|
||||
extension_manager: WebGLExtensions::new(webgl_version, ctx_data.api_type),
|
||||
capabilities: Default::default(),
|
||||
default_vao: Default::default(),
|
||||
current_vao: Default::default(),
|
||||
textures: Textures::new(max_combined_texture_image_units),
|
||||
api_type: ctx_data.api_type,
|
||||
}
|
||||
})
|
||||
}
|
||||
|
@ -2106,6 +2108,7 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext {
|
|||
handle_potential_webgl_error!(
|
||||
self,
|
||||
shader.compile(
|
||||
self.api_type,
|
||||
self.webgl_version,
|
||||
self.glsl_version,
|
||||
&self.limits,
|
||||
|
@ -4031,7 +4034,10 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext {
|
|||
self.bound_renderbuffer.get().ok_or(InvalidOperation),
|
||||
return
|
||||
);
|
||||
handle_potential_webgl_error!(self, rb.storage(internal_format, width, height));
|
||||
handle_potential_webgl_error!(
|
||||
self,
|
||||
rb.storage(self.api_type, internal_format, width, height)
|
||||
);
|
||||
if let Some(fb) = self.bound_framebuffer.get() {
|
||||
fb.invalidate_renderbuffer(&*rb);
|
||||
}
|
||||
|
|
|
@ -14,7 +14,7 @@ use crate::dom::webgl_extensions::ext::oesstandardderivatives::OESStandardDeriva
|
|||
use crate::dom::webgl_extensions::WebGLExtensions;
|
||||
use crate::dom::webglobject::WebGLObject;
|
||||
use crate::dom::webglrenderingcontext::WebGLRenderingContext;
|
||||
use canvas_traits::webgl::{webgl_channel, WebGLVersion};
|
||||
use canvas_traits::webgl::{webgl_channel, GlType, WebGLVersion};
|
||||
use canvas_traits::webgl::{GLLimits, WebGLCommand, WebGLError};
|
||||
use canvas_traits::webgl::{WebGLResult, WebGLSLVersion, WebGLShaderId};
|
||||
use dom_struct::dom_struct;
|
||||
|
@ -93,6 +93,7 @@ impl WebGLShader {
|
|||
/// glCompileShader
|
||||
pub fn compile(
|
||||
&self,
|
||||
api_type: GlType,
|
||||
webgl_version: WebGLVersion,
|
||||
glsl_version: WebGLSLVersion,
|
||||
limits: &GLLimits,
|
||||
|
@ -122,7 +123,7 @@ impl WebGLShader {
|
|||
};
|
||||
let validator = match webgl_version {
|
||||
WebGLVersion::WebGL1 => {
|
||||
let output_format = if cfg!(any(target_os = "android", target_os = "ios")) {
|
||||
let output_format = if api_type == GlType::Gles {
|
||||
Output::Essl
|
||||
} else {
|
||||
Output::Glsl
|
||||
|
@ -130,7 +131,7 @@ impl WebGLShader {
|
|||
ShaderValidator::for_webgl(self.gl_type, output_format, ¶ms).unwrap()
|
||||
},
|
||||
WebGLVersion::WebGL2 => {
|
||||
let output_format = if cfg!(any(target_os = "android", target_os = "ios")) {
|
||||
let output_format = if api_type == GlType::Gles {
|
||||
Output::Essl
|
||||
} else {
|
||||
match (glsl_version.major, glsl_version.minor) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue