Integrate from //sandbox/mathias/donut/...@145728
SurfaceFlinger rework for new EGL driver model support.
diff --git a/include/ui/Surface.h b/include/ui/Surface.h
index 33953a9..d92da49 100644
--- a/include/ui/Surface.h
+++ b/include/ui/Surface.h
@@ -28,24 +28,65 @@
#include <ui/Region.h>
#include <ui/ISurfaceFlingerClient.h>
+#include <EGL/android_natives.h>
+
namespace android {
// ---------------------------------------------------------------------------
class Rect;
class SurfaceComposerClient;
+struct per_client_cblk_t;
+struct layer_cblk_t;
-class Surface : public RefBase
+// ---------------------------------------------------------------------------
+
+class SurfaceBuffer
+ : public EGLNativeBase<
+ android_native_buffer_t,
+ SurfaceBuffer,
+ LightRefBase<SurfaceBuffer> >
{
+public:
+ buffer_handle_t getHandle() const {
+ return handle;
+ }
+
+protected:
+ SurfaceBuffer();
+ SurfaceBuffer(const Parcel& reply);
+ virtual ~SurfaceBuffer();
+ buffer_handle_t handle;
+ bool mOwner;
+private:
+ friend class BpSurface;
+ friend class BnSurface;
+ friend class LightRefBase<SurfaceBuffer>;
+
+ SurfaceBuffer& operator = (const SurfaceBuffer& rhs);
+ const SurfaceBuffer& operator = (const SurfaceBuffer& rhs) const;
+
+ static status_t writeToParcel(Parcel* reply,
+ android_native_buffer_t const* buffer);
+
+ static int getHandle(android_native_buffer_t const * base,
+ buffer_handle_t* handle);
+};
+
+// ---------------------------------------------------------------------------
+
+class Surface
+ : public EGLNativeBase<android_native_window_t, Surface, RefBase>
+{
public:
struct SurfaceInfo {
uint32_t w;
uint32_t h;
- uint32_t bpr;
+ uint32_t s;
+ uint32_t usage;
PixelFormat format;
void* bits;
- void* base;
uint32_t reserved[2];
};
@@ -55,15 +96,12 @@
status_t lock(SurfaceInfo* info, bool blocking = true);
status_t lock(SurfaceInfo* info, Region* dirty, bool blocking = true);
status_t unlockAndPost();
- status_t unlock();
-
- void* heapBase(int i) const;
+
uint32_t getFlags() const { return mFlags; }
// setSwapRectangle() is mainly used by EGL
void setSwapRectangle(const Rect& r);
const Rect& swapRectangle() const;
- status_t nextBuffer(SurfaceInfo* info);
sp<Surface> dup() const;
static sp<Surface> readFromParcel(Parcel* parcel);
@@ -95,6 +133,8 @@
friend class Test;
const sp<ISurface>& getISurface() const { return mSurface; }
+ status_t getBufferLocked(int index);
+
// can't be copied
Surface& operator = (Surface& rhs);
Surface(const Surface& rhs);
@@ -108,23 +148,39 @@
Surface(Surface const* rhs);
~Surface();
-
+
Region dirtyRegion() const;
void setDirtyRegion(const Region& region) const;
- // this locks protects calls to lockSurface() / unlockSurface()
- // and is called by SurfaceComposerClient.
- Mutex& getLock() const { return mSurfaceLock; }
+
+ status_t validate(per_client_cblk_t const* cblk) const;
+ static void _send_dirty_region(layer_cblk_t* lcblk, const Region& dirty);
+
+ static void connect(android_native_window_t* window);
+ static void disconnect(android_native_window_t* window);
+ static int setSwapInterval(android_native_window_t* window, int interval);
+ static int setSwapRectangle(android_native_window_t* window,
+ int l, int t, int w, int h);
+ static int dequeueBuffer(android_native_window_t* window, android_native_buffer_t** buffer);
+ static int lockBuffer(android_native_window_t* window, android_native_buffer_t* buffer);
+ static int queueBuffer(android_native_window_t* window, android_native_buffer_t* buffer);
+
+ int dequeueBuffer(android_native_buffer_t** buffer);
+ int lockBuffer(android_native_buffer_t* buffer);
+ int queueBuffer(android_native_buffer_t* buffer);
+
+
+ alloc_device_t* mAllocDevice;
sp<SurfaceComposerClient> mClient;
sp<ISurface> mSurface;
- sp<IMemoryHeap> mHeap[2];
+ sp<SurfaceBuffer> mBuffers[2];
+ android_native_buffer_t* mLockedBuffer;
SurfaceID mToken;
uint32_t mIdentity;
PixelFormat mFormat;
uint32_t mFlags;
const bool mOwner;
- mutable void* mSurfaceHeapBase[2];
mutable Region mDirtyRegion;
mutable Rect mSwapRectangle;
mutable uint8_t mBackbufferIndex;