зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1340997 - add external image callback in RendererOGL. r=sotaro
MozReview-Commit-ID: 8aCSe1iu44C
This commit is contained in:
Родитель
72f82dbc84
Коммит
cf4e2ef241
|
@ -14,6 +14,19 @@
|
|||
namespace mozilla {
|
||||
namespace wr {
|
||||
|
||||
WrExternalImage LockExternalImage(void* aObj, WrExternalImageId aId)
|
||||
{
|
||||
return WrExternalImage { WrExternalImageIdType::TEXTURE_HANDLE, 0.0f, 0.0f, 0.0f, 0.0f, 0 };
|
||||
}
|
||||
|
||||
void UnlockExternalImage(void* aObj, WrExternalImageId aId)
|
||||
{
|
||||
}
|
||||
|
||||
void ReleaseExternalImage(void* aObj, WrExternalImageId aId)
|
||||
{
|
||||
}
|
||||
|
||||
RendererOGL::RendererOGL(RefPtr<RenderThread>&& aThread,
|
||||
RefPtr<gl::GLContext>&& aGL,
|
||||
RefPtr<widget::CompositorWidget>&& aWidget,
|
||||
|
@ -41,6 +54,17 @@ RendererOGL::~RendererOGL()
|
|||
wr_renderer_delete(mWrRenderer);
|
||||
}
|
||||
|
||||
WrExternalImageHandler
|
||||
RendererOGL::GetExternalImageHandler()
|
||||
{
|
||||
return WrExternalImageHandler {
|
||||
this,
|
||||
LockExternalImage,
|
||||
UnlockExternalImage,
|
||||
ReleaseExternalImage,
|
||||
};
|
||||
}
|
||||
|
||||
void
|
||||
RendererOGL::Update()
|
||||
{
|
||||
|
|
|
@ -38,7 +38,13 @@ namespace wr {
|
|||
/// on the render thread instead of the compositor thread.
|
||||
class RendererOGL
|
||||
{
|
||||
friend WrExternalImage LockExternalImage(void* aObj, WrExternalImageId aId);
|
||||
friend void UnlockExternalImage(void* aObj, WrExternalImageId aId);
|
||||
friend void ReleaseExternalImage(void* aObj, WrExternalImageId aId);
|
||||
|
||||
public:
|
||||
WrExternalImageHandler GetExternalImageHandler();
|
||||
|
||||
/// This can be called on the render thread only.
|
||||
void Update();
|
||||
|
||||
|
|
|
@ -51,7 +51,7 @@ public:
|
|||
*mUseANGLE = gl->IsANGLE();
|
||||
|
||||
WrRenderer* wrRenderer = nullptr;
|
||||
if (!wr_window_new(aWindowId, gl.get(), this->mEnableProfiler, nullptr, mWrApi, &wrRenderer)) {
|
||||
if (!wr_window_new(aWindowId, gl.get(), this->mEnableProfiler, mWrApi, &wrRenderer)) {
|
||||
return;
|
||||
}
|
||||
MOZ_ASSERT(wrRenderer);
|
||||
|
@ -63,6 +63,10 @@ public:
|
|||
aWindowId,
|
||||
wrRenderer,
|
||||
mBridge);
|
||||
if (wrRenderer && renderer) {
|
||||
WrExternalImageHandler handler = renderer->GetExternalImageHandler();
|
||||
wr_renderer_set_external_image_handler(wrRenderer, &handler);
|
||||
}
|
||||
|
||||
aRenderThread.AddRenderer(aWindowId, Move(renderer));
|
||||
}
|
||||
|
|
|
@ -238,6 +238,13 @@ static inline WrPoint ToWrPoint(const gfx::Point& point)
|
|||
return p;
|
||||
}
|
||||
|
||||
static inline WrExternalImageId ToWrExternalImageId(uint64_t aID)
|
||||
{
|
||||
WrExternalImageId id;
|
||||
id.id = aID;
|
||||
return id;
|
||||
}
|
||||
|
||||
struct ByteBuffer
|
||||
{
|
||||
ByteBuffer(size_t aLength, uint8_t* aData)
|
||||
|
|
|
@ -134,6 +134,22 @@ pub extern fn wr_renderer_set_profiler_enabled(renderer: &mut Renderer, enabled:
|
|||
renderer.set_profiler_enabled(enabled);
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
pub extern fn wr_renderer_set_external_image_handler(renderer: &mut Renderer,
|
||||
external_image_handler: *mut WrExternalImageHandler) {
|
||||
if !external_image_handler.is_null() {
|
||||
renderer.set_external_image_handler(Box::new(
|
||||
unsafe {
|
||||
WrExternalImageHandler {
|
||||
external_image_obj: (*external_image_handler).external_image_obj,
|
||||
lock_func: (*external_image_handler).lock_func,
|
||||
unlock_func: (*external_image_handler).unlock_func,
|
||||
release_func: (*external_image_handler).release_func,
|
||||
}
|
||||
}));
|
||||
}
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
pub extern fn wr_renderer_current_epoch(renderer: &mut Renderer,
|
||||
pipeline_id: PipelineId,
|
||||
|
@ -193,7 +209,6 @@ pub extern fn wr_api_generate_frame(api: &mut RenderApi) {
|
|||
pub extern fn wr_window_new(window_id: WrWindowId,
|
||||
gl_context: *mut c_void,
|
||||
enable_profiler: bool,
|
||||
external_image_handler: *mut WrExternalImageHandler,
|
||||
out_api: &mut *mut RenderApi,
|
||||
out_renderer: &mut *mut Renderer) -> bool {
|
||||
assert!(unsafe { is_in_render_thread() });
|
||||
|
@ -229,18 +244,6 @@ pub extern fn wr_window_new(window_id: WrWindowId,
|
|||
|
||||
renderer.set_render_notifier(Box::new(CppNotifier { window_id: window_id }));
|
||||
|
||||
if !external_image_handler.is_null() {
|
||||
renderer.set_external_image_handler(Box::new(
|
||||
unsafe {
|
||||
WrExternalImageHandler {
|
||||
external_image_obj: (*external_image_handler).external_image_obj,
|
||||
lock_func: (*external_image_handler).lock_func,
|
||||
unlock_func: (*external_image_handler).unlock_func,
|
||||
release_func: (*external_image_handler).release_func,
|
||||
}
|
||||
}));
|
||||
}
|
||||
|
||||
*out_api = Box::into_raw(Box::new(sender.create_api()));
|
||||
*out_renderer = Box::into_raw(Box::new(renderer));
|
||||
|
||||
|
|
|
@ -368,6 +368,11 @@ struct WrRenderer;
|
|||
struct WrState;
|
||||
struct WrAPI;
|
||||
|
||||
WR_INLINE void
|
||||
wr_renderer_set_external_image_handler(WrRenderer* renderer,
|
||||
WrExternalImageHandler* handler)
|
||||
WR_FUNC;
|
||||
|
||||
WR_INLINE void
|
||||
wr_renderer_update(WrRenderer* renderer)
|
||||
WR_FUNC;
|
||||
|
@ -404,7 +409,6 @@ WR_INLINE bool
|
|||
wr_window_new(WrWindowId window_id,
|
||||
void* aGLContext,
|
||||
bool enable_profiler,
|
||||
WrExternalImageHandler* handler,
|
||||
WrAPI** out_api,
|
||||
WrRenderer** out_renderer)
|
||||
WR_FUNC;
|
||||
|
|
Загрузка…
Ссылка в новой задаче