Bug 1340997 - add external image callback in RendererOGL. r=sotaro

MozReview-Commit-ID: 8aCSe1iu44C
This commit is contained in:
JerryShih 2017-03-01 17:08:56 +08:00
Родитель 72f82dbc84
Коммит cf4e2ef241
6 изменённых файлов: 63 добавлений и 15 удалений

Просмотреть файл

@ -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;