already_AddRefed<gfxASurface> ContentClientRemote::CreateBuffer(ContentType aType, const nsIntRect& aRect, uint32_t aFlags) { NS_ABORT_IF_FALSE(!mIsNewBuffer, "Bad! Did we create a buffer twice without painting?"); mIsNewBuffer = true; if (mTextureClient) { mOldTextures.AppendElement(mTextureClient); DestroyBuffers(); } mTextureClient = CreateTextureClient(TEXTURE_CONTENT, aFlags | HostRelease); mContentType = aType; mSize = gfx::IntSize(aRect.width, aRect.height); mTextureClient->EnsureAllocated(mSize, mContentType); // note that LockSurfaceDescriptor doesn't actually lock anything MOZ_ASSERT(IsSurfaceDescriptorValid(*mTextureClient->LockSurfaceDescriptor())); CreateFrontBufferAndNotify(aRect, aFlags | HostRelease); nsRefPtr<gfxASurface> ret = mTextureClient->LockSurface(); return ret.forget(); }
void ImageClientSingle::EnsureTextureClient(TextureClientType aType) { // We should not call this method if using ImageBridge or tiled texture // clients since SupportsType always fails if (mTextureClient && mTextureClient->SupportsType(aType)) { return; } mTextureClient = CreateTextureClient(aType); }
void CanvasClientSurfaceStream::Update(gfx::IntSize aSize, ClientCanvasLayer* aLayer) { if (!mTextureClient) { mTextureClient = CreateTextureClient(TEXTURE_STREAM_GL); MOZ_ASSERT(mTextureClient, "Failed to create texture client"); } NS_ASSERTION(aLayer->mGLContext, "CanvasClientSurfaceStream should only be used with GL canvases"); // the content type won't be used mTextureClient->EnsureAllocated(aSize, gfxASurface::CONTENT_COLOR); GLScreenBuffer* screen = aLayer->mGLContext->Screen(); SurfaceStream* stream = screen->Stream(); bool isCrossProcess = !(XRE_GetProcessType() == GoannaProcessType_Default); if (isCrossProcess) { // swap staging -> consumer so we can send it to the compositor SharedSurface* surf = stream->SwapConsumer(); if (!surf) { printf_stderr("surf is null post-SwapConsumer!\n"); return; } #ifdef MOZ_WIDGET_GONK if (surf->Type() != SharedSurfaceType::Gralloc) { printf_stderr("Unexpected non-Gralloc SharedSurface in IPC path!"); return; } SharedSurface_Gralloc* grallocSurf = SharedSurface_Gralloc::Cast(surf); mTextureClient->SetDescriptor(grallocSurf->GetDescriptor()); #else printf_stderr("isCrossProcess, but not MOZ_WIDGET_GONK! Someone needs to write some code!"); MOZ_ASSERT(false); #endif mNeedsUpdate = true; } else { SurfaceStreamHandle handle = stream->GetShareHandle(); SurfaceDescriptor *desc = mTextureClient->GetDescriptor(); if (desc->type() != SurfaceDescriptor::TSurfaceStreamDescriptor || desc->get_SurfaceStreamDescriptor().handle() != handle) { *desc = SurfaceStreamDescriptor(handle, false); // Ref this so the SurfaceStream doesn't disappear unexpectedly. The // Compositor will need to unref it when finished. aLayer->mGLContext->AddRef(); mNeedsUpdate = true; } } aLayer->Painted(); }
void ContentClientDoubleBuffered::CreateFrontBufferAndNotify(const nsIntRect& aBufferRect, uint32_t aFlags) { mFrontClient = CreateTextureClient(TEXTURE_CONTENT, aFlags); mFrontClient->EnsureAllocated(mSize, mContentType); mFrontBufferRect = aBufferRect; mFrontBufferRotation = nsIntPoint(); mForwarder->CreatedDoubleBuffer(this, mFrontClient, mTextureClient); }
void ContentClientDoubleBuffered::CreateFrontBufferAndNotify(const nsIntRect& aBufferRect) { mFrontClient = CreateTextureClient(TEXTURE_CONTENT); mFrontClient->EnsureAllocated(mSize, mContentType); mFrontBufferRect = aBufferRect; mFrontBufferRotation = nsIntPoint(); mForwarder->CreatedDoubleBuffer(this, *mFrontClient->GetDescriptor(), *mTextureClient->GetDescriptor(), mTextureInfo); }
void CanvasClient2D::Update(gfx::IntSize aSize, BasicCanvasLayer* aLayer) { if (!mTextureClient) { mTextureClient = CreateTextureClient(TEXTURE_SHMEM); } bool isOpaque = (aLayer->GetContentFlags() & Layer::CONTENT_OPAQUE); gfxASurface::gfxContentType contentType = isOpaque ? gfxASurface::CONTENT_COLOR : gfxASurface::CONTENT_COLOR_ALPHA; mTextureClient->EnsureAllocated(aSize, contentType); gfxASurface* surface = mTextureClient->LockSurface(); static_cast<BasicCanvasLayer*>(aLayer)->UpdateSurface(surface, nullptr); mTextureClient->Unlock(); }
void CanvasClient2D::Update(gfx::IntSize aSize, ClientCanvasLayer* aLayer) { if (!mTextureClient) { mTextureClient = CreateTextureClient(TEXTURE_SHMEM); MOZ_ASSERT(mTextureClient, "Failed to create texture client"); } bool isOpaque = (aLayer->GetContentFlags() & Layer::CONTENT_OPAQUE); gfxASurface::gfxContentType contentType = isOpaque ? gfxASurface::CONTENT_COLOR : gfxASurface::CONTENT_COLOR_ALPHA; mTextureClient->EnsureAllocated(aSize, contentType); gfxASurface* surface = mTextureClient->LockSurface(); aLayer->UpdateSurface(surface); mTextureClient->Unlock(); }
void CanvasClientWebGL::Update(gfx::IntSize aSize, BasicCanvasLayer* aLayer) { if (!mTextureClient) { mTextureClient = CreateTextureClient(TEXTURE_STREAM_GL); } NS_ASSERTION(aLayer->mGLContext, "CanvasClientWebGL should only be used with GL canvases"); // the content type won't be used mTextureClient->EnsureAllocated(aSize, gfxASurface::CONTENT_COLOR); GLScreenBuffer* screen = aLayer->mGLContext->Screen(); SurfaceStreamHandle handle = screen->Stream()->GetShareHandle(); mTextureClient->SetDescriptor(SurfaceStreamDescriptor(handle, false)); aLayer->Painted(); }
void ContentClientRemote::BuildTextureClient(ContentType aType, const nsIntRect& aRect, uint32_t aFlags) { NS_ABORT_IF_FALSE(!mIsNewBuffer, "Bad! Did we create a buffer twice without painting?"); mIsNewBuffer = true; if (mTextureClient) { mOldTextures.AppendElement(mTextureClient); DestroyBuffers(); } mTextureInfo.mTextureFlags = aFlags | HostRelease; mTextureClient = CreateTextureClient(TEXTURE_CONTENT); mContentType = aType; mSize = gfx::IntSize(aRect.width, aRect.height); mTextureClient->EnsureAllocated(mSize, mContentType); MOZ_ASSERT(IsSurfaceDescriptorValid(*mTextureClient->GetDescriptor())); CreateFrontBufferAndNotify(aRect); }