mirror of
https://github.com/servo/servo.git
synced 2025-08-03 04:30:10 +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
|
@ -9,6 +9,9 @@ publish = false
|
|||
name = "canvas"
|
||||
path = "lib.rs"
|
||||
|
||||
[features]
|
||||
webgl_backtrace = ["canvas_traits/webgl_backtrace"]
|
||||
|
||||
[dependencies]
|
||||
azure = {git = "https://github.com/servo/rust-azure"}
|
||||
canvas_traits = {path = "../canvas_traits"}
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
* 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/. */
|
||||
|
||||
use canvas_traits::webgl::{WebGLCommand, WebGLVersion};
|
||||
use canvas_traits::webgl::{WebGLCommand, WebGLVersion, WebGLCommandBacktrace};
|
||||
use compositing::compositor_thread::{CompositorProxy, self};
|
||||
use euclid::Size2D;
|
||||
use gleam::gl;
|
||||
|
@ -144,13 +144,18 @@ impl GLContextWrapper {
|
|||
}
|
||||
}
|
||||
|
||||
pub fn apply_command(&self, cmd: WebGLCommand, state: &mut GLState) {
|
||||
pub fn apply_command(
|
||||
&self,
|
||||
cmd: WebGLCommand,
|
||||
backtrace: WebGLCommandBacktrace,
|
||||
state: &mut GLState
|
||||
) {
|
||||
match *self {
|
||||
GLContextWrapper::Native(ref ctx) => {
|
||||
WebGLImpl::apply(ctx, state, cmd);
|
||||
WebGLImpl::apply(ctx, state, cmd, backtrace);
|
||||
}
|
||||
GLContextWrapper::OSMesa(ref ctx) => {
|
||||
WebGLImpl::apply(ctx, state, cmd);
|
||||
WebGLImpl::apply(ctx, state, cmd, backtrace);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -137,8 +137,8 @@ impl<VR: WebVRRenderHandler + 'static> WebGLThread<VR> {
|
|||
WebGLMsg::RemoveContext(ctx_id) => {
|
||||
self.remove_webgl_context(ctx_id);
|
||||
},
|
||||
WebGLMsg::WebGLCommand(ctx_id, command) => {
|
||||
self.handle_webgl_command(ctx_id, command);
|
||||
WebGLMsg::WebGLCommand(ctx_id, command, backtrace) => {
|
||||
self.handle_webgl_command(ctx_id, command, backtrace);
|
||||
},
|
||||
WebGLMsg::WebVRCommand(ctx_id, command) => {
|
||||
self.handle_webvr_command(ctx_id, command);
|
||||
|
@ -164,10 +164,15 @@ impl<VR: WebVRRenderHandler + 'static> WebGLThread<VR> {
|
|||
}
|
||||
|
||||
/// Handles a WebGLCommand for a specific WebGLContext
|
||||
fn handle_webgl_command(&mut self, context_id: WebGLContextId, command: WebGLCommand) {
|
||||
fn handle_webgl_command(
|
||||
&mut self,
|
||||
context_id: WebGLContextId,
|
||||
command: WebGLCommand,
|
||||
backtrace: WebGLCommandBacktrace,
|
||||
) {
|
||||
let data = Self::make_current_if_needed_mut(context_id, &mut self.contexts, &mut self.bound_context_id);
|
||||
if let Some(data) = data {
|
||||
data.ctx.apply_command(command, &mut data.state);
|
||||
data.ctx.apply_command(command, backtrace, &mut data.state);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -670,7 +675,8 @@ impl WebGLImpl {
|
|||
pub fn apply<Native: NativeGLContextMethods>(
|
||||
ctx: &GLContext<Native>,
|
||||
state: &mut GLState,
|
||||
command: WebGLCommand
|
||||
command: WebGLCommand,
|
||||
_backtrace: WebGLCommandBacktrace,
|
||||
) {
|
||||
match command {
|
||||
WebGLCommand::GetContextAttributes(ref sender) =>
|
||||
|
@ -1191,7 +1197,14 @@ impl WebGLImpl {
|
|||
// TODO: update test expectations in order to enable debug assertions
|
||||
let error = ctx.gl().get_error();
|
||||
if error != gl::NO_ERROR {
|
||||
error!("Last GL operation failed: {:?}", command)
|
||||
error!("Last GL operation failed: {:?}", command);
|
||||
#[cfg(feature = "webgl_backtrace")]
|
||||
{
|
||||
error!("Backtrace from failed WebGL API:\n{}", _backtrace.backtrace);
|
||||
if let Some(backtrace) = _backtrace.js_backtrace {
|
||||
error!("JS backtrace from failed WebGL API:\n{}", backtrace);
|
||||
}
|
||||
}
|
||||
}
|
||||
assert_eq!(error, gl::NO_ERROR, "Unexpected WebGL error: 0x{:x} ({})", error, error);
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue