mirror of
https://github.com/servo/servo.git
synced 2025-08-04 13:10:20 +01:00
webgl: Add feature to store backtraces for each WebGL API call for easier debugging.
This commit is contained in:
parent
515afac456
commit
5dc80dd07a
12 changed files with 82 additions and 16 deletions
|
@ -16,6 +16,7 @@ debugmozjs = ['mozjs/debugmozjs']
|
|||
unstable = []
|
||||
unrooted_must_root_lint = ["script_plugins/unrooted_must_root_lint"]
|
||||
default = ["unrooted_must_root_lint"]
|
||||
webgl_backtrace = ["backtrace", "canvas_traits/webgl_backtrace"]
|
||||
|
||||
[build-dependencies]
|
||||
cmake = "0.1"
|
||||
|
@ -29,6 +30,7 @@ tinyfiledialogs = "3.0"
|
|||
[dependencies]
|
||||
app_units = "0.7"
|
||||
audio-video-metadata = "0.1.4"
|
||||
backtrace = {version = "0.3", optional = true}
|
||||
base64 = "0.6"
|
||||
bitflags = "1.0"
|
||||
bluetooth_traits = {path = "../bluetooth_traits"}
|
||||
|
|
|
@ -2,9 +2,11 @@
|
|||
* 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/. */
|
||||
|
||||
#[cfg(feature = "webgl_backtrace")]
|
||||
use backtrace::Backtrace;
|
||||
use byteorder::{ByteOrder, NativeEndian, WriteBytesExt};
|
||||
use canvas_traits::canvas::{byte_swap, multiply_u8_pixel};
|
||||
use canvas_traits::webgl::{DOMToTextureCommand, Parameter};
|
||||
use canvas_traits::webgl::{DOMToTextureCommand, Parameter, WebGLCommandBacktrace};
|
||||
use canvas_traits::webgl::{TexParameter, WebGLCommand, WebGLContextShareMode, WebGLError};
|
||||
use canvas_traits::webgl::{WebGLFramebufferBindingRequest, WebGLMsg, WebGLMsgSender};
|
||||
use canvas_traits::webgl::{WebGLProgramId, WebGLResult, WebGLSLVersion, WebGLSender};
|
||||
|
@ -316,7 +318,7 @@ impl WebGLRenderingContext {
|
|||
|
||||
#[inline]
|
||||
pub fn send_command(&self, command: WebGLCommand) {
|
||||
self.webgl_sender.send(command).unwrap();
|
||||
self.webgl_sender.send(command, capture_webgl_backtrace(self)).unwrap();
|
||||
}
|
||||
|
||||
#[inline]
|
||||
|
@ -1189,6 +1191,25 @@ impl WebGLRenderingContext {
|
|||
}
|
||||
}
|
||||
|
||||
#[cfg(not(feature = "webgl_backtrace"))]
|
||||
#[inline]
|
||||
pub fn capture_webgl_backtrace<T: DomObject>(_: &T) -> WebGLCommandBacktrace {
|
||||
WebGLCommandBacktrace {}
|
||||
}
|
||||
|
||||
#[cfg(feature = "webgl_backtrace")]
|
||||
#[cfg_attr(feature = "webgl_backtrace", allow(unsafe_code))]
|
||||
pub fn capture_webgl_backtrace<T: DomObject>(obj: &T) -> WebGLCommandBacktrace {
|
||||
let bt = Backtrace::new();
|
||||
unsafe {
|
||||
capture_stack!(in(obj.global().get_cx()) let stack);
|
||||
WebGLCommandBacktrace {
|
||||
backtrace: format!("{:?}", bt),
|
||||
js_backtrace: stack.and_then(|s| s.as_string(None)),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl Drop for WebGLRenderingContext {
|
||||
fn drop(&mut self) {
|
||||
let _ = self.webgl_sender.send_remove();
|
||||
|
@ -1521,9 +1542,10 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext {
|
|||
let (sender, receiver) = webgl_channel().unwrap();
|
||||
|
||||
// If the send does not succeed, assume context lost
|
||||
let backtrace = capture_webgl_backtrace(self);
|
||||
if self
|
||||
.webgl_sender
|
||||
.send(WebGLCommand::GetContextAttributes(sender))
|
||||
.send(WebGLCommand::GetContextAttributes(sender), backtrace)
|
||||
.is_err()
|
||||
{
|
||||
return None;
|
||||
|
|
|
@ -19,6 +19,8 @@
|
|||
|
||||
extern crate app_units;
|
||||
extern crate audio_video_metadata;
|
||||
#[cfg(feature = "webgl_backtrace")]
|
||||
extern crate backtrace;
|
||||
extern crate base64;
|
||||
#[macro_use]
|
||||
extern crate bitflags;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue