LINUX.ORG.RU

помогите разобраться с исходниками firefox (rust+cpp)

 , ,


0

2

(исходники от 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 {

но мне кажется это что-то другое вообще.

Где я напутал?

★★★★★

Последнее исправление: firkax (всего исправлений: 1)

Ответ на: комментарий от unC0Rr

Всмысле? Это часть названия класса по сути. wr::Renderer и qq::Renderer это разные классы. Хотя наверно тут название вообще не важно, ведь линкер его нигде не использует.

firkax ★★★★★
() автор топика