(исходники от 102.15.1 но думаю в 115 всё так же)
Собственно начинаем с C++
Файл gfx/webrender_bindings/RenderThreadOGL.cpp
функция RendererOGL::UpateAndRender()
- в середине есть вызов
if (!wr_renderer_render(mRenderer, size.width, size.height, bufferAge, aOutStats, &dirtyRects)) {
mRenderer - это поле в классе RendererOGL, определено так:
wr::Renderer* mRenderer;
wr это namespace в котором много всего разного есть.
Функция wr_renderer_render находится в файле gfx/webrender_bindings/src/bindings.rs
pub extern "C" fn wr_renderer_render(
renderer: &mut Renderer,
width: i32,
height: i32,
buffer_age: usize,
out_stats: &mut RendererStats,
out_dirty_rects: &mut ThinVec<DeviceIntRect>,
) -> bool {
match renderer.render(DeviceIntSize::new(width, height), buffer_age) {
Ok(results) => {
*out_stats = results.stats;
out_dirty_rects.extend(results.dirty_rects);
true
},
Err(errors) => {
for e in errors {
warn!(" Failed to render: {:?}", e);
let msg = CString::new(format!("wr_renderer_render: {:?}", e)).unwrap();
unsafe {
gfx_critical_note(msg.as_ptr());
}
}
false
},
}
}
Как я понимаю match это аналог switch и она вызывает метод render
из той штуки которую ей дали первым аргументом.
Касательно типа этого аргумента (напомню, это поле wr::Renderer* mRenderer
из класса RendererOGL
) в С++ файлах нашлось только упоминание struct Renderer;
(без тела) в файле gfx/webrender_bindings/RendererScreenshotGrabber.h
. Я думаю, эта «структура» - opaque для c++-кода и используется только из rust-а (может, не прав). В файле gfx/wr/webrender/src/renderer/mod.rs
нашлось некое pub struct Renderer
url но не вижу там указания на namespace wr:: и не вижу в ней метода render
, который вроде бы вызывается из вышеприведённой wr_renderer_render
.
Ещё есть struct/class Renderer
упоминается тут:
third_party/rust/codespan-reporting/src/term/renderer.rs:pub struct Renderer<'writer, 'config> {
third_party/rust/profiling/examples/puffin/renderer.rs:pub struct Renderer {
third_party/libwebrtc/video/end_to_end_tests/call_operation_tests.cc: class Renderer : public rtc::VideoSinkInterface<VideoFrame> {
third_party/libwebrtc/video/end_to_end_tests/call_operation_tests.cc: class Renderer : public rtc::VideoSinkInterface<VideoFrame> {
third_party/libwebrtc/modules/audio_device/include/test_audio_device.h: class Renderer {
но мне кажется это что-то другое вообще.
Где я напутал?