gecko/gfx/layers/GrallocImages.h
Phil Ringnalda ac63c0f4a1 Backed out 3 changesets (bug 972703, bug 889959) for build failures and crashes
CLOSED TREE

Backed out changeset ef3d90780478 (bug 972703)
Backed out changeset 34c95e937671 (bug 889959)
Backed out changeset 5e25912d6696 (bug 889959)
2014-02-16 15:17:01 -08:00

170 lines
4.5 KiB
C++

/* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 2 -*-
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#ifndef GRALLOCIMAGES_H
#define GRALLOCIMAGES_H
#ifdef MOZ_WIDGET_GONK
#include "mozilla/layers/AtomicRefCountedWithFinalize.h"
#include "mozilla/layers/LayersSurfaces.h"
#include "mozilla/gfx/Point.h"
#include "ImageLayers.h"
#include "ImageContainer.h"
#include <ui/GraphicBuffer.h>
namespace mozilla {
namespace layers {
class GrallocTextureClientOGL;
/**
* The gralloc buffer maintained by android GraphicBuffer can be
* shared between the compositor thread and the producer thread. The
* mGraphicBuffer is owned by the producer thread, but when it is
* wrapped by GraphicBufferLocked and passed to the compositor, the
* buffer content is guaranteed to not change until Unlock() is
* called. Each producer must maintain their own buffer queue and
* implement the GraphicBufferLocked::Unlock() interface.
*/
class GraphicBufferLocked
: public AtomicRefCountedWithFinalize<GraphicBufferLocked>
{
public:
GraphicBufferLocked(SurfaceDescriptor aGraphicBuffer)
: mSurfaceDescriptor(aGraphicBuffer)
{}
virtual ~GraphicBufferLocked() {}
SurfaceDescriptor GetSurfaceDescriptor()
{
return mSurfaceDescriptor;
}
protected:
virtual void Unlock() {}
private:
/**
* Called once, just before the destructor.
*
* Here goes the shut-down code that uses virtual methods.
* Must only be called by Release().
*/
void Finalize()
{
Unlock();
}
friend class AtomicRefCountedWithFinalize<GraphicBufferLocked>;
protected:
SurfaceDescriptor mSurfaceDescriptor;
};
/**
* The YUV format supported by Android HAL
*
* 4:2:0 - CbCr width and height is half that of Y.
*
* This format assumes
* - an even width
* - an even height
* - a horizontal stride multiple of 16 pixels
* - a vertical stride equal to the height
*
* y_size = stride * height
* c_size = ALIGN(stride/2, 16) * height/2
* size = y_size + c_size * 2
* cr_offset = y_size
* cb_offset = y_size + c_size
*
* The Image that is rendered is the picture region defined by
* mPicX, mPicY and mPicSize. The size of the rendered image is
* mPicSize, not mYSize or mCbCrSize.
*/
class GrallocImage : public PlanarYCbCrImage
, public ISharedImage
{
typedef PlanarYCbCrData Data;
static uint32_t sColorIdMap[];
public:
struct GrallocData {
nsRefPtr<GraphicBufferLocked> mGraphicBuffer;
gfx::IntSize mPicSize;
};
GrallocImage();
virtual ~GrallocImage();
/**
* This makes a copy of the data buffers, in order to support functioning
* in all different layer managers.
*/
virtual void SetData(const Data& aData);
/**
* Share the SurfaceDescriptor without making the copy, in order
* to support functioning in all different layer managers.
*/
virtual void SetData(const GrallocData& aData);
// From [android 4.0.4]/hardware/msm7k/libgralloc-qsd8k/gralloc_priv.h
enum {
/* OEM specific HAL formats */
HAL_PIXEL_FORMAT_YCbCr_422_P = 0x102,
HAL_PIXEL_FORMAT_YCbCr_420_P = 0x103,
HAL_PIXEL_FORMAT_YCbCr_420_SP = 0x109,
HAL_PIXEL_FORMAT_YCrCb_420_SP_ADRENO = 0x10A,
HAL_PIXEL_FORMAT_YCbCr_420_SP_TILED = 0x7FA30C03,
HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS = 0x7FA30C04,
};
virtual already_AddRefed<gfxASurface> DeprecatedGetAsSurface();
virtual TemporaryRef<gfx::SourceSurface> GetAsSourceSurface() MOZ_OVERRIDE;
void* GetNativeBuffer()
{
if (IsValid()) {
return GrallocBufferActor::GetFrom(GetSurfaceDescriptor())->getNativeBuffer();
} else {
return nullptr;
}
}
virtual bool IsValid() { return GetSurfaceDescriptor().type() != SurfaceDescriptor::T__None; }
SurfaceDescriptor GetSurfaceDescriptor() {
if (mGraphicBufferLocked.get()) {
return mGraphicBufferLocked->GetSurfaceDescriptor();
}
return SurfaceDescriptor();
}
virtual ISharedImage* AsSharedImage() MOZ_OVERRIDE { return this; }
virtual TextureClient* GetTextureClient(CompositableClient* aClient) MOZ_OVERRIDE;
virtual uint8_t* GetBuffer()
{
return static_cast<uint8_t*>(GetNativeBuffer());
}
private:
bool mBufferAllocated;
nsRefPtr<GraphicBufferLocked> mGraphicBufferLocked;
RefPtr<GrallocTextureClientOGL> mTextureClient;
};
} // namespace layers
} // namespace mozilla
#endif
#endif /* GRALLOCIMAGES_H */