mirror of
https://github.com/sunnypilot/sunnypilot.git
synced 2026-02-19 10:03:55 +08:00
phonelibs -> third_party (#22477)
* git mv to third_party
* find and replace
* fix release tests
* update pre-commit
* update tici bins
* update eon bins
Co-authored-by: Comma Device <device@comma.ai>
old-commit-hash: 5b641379ae
This commit is contained in:
95
third_party/android_frameworks_native/include/gui/BitTube.h
vendored
Normal file
95
third_party/android_frameworks_native/include/gui/BitTube.h
vendored
Normal file
@@ -0,0 +1,95 @@
|
||||
/*
|
||||
* Copyright (C) 2010 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#ifndef ANDROID_GUI_SENSOR_CHANNEL_H
|
||||
#define ANDROID_GUI_SENSOR_CHANNEL_H
|
||||
|
||||
#include <stdint.h>
|
||||
#include <sys/types.h>
|
||||
|
||||
#include <utils/Errors.h>
|
||||
#include <utils/RefBase.h>
|
||||
#include <cutils/log.h>
|
||||
|
||||
|
||||
namespace android {
|
||||
// ----------------------------------------------------------------------------
|
||||
class Parcel;
|
||||
|
||||
class BitTube : public RefBase
|
||||
{
|
||||
public:
|
||||
|
||||
// creates a BitTube with a default (4KB) send buffer
|
||||
BitTube();
|
||||
|
||||
// creates a BitTube with a a specified send and receive buffer size
|
||||
explicit BitTube(size_t bufsize);
|
||||
|
||||
explicit BitTube(const Parcel& data);
|
||||
virtual ~BitTube();
|
||||
|
||||
// check state after construction
|
||||
status_t initCheck() const;
|
||||
|
||||
// get receive file-descriptor
|
||||
int getFd() const;
|
||||
|
||||
// get the send file-descriptor.
|
||||
int getSendFd() const;
|
||||
|
||||
// send objects (sized blobs). All objects are guaranteed to be written or the call fails.
|
||||
template <typename T>
|
||||
static ssize_t sendObjects(const sp<BitTube>& tube,
|
||||
T const* events, size_t count) {
|
||||
return sendObjects(tube, events, count, sizeof(T));
|
||||
}
|
||||
|
||||
// receive objects (sized blobs). If the receiving buffer isn't large enough,
|
||||
// excess messages are silently discarded.
|
||||
template <typename T>
|
||||
static ssize_t recvObjects(const sp<BitTube>& tube,
|
||||
T* events, size_t count) {
|
||||
return recvObjects(tube, events, count, sizeof(T));
|
||||
}
|
||||
|
||||
// parcels this BitTube
|
||||
status_t writeToParcel(Parcel* reply) const;
|
||||
|
||||
private:
|
||||
void init(size_t rcvbuf, size_t sndbuf);
|
||||
|
||||
// send a message. The write is guaranteed to send the whole message or fail.
|
||||
ssize_t write(void const* vaddr, size_t size);
|
||||
|
||||
// receive a message. the passed buffer must be at least as large as the
|
||||
// write call used to send the message, excess data is silently discarded.
|
||||
ssize_t read(void* vaddr, size_t size);
|
||||
|
||||
int mSendFd;
|
||||
mutable int mReceiveFd;
|
||||
|
||||
static ssize_t sendObjects(const sp<BitTube>& tube,
|
||||
void const* events, size_t count, size_t objSize);
|
||||
|
||||
static ssize_t recvObjects(const sp<BitTube>& tube,
|
||||
void* events, size_t count, size_t objSize);
|
||||
};
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
}; // namespace android
|
||||
|
||||
#endif // ANDROID_GUI_SENSOR_CHANNEL_H
|
||||
130
third_party/android_frameworks_native/include/gui/BufferItem.h
vendored
Normal file
130
third_party/android_frameworks_native/include/gui/BufferItem.h
vendored
Normal file
@@ -0,0 +1,130 @@
|
||||
/*
|
||||
* Copyright 2014 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#ifndef ANDROID_GUI_BUFFERITEM_H
|
||||
#define ANDROID_GUI_BUFFERITEM_H
|
||||
|
||||
#include <EGL/egl.h>
|
||||
#include <EGL/eglext.h>
|
||||
|
||||
#include <ui/Rect.h>
|
||||
#include <ui/Region.h>
|
||||
|
||||
#include <system/graphics.h>
|
||||
|
||||
#include <utils/Flattenable.h>
|
||||
#include <utils/StrongPointer.h>
|
||||
|
||||
namespace android {
|
||||
|
||||
class Fence;
|
||||
class GraphicBuffer;
|
||||
|
||||
class BufferItem : public Flattenable<BufferItem> {
|
||||
friend class Flattenable<BufferItem>;
|
||||
size_t getPodSize() const;
|
||||
size_t getFlattenedSize() const;
|
||||
size_t getFdCount() const;
|
||||
status_t flatten(void*& buffer, size_t& size, int*& fds, size_t& count) const;
|
||||
status_t unflatten(void const*& buffer, size_t& size, int const*& fds, size_t& count);
|
||||
|
||||
public:
|
||||
// The default value of mBuf, used to indicate this doesn't correspond to a slot.
|
||||
enum { INVALID_BUFFER_SLOT = -1 };
|
||||
BufferItem();
|
||||
~BufferItem();
|
||||
|
||||
static const char* scalingModeName(uint32_t scalingMode);
|
||||
|
||||
// mGraphicBuffer points to the buffer allocated for this slot, or is NULL
|
||||
// if the buffer in this slot has been acquired in the past (see
|
||||
// BufferSlot.mAcquireCalled).
|
||||
sp<GraphicBuffer> mGraphicBuffer;
|
||||
|
||||
// mFence is a fence that will signal when the buffer is idle.
|
||||
sp<Fence> mFence;
|
||||
|
||||
// mCrop is the current crop rectangle for this buffer slot.
|
||||
Rect mCrop;
|
||||
|
||||
// mTransform is the current transform flags for this buffer slot.
|
||||
// refer to NATIVE_WINDOW_TRANSFORM_* in <window.h>
|
||||
uint32_t mTransform;
|
||||
|
||||
// mScalingMode is the current scaling mode for this buffer slot.
|
||||
// refer to NATIVE_WINDOW_SCALING_* in <window.h>
|
||||
uint32_t mScalingMode;
|
||||
|
||||
// mTimestamp is the current timestamp for this buffer slot. This gets
|
||||
// to set by queueBuffer each time this slot is queued. This value
|
||||
// is guaranteed to be monotonically increasing for each newly
|
||||
// acquired buffer.
|
||||
union {
|
||||
int64_t mTimestamp;
|
||||
struct {
|
||||
uint32_t mTimestampLo;
|
||||
uint32_t mTimestampHi;
|
||||
};
|
||||
};
|
||||
|
||||
// mIsAutoTimestamp indicates whether mTimestamp was generated
|
||||
// automatically when the buffer was queued.
|
||||
bool mIsAutoTimestamp;
|
||||
|
||||
// mDataSpace is the current dataSpace value for this buffer slot. This gets
|
||||
// set by queueBuffer each time this slot is queued. The meaning of the
|
||||
// dataSpace is format-dependent.
|
||||
android_dataspace mDataSpace;
|
||||
|
||||
// mFrameNumber is the number of the queued frame for this slot.
|
||||
union {
|
||||
uint64_t mFrameNumber;
|
||||
struct {
|
||||
uint32_t mFrameNumberLo;
|
||||
uint32_t mFrameNumberHi;
|
||||
};
|
||||
};
|
||||
|
||||
union {
|
||||
// mSlot is the slot index of this buffer (default INVALID_BUFFER_SLOT).
|
||||
int mSlot;
|
||||
|
||||
// mBuf is the former name for mSlot
|
||||
int mBuf;
|
||||
};
|
||||
|
||||
// mIsDroppable whether this buffer was queued with the
|
||||
// property that it can be replaced by a new buffer for the purpose of
|
||||
// making sure dequeueBuffer() won't block.
|
||||
// i.e.: was the BufferQueue in "mDequeueBufferCannotBlock" when this buffer
|
||||
// was queued.
|
||||
bool mIsDroppable;
|
||||
|
||||
// Indicates whether this buffer has been seen by a consumer yet
|
||||
bool mAcquireCalled;
|
||||
|
||||
// Indicates this buffer must be transformed by the inverse transform of the screen
|
||||
// it is displayed onto. This is applied after mTransform.
|
||||
bool mTransformToDisplayInverse;
|
||||
|
||||
// Describes the portion of the surface that has been modified since the
|
||||
// previous frame
|
||||
Region mSurfaceDamage;
|
||||
};
|
||||
|
||||
} // namespace android
|
||||
|
||||
#endif
|
||||
93
third_party/android_frameworks_native/include/gui/BufferItemConsumer.h
vendored
Normal file
93
third_party/android_frameworks_native/include/gui/BufferItemConsumer.h
vendored
Normal file
@@ -0,0 +1,93 @@
|
||||
/*
|
||||
* Copyright (C) 2012 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#ifndef ANDROID_GUI_BUFFERITEMCONSUMER_H
|
||||
#define ANDROID_GUI_BUFFERITEMCONSUMER_H
|
||||
|
||||
#include <gui/ConsumerBase.h>
|
||||
|
||||
#include <ui/GraphicBuffer.h>
|
||||
|
||||
#include <utils/String8.h>
|
||||
#include <utils/Vector.h>
|
||||
#include <utils/threads.h>
|
||||
|
||||
#define ANDROID_GRAPHICS_BUFFERITEMCONSUMER_JNI_ID "mBufferItemConsumer"
|
||||
|
||||
namespace android {
|
||||
|
||||
class BufferQueue;
|
||||
|
||||
/**
|
||||
* BufferItemConsumer is a BufferQueue consumer endpoint that allows clients
|
||||
* access to the whole BufferItem entry from BufferQueue. Multiple buffers may
|
||||
* be acquired at once, to be used concurrently by the client. This consumer can
|
||||
* operate either in synchronous or asynchronous mode.
|
||||
*/
|
||||
class BufferItemConsumer: public ConsumerBase
|
||||
{
|
||||
public:
|
||||
typedef ConsumerBase::FrameAvailableListener FrameAvailableListener;
|
||||
|
||||
enum { DEFAULT_MAX_BUFFERS = -1 };
|
||||
enum { INVALID_BUFFER_SLOT = BufferQueue::INVALID_BUFFER_SLOT };
|
||||
enum { NO_BUFFER_AVAILABLE = BufferQueue::NO_BUFFER_AVAILABLE };
|
||||
|
||||
// Create a new buffer item consumer. The consumerUsage parameter determines
|
||||
// the consumer usage flags passed to the graphics allocator. The
|
||||
// bufferCount parameter specifies how many buffers can be locked for user
|
||||
// access at the same time.
|
||||
// controlledByApp tells whether this consumer is controlled by the
|
||||
// application.
|
||||
BufferItemConsumer(const sp<IGraphicBufferConsumer>& consumer,
|
||||
uint32_t consumerUsage, int bufferCount = DEFAULT_MAX_BUFFERS,
|
||||
bool controlledByApp = false);
|
||||
|
||||
virtual ~BufferItemConsumer();
|
||||
|
||||
// set the name of the BufferItemConsumer that will be used to identify it in
|
||||
// log messages.
|
||||
void setName(const String8& name);
|
||||
|
||||
// Gets the next graphics buffer from the producer, filling out the
|
||||
// passed-in BufferItem structure. Returns NO_BUFFER_AVAILABLE if the queue
|
||||
// of buffers is empty, and INVALID_OPERATION if the maximum number of
|
||||
// buffers is already acquired.
|
||||
//
|
||||
// Only a fixed number of buffers can be acquired at a time, determined by
|
||||
// the construction-time bufferCount parameter. If INVALID_OPERATION is
|
||||
// returned by acquireBuffer, then old buffers must be returned to the
|
||||
// queue by calling releaseBuffer before more buffers can be acquired.
|
||||
//
|
||||
// If waitForFence is true, and the acquired BufferItem has a valid fence object,
|
||||
// acquireBuffer will wait on the fence with no timeout before returning.
|
||||
status_t acquireBuffer(BufferItem* item, nsecs_t presentWhen,
|
||||
bool waitForFence = true);
|
||||
|
||||
// Returns an acquired buffer to the queue, allowing it to be reused. Since
|
||||
// only a fixed number of buffers may be acquired at a time, old buffers
|
||||
// must be released by calling releaseBuffer to ensure new buffers can be
|
||||
// acquired by acquireBuffer. Once a BufferItem is released, the caller must
|
||||
// not access any members of the BufferItem, and should immediately remove
|
||||
// all of its references to the BufferItem itself.
|
||||
status_t releaseBuffer(const BufferItem &item,
|
||||
const sp<Fence>& releaseFence = Fence::NO_FENCE);
|
||||
|
||||
};
|
||||
|
||||
} // namespace android
|
||||
|
||||
#endif // ANDROID_GUI_CPUCONSUMER_H
|
||||
89
third_party/android_frameworks_native/include/gui/BufferQueue.h
vendored
Normal file
89
third_party/android_frameworks_native/include/gui/BufferQueue.h
vendored
Normal file
@@ -0,0 +1,89 @@
|
||||
/*
|
||||
* Copyright (C) 2012 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#ifndef ANDROID_GUI_BUFFERQUEUE_H
|
||||
#define ANDROID_GUI_BUFFERQUEUE_H
|
||||
|
||||
#include <gui/BufferItem.h>
|
||||
#include <gui/BufferQueueDefs.h>
|
||||
#include <gui/IGraphicBufferConsumer.h>
|
||||
#include <gui/IGraphicBufferProducer.h>
|
||||
#include <gui/IConsumerListener.h>
|
||||
|
||||
// These are only required to keep other parts of the framework with incomplete
|
||||
// dependencies building successfully
|
||||
#include <gui/IGraphicBufferAlloc.h>
|
||||
|
||||
namespace android {
|
||||
|
||||
class BufferQueue {
|
||||
public:
|
||||
// BufferQueue will keep track of at most this value of buffers.
|
||||
// Attempts at runtime to increase the number of buffers past this will fail.
|
||||
enum { NUM_BUFFER_SLOTS = BufferQueueDefs::NUM_BUFFER_SLOTS };
|
||||
// Used as a placeholder slot# when the value isn't pointing to an existing buffer.
|
||||
enum { INVALID_BUFFER_SLOT = BufferItem::INVALID_BUFFER_SLOT };
|
||||
// Alias to <IGraphicBufferConsumer.h> -- please scope from there in future code!
|
||||
enum {
|
||||
NO_BUFFER_AVAILABLE = IGraphicBufferConsumer::NO_BUFFER_AVAILABLE,
|
||||
PRESENT_LATER = IGraphicBufferConsumer::PRESENT_LATER,
|
||||
};
|
||||
|
||||
// When in async mode we reserve two slots in order to guarantee that the
|
||||
// producer and consumer can run asynchronously.
|
||||
enum { MAX_MAX_ACQUIRED_BUFFERS = NUM_BUFFER_SLOTS - 2 };
|
||||
|
||||
// for backward source compatibility
|
||||
typedef ::android::ConsumerListener ConsumerListener;
|
||||
|
||||
// ProxyConsumerListener is a ConsumerListener implementation that keeps a weak
|
||||
// reference to the actual consumer object. It forwards all calls to that
|
||||
// consumer object so long as it exists.
|
||||
//
|
||||
// This class exists to avoid having a circular reference between the
|
||||
// BufferQueue object and the consumer object. The reason this can't be a weak
|
||||
// reference in the BufferQueue class is because we're planning to expose the
|
||||
// consumer side of a BufferQueue as a binder interface, which doesn't support
|
||||
// weak references.
|
||||
class ProxyConsumerListener : public BnConsumerListener {
|
||||
public:
|
||||
ProxyConsumerListener(const wp<ConsumerListener>& consumerListener);
|
||||
virtual ~ProxyConsumerListener();
|
||||
virtual void onFrameAvailable(const BufferItem& item) override;
|
||||
virtual void onFrameReplaced(const BufferItem& item) override;
|
||||
virtual void onBuffersReleased() override;
|
||||
virtual void onSidebandStreamChanged() override;
|
||||
private:
|
||||
// mConsumerListener is a weak reference to the IConsumerListener. This is
|
||||
// the raison d'etre of ProxyConsumerListener.
|
||||
wp<ConsumerListener> mConsumerListener;
|
||||
};
|
||||
|
||||
// BufferQueue manages a pool of gralloc memory slots to be used by
|
||||
// producers and consumers. allocator is used to allocate all the
|
||||
// needed gralloc buffers.
|
||||
static void createBufferQueue(sp<IGraphicBufferProducer>* outProducer,
|
||||
sp<IGraphicBufferConsumer>* outConsumer,
|
||||
const sp<IGraphicBufferAlloc>& allocator = NULL);
|
||||
|
||||
private:
|
||||
BufferQueue(); // Create through createBufferQueue
|
||||
};
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
}; // namespace android
|
||||
|
||||
#endif // ANDROID_GUI_BUFFERQUEUE_H
|
||||
187
third_party/android_frameworks_native/include/gui/BufferQueueConsumer.h
vendored
Normal file
187
third_party/android_frameworks_native/include/gui/BufferQueueConsumer.h
vendored
Normal file
@@ -0,0 +1,187 @@
|
||||
/*
|
||||
* Copyright 2014 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#ifndef ANDROID_GUI_BUFFERQUEUECONSUMER_H
|
||||
#define ANDROID_GUI_BUFFERQUEUECONSUMER_H
|
||||
|
||||
#include <EGL/egl.h>
|
||||
#include <EGL/eglext.h>
|
||||
|
||||
#include <gui/BufferQueueDefs.h>
|
||||
#include <gui/IGraphicBufferConsumer.h>
|
||||
|
||||
namespace android {
|
||||
|
||||
class BufferQueueCore;
|
||||
|
||||
class BufferQueueConsumer : public BnGraphicBufferConsumer {
|
||||
|
||||
public:
|
||||
BufferQueueConsumer(const sp<BufferQueueCore>& core);
|
||||
virtual ~BufferQueueConsumer();
|
||||
|
||||
// acquireBuffer attempts to acquire ownership of the next pending buffer in
|
||||
// the BufferQueue. If no buffer is pending then it returns
|
||||
// NO_BUFFER_AVAILABLE. If a buffer is successfully acquired, the
|
||||
// information about the buffer is returned in BufferItem. If the buffer
|
||||
// returned had previously been acquired then the BufferItem::mGraphicBuffer
|
||||
// field of buffer is set to NULL and it is assumed that the consumer still
|
||||
// holds a reference to the buffer.
|
||||
//
|
||||
// If expectedPresent is nonzero, it indicates the time when the buffer
|
||||
// will be displayed on screen. If the buffer's timestamp is farther in the
|
||||
// future, the buffer won't be acquired, and PRESENT_LATER will be
|
||||
// returned. The presentation time is in nanoseconds, and the time base
|
||||
// is CLOCK_MONOTONIC.
|
||||
virtual status_t acquireBuffer(BufferItem* outBuffer,
|
||||
nsecs_t expectedPresent, uint64_t maxFrameNumber = 0) override;
|
||||
|
||||
// See IGraphicBufferConsumer::detachBuffer
|
||||
virtual status_t detachBuffer(int slot);
|
||||
|
||||
// See IGraphicBufferConsumer::attachBuffer
|
||||
virtual status_t attachBuffer(int* slot, const sp<GraphicBuffer>& buffer);
|
||||
|
||||
// releaseBuffer releases a buffer slot from the consumer back to the
|
||||
// BufferQueue. This may be done while the buffer's contents are still
|
||||
// being accessed. The fence will signal when the buffer is no longer
|
||||
// in use. frameNumber is used to indentify the exact buffer returned.
|
||||
//
|
||||
// If releaseBuffer returns STALE_BUFFER_SLOT, then the consumer must free
|
||||
// any references to the just-released buffer that it might have, as if it
|
||||
// had received a onBuffersReleased() call with a mask set for the released
|
||||
// buffer.
|
||||
//
|
||||
// Note that the dependencies on EGL will be removed once we switch to using
|
||||
// the Android HW Sync HAL.
|
||||
virtual status_t releaseBuffer(int slot, uint64_t frameNumber,
|
||||
const sp<Fence>& releaseFence, EGLDisplay display,
|
||||
EGLSyncKHR fence);
|
||||
|
||||
// connect connects a consumer to the BufferQueue. Only one
|
||||
// consumer may be connected, and when that consumer disconnects the
|
||||
// BufferQueue is placed into the "abandoned" state, causing most
|
||||
// interactions with the BufferQueue by the producer to fail.
|
||||
// controlledByApp indicates whether the consumer is controlled by
|
||||
// the application.
|
||||
//
|
||||
// consumerListener may not be NULL.
|
||||
virtual status_t connect(const sp<IConsumerListener>& consumerListener,
|
||||
bool controlledByApp);
|
||||
|
||||
// disconnect disconnects a consumer from the BufferQueue. All
|
||||
// buffers will be freed and the BufferQueue is placed in the "abandoned"
|
||||
// state, causing most interactions with the BufferQueue by the producer to
|
||||
// fail.
|
||||
virtual status_t disconnect();
|
||||
|
||||
// getReleasedBuffers sets the value pointed to by outSlotMask to a bit mask
|
||||
// indicating which buffer slots have been released by the BufferQueue
|
||||
// but have not yet been released by the consumer.
|
||||
//
|
||||
// This should be called from the onBuffersReleased() callback.
|
||||
virtual status_t getReleasedBuffers(uint64_t* outSlotMask);
|
||||
|
||||
// setDefaultBufferSize is used to set the size of buffers returned by
|
||||
// dequeueBuffer when a width and height of zero is requested. Default
|
||||
// is 1x1.
|
||||
virtual status_t setDefaultBufferSize(uint32_t width, uint32_t height);
|
||||
|
||||
// setDefaultMaxBufferCount sets the default value for the maximum buffer
|
||||
// count (the initial default is 2). If the producer has requested a
|
||||
// buffer count using setBufferCount, the default buffer count will only
|
||||
// take effect if the producer sets the count back to zero.
|
||||
//
|
||||
// The count must be between 2 and NUM_BUFFER_SLOTS, inclusive.
|
||||
virtual status_t setDefaultMaxBufferCount(int bufferCount);
|
||||
|
||||
// disableAsyncBuffer disables the extra buffer used in async mode
|
||||
// (when both producer and consumer have set their "isControlledByApp"
|
||||
// flag) and has dequeueBuffer() return WOULD_BLOCK instead.
|
||||
//
|
||||
// This can only be called before connect().
|
||||
virtual status_t disableAsyncBuffer();
|
||||
|
||||
// setMaxAcquiredBufferCount sets the maximum number of buffers that can
|
||||
// be acquired by the consumer at one time (default 1). This call will
|
||||
// fail if a producer is connected to the BufferQueue.
|
||||
virtual status_t setMaxAcquiredBufferCount(int maxAcquiredBuffers);
|
||||
|
||||
// setConsumerName sets the name used in logging
|
||||
virtual void setConsumerName(const String8& name);
|
||||
|
||||
// setDefaultBufferFormat allows the BufferQueue to create
|
||||
// GraphicBuffers of a defaultFormat if no format is specified
|
||||
// in dequeueBuffer. The initial default is HAL_PIXEL_FORMAT_RGBA_8888.
|
||||
virtual status_t setDefaultBufferFormat(PixelFormat defaultFormat);
|
||||
|
||||
// setDefaultBufferDataSpace allows the BufferQueue to create
|
||||
// GraphicBuffers of a defaultDataSpace if no data space is specified
|
||||
// in queueBuffer.
|
||||
// The initial default is HAL_DATASPACE_UNKNOWN
|
||||
virtual status_t setDefaultBufferDataSpace(
|
||||
android_dataspace defaultDataSpace);
|
||||
|
||||
// setConsumerUsageBits will turn on additional usage bits for dequeueBuffer.
|
||||
// These are merged with the bits passed to dequeueBuffer. The values are
|
||||
// enumerated in gralloc.h, e.g. GRALLOC_USAGE_HW_RENDER; the default is 0.
|
||||
virtual status_t setConsumerUsageBits(uint32_t usage);
|
||||
|
||||
// setTransformHint bakes in rotation to buffers so overlays can be used.
|
||||
// The values are enumerated in window.h, e.g.
|
||||
// NATIVE_WINDOW_TRANSFORM_ROT_90. The default is 0 (no transform).
|
||||
virtual status_t setTransformHint(uint32_t hint);
|
||||
|
||||
// Retrieve the sideband buffer stream, if any.
|
||||
virtual sp<NativeHandle> getSidebandStream() const;
|
||||
|
||||
// dump our state in a String
|
||||
virtual void dump(String8& result, const char* prefix) const;
|
||||
|
||||
// Functions required for backwards compatibility.
|
||||
// These will be modified/renamed in IGraphicBufferConsumer and will be
|
||||
// removed from this class at that time. See b/13306289.
|
||||
|
||||
virtual status_t releaseBuffer(int buf, uint64_t frameNumber,
|
||||
EGLDisplay display, EGLSyncKHR fence,
|
||||
const sp<Fence>& releaseFence) {
|
||||
return releaseBuffer(buf, frameNumber, releaseFence, display, fence);
|
||||
}
|
||||
|
||||
virtual status_t consumerConnect(const sp<IConsumerListener>& consumer,
|
||||
bool controlledByApp) {
|
||||
return connect(consumer, controlledByApp);
|
||||
}
|
||||
|
||||
virtual status_t consumerDisconnect() { return disconnect(); }
|
||||
|
||||
// End functions required for backwards compatibility
|
||||
|
||||
private:
|
||||
sp<BufferQueueCore> mCore;
|
||||
|
||||
// This references mCore->mSlots. Lock mCore->mMutex while accessing.
|
||||
BufferQueueDefs::SlotsType& mSlots;
|
||||
|
||||
// This is a cached copy of the name stored in the BufferQueueCore.
|
||||
// It's updated during setConsumerName.
|
||||
String8 mConsumerName;
|
||||
|
||||
}; // class BufferQueueConsumer
|
||||
|
||||
} // namespace android
|
||||
|
||||
#endif
|
||||
287
third_party/android_frameworks_native/include/gui/BufferQueueCore.h
vendored
Normal file
287
third_party/android_frameworks_native/include/gui/BufferQueueCore.h
vendored
Normal file
@@ -0,0 +1,287 @@
|
||||
/*
|
||||
* Copyright 2014 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#ifndef ANDROID_GUI_BUFFERQUEUECORE_H
|
||||
#define ANDROID_GUI_BUFFERQUEUECORE_H
|
||||
|
||||
#include <gui/BufferItem.h>
|
||||
#include <gui/BufferQueueDefs.h>
|
||||
#include <gui/BufferSlot.h>
|
||||
|
||||
#include <utils/Condition.h>
|
||||
#include <utils/Mutex.h>
|
||||
#include <utils/NativeHandle.h>
|
||||
#include <utils/RefBase.h>
|
||||
#include <utils/String8.h>
|
||||
#include <utils/StrongPointer.h>
|
||||
#include <utils/Trace.h>
|
||||
#include <utils/Vector.h>
|
||||
|
||||
#include <list>
|
||||
#include <set>
|
||||
|
||||
#define BQ_LOGV(x, ...) ALOGV("[%s] " x, mConsumerName.string(), ##__VA_ARGS__)
|
||||
#define BQ_LOGD(x, ...) ALOGD("[%s] " x, mConsumerName.string(), ##__VA_ARGS__)
|
||||
#define BQ_LOGI(x, ...) ALOGI("[%s] " x, mConsumerName.string(), ##__VA_ARGS__)
|
||||
#define BQ_LOGW(x, ...) ALOGW("[%s] " x, mConsumerName.string(), ##__VA_ARGS__)
|
||||
#define BQ_LOGE(x, ...) ALOGE("[%s] " x, mConsumerName.string(), ##__VA_ARGS__)
|
||||
|
||||
#define ATRACE_BUFFER_INDEX(index) \
|
||||
if (ATRACE_ENABLED()) { \
|
||||
char ___traceBuf[1024]; \
|
||||
snprintf(___traceBuf, 1024, "%s: %d", \
|
||||
mCore->mConsumerName.string(), (index)); \
|
||||
android::ScopedTrace ___bufTracer(ATRACE_TAG, ___traceBuf); \
|
||||
}
|
||||
|
||||
namespace android {
|
||||
|
||||
class IConsumerListener;
|
||||
class IGraphicBufferAlloc;
|
||||
class IProducerListener;
|
||||
|
||||
class BufferQueueCore : public virtual RefBase {
|
||||
|
||||
friend class BufferQueueProducer;
|
||||
friend class BufferQueueConsumer;
|
||||
|
||||
public:
|
||||
// Used as a placeholder slot number when the value isn't pointing to an
|
||||
// existing buffer.
|
||||
enum { INVALID_BUFFER_SLOT = BufferItem::INVALID_BUFFER_SLOT };
|
||||
|
||||
// We reserve two slots in order to guarantee that the producer and
|
||||
// consumer can run asynchronously.
|
||||
enum { MAX_MAX_ACQUIRED_BUFFERS = BufferQueueDefs::NUM_BUFFER_SLOTS - 2 };
|
||||
|
||||
// The default API number used to indicate that no producer is connected
|
||||
enum { NO_CONNECTED_API = 0 };
|
||||
|
||||
typedef Vector<BufferItem> Fifo;
|
||||
|
||||
// BufferQueueCore manages a pool of gralloc memory slots to be used by
|
||||
// producers and consumers. allocator is used to allocate all the needed
|
||||
// gralloc buffers.
|
||||
BufferQueueCore(const sp<IGraphicBufferAlloc>& allocator = NULL);
|
||||
virtual ~BufferQueueCore();
|
||||
|
||||
private:
|
||||
// Dump our state in a string
|
||||
void dump(String8& result, const char* prefix) const;
|
||||
|
||||
// getMinUndequeuedBufferCountLocked returns the minimum number of buffers
|
||||
// that must remain in a state other than DEQUEUED. The async parameter
|
||||
// tells whether we're in asynchronous mode.
|
||||
int getMinUndequeuedBufferCountLocked(bool async) const;
|
||||
|
||||
// getMinMaxBufferCountLocked returns the minimum number of buffers allowed
|
||||
// given the current BufferQueue state. The async parameter tells whether
|
||||
// we're in asynchonous mode.
|
||||
int getMinMaxBufferCountLocked(bool async) const;
|
||||
|
||||
// getMaxBufferCountLocked returns the maximum number of buffers that can be
|
||||
// allocated at once. This value depends on the following member variables:
|
||||
//
|
||||
// mDequeueBufferCannotBlock
|
||||
// mMaxAcquiredBufferCount
|
||||
// mDefaultMaxBufferCount
|
||||
// mOverrideMaxBufferCount
|
||||
// async parameter
|
||||
//
|
||||
// Any time one of these member variables is changed while a producer is
|
||||
// connected, mDequeueCondition must be broadcast.
|
||||
int getMaxBufferCountLocked(bool async) const;
|
||||
|
||||
// setDefaultMaxBufferCountLocked sets the maximum number of buffer slots
|
||||
// that will be used if the producer does not override the buffer slot
|
||||
// count. The count must be between 2 and NUM_BUFFER_SLOTS, inclusive. The
|
||||
// initial default is 2.
|
||||
status_t setDefaultMaxBufferCountLocked(int count);
|
||||
|
||||
// freeBufferLocked frees the GraphicBuffer and sync resources for the
|
||||
// given slot.
|
||||
void freeBufferLocked(int slot);
|
||||
|
||||
// freeAllBuffersLocked frees the GraphicBuffer and sync resources for
|
||||
// all slots.
|
||||
void freeAllBuffersLocked();
|
||||
|
||||
// stillTracking returns true iff the buffer item is still being tracked
|
||||
// in one of the slots.
|
||||
bool stillTracking(const BufferItem* item) const;
|
||||
|
||||
// waitWhileAllocatingLocked blocks until mIsAllocating is false.
|
||||
void waitWhileAllocatingLocked() const;
|
||||
|
||||
// validateConsistencyLocked ensures that the free lists are in sync with
|
||||
// the information stored in mSlots
|
||||
void validateConsistencyLocked() const;
|
||||
|
||||
// mAllocator is the connection to SurfaceFlinger that is used to allocate
|
||||
// new GraphicBuffer objects.
|
||||
sp<IGraphicBufferAlloc> mAllocator;
|
||||
|
||||
// mMutex is the mutex used to prevent concurrent access to the member
|
||||
// variables of BufferQueueCore objects. It must be locked whenever any
|
||||
// member variable is accessed.
|
||||
mutable Mutex mMutex;
|
||||
|
||||
// mIsAbandoned indicates that the BufferQueue will no longer be used to
|
||||
// consume image buffers pushed to it using the IGraphicBufferProducer
|
||||
// interface. It is initialized to false, and set to true in the
|
||||
// consumerDisconnect method. A BufferQueue that is abandoned will return
|
||||
// the NO_INIT error from all IGraphicBufferProducer methods capable of
|
||||
// returning an error.
|
||||
bool mIsAbandoned;
|
||||
|
||||
// mConsumerControlledByApp indicates whether the connected consumer is
|
||||
// controlled by the application.
|
||||
bool mConsumerControlledByApp;
|
||||
|
||||
// mConsumerName is a string used to identify the BufferQueue in log
|
||||
// messages. It is set by the IGraphicBufferConsumer::setConsumerName
|
||||
// method.
|
||||
String8 mConsumerName;
|
||||
|
||||
// mConsumerListener is used to notify the connected consumer of
|
||||
// asynchronous events that it may wish to react to. It is initially
|
||||
// set to NULL and is written by consumerConnect and consumerDisconnect.
|
||||
sp<IConsumerListener> mConsumerListener;
|
||||
|
||||
// mConsumerUsageBits contains flags that the consumer wants for
|
||||
// GraphicBuffers.
|
||||
uint32_t mConsumerUsageBits;
|
||||
|
||||
// mConnectedApi indicates the producer API that is currently connected
|
||||
// to this BufferQueue. It defaults to NO_CONNECTED_API, and gets updated
|
||||
// by the connect and disconnect methods.
|
||||
int mConnectedApi;
|
||||
|
||||
// mConnectedProducerToken is used to set a binder death notification on
|
||||
// the producer.
|
||||
sp<IProducerListener> mConnectedProducerListener;
|
||||
|
||||
// mSlots is an array of buffer slots that must be mirrored on the producer
|
||||
// side. This allows buffer ownership to be transferred between the producer
|
||||
// and consumer without sending a GraphicBuffer over Binder. The entire
|
||||
// array is initialized to NULL at construction time, and buffers are
|
||||
// allocated for a slot when requestBuffer is called with that slot's index.
|
||||
BufferQueueDefs::SlotsType mSlots;
|
||||
|
||||
// mQueue is a FIFO of queued buffers used in synchronous mode.
|
||||
Fifo mQueue;
|
||||
|
||||
// mFreeSlots contains all of the slots which are FREE and do not currently
|
||||
// have a buffer attached
|
||||
std::set<int> mFreeSlots;
|
||||
|
||||
// mFreeBuffers contains all of the slots which are FREE and currently have
|
||||
// a buffer attached
|
||||
std::list<int> mFreeBuffers;
|
||||
|
||||
// mOverrideMaxBufferCount is the limit on the number of buffers that will
|
||||
// be allocated at one time. This value is set by the producer by calling
|
||||
// setBufferCount. The default is 0, which means that the producer doesn't
|
||||
// care about the number of buffers in the pool. In that case,
|
||||
// mDefaultMaxBufferCount is used as the limit.
|
||||
int mOverrideMaxBufferCount;
|
||||
|
||||
// mDequeueCondition is a condition variable used for dequeueBuffer in
|
||||
// synchronous mode.
|
||||
mutable Condition mDequeueCondition;
|
||||
|
||||
// mUseAsyncBuffer indicates whether an extra buffer is used in async mode
|
||||
// to prevent dequeueBuffer from blocking.
|
||||
bool mUseAsyncBuffer;
|
||||
|
||||
// mDequeueBufferCannotBlock indicates whether dequeueBuffer is allowed to
|
||||
// block. This flag is set during connect when both the producer and
|
||||
// consumer are controlled by the application.
|
||||
bool mDequeueBufferCannotBlock;
|
||||
|
||||
// mDefaultBufferFormat can be set so it will override the buffer format
|
||||
// when it isn't specified in dequeueBuffer.
|
||||
PixelFormat mDefaultBufferFormat;
|
||||
|
||||
// mDefaultWidth holds the default width of allocated buffers. It is used
|
||||
// in dequeueBuffer if a width and height of 0 are specified.
|
||||
uint32_t mDefaultWidth;
|
||||
|
||||
// mDefaultHeight holds the default height of allocated buffers. It is used
|
||||
// in dequeueBuffer if a width and height of 0 are specified.
|
||||
uint32_t mDefaultHeight;
|
||||
|
||||
// mDefaultBufferDataSpace holds the default dataSpace of queued buffers.
|
||||
// It is used in queueBuffer if a dataspace of 0 (HAL_DATASPACE_UNKNOWN)
|
||||
// is specified.
|
||||
android_dataspace mDefaultBufferDataSpace;
|
||||
|
||||
// mDefaultMaxBufferCount is the default limit on the number of buffers that
|
||||
// will be allocated at one time. This default limit is set by the consumer.
|
||||
// The limit (as opposed to the default limit) may be overriden by the
|
||||
// producer.
|
||||
int mDefaultMaxBufferCount;
|
||||
|
||||
// mMaxAcquiredBufferCount is the number of buffers that the consumer may
|
||||
// acquire at one time. It defaults to 1, and can be changed by the consumer
|
||||
// via setMaxAcquiredBufferCount, but this may only be done while no
|
||||
// producer is connected to the BufferQueue. This value is used to derive
|
||||
// the value returned for the MIN_UNDEQUEUED_BUFFERS query to the producer.
|
||||
int mMaxAcquiredBufferCount;
|
||||
|
||||
// mBufferHasBeenQueued is true once a buffer has been queued. It is reset
|
||||
// when something causes all buffers to be freed (e.g., changing the buffer
|
||||
// count).
|
||||
bool mBufferHasBeenQueued;
|
||||
|
||||
// mFrameCounter is the free running counter, incremented on every
|
||||
// successful queueBuffer call and buffer allocation.
|
||||
uint64_t mFrameCounter;
|
||||
|
||||
// mTransformHint is used to optimize for screen rotations.
|
||||
uint32_t mTransformHint;
|
||||
|
||||
// mSidebandStream is a handle to the sideband buffer stream, if any
|
||||
sp<NativeHandle> mSidebandStream;
|
||||
|
||||
// mIsAllocating indicates whether a producer is currently trying to allocate buffers (which
|
||||
// releases mMutex while doing the allocation proper). Producers should not modify any of the
|
||||
// FREE slots while this is true. mIsAllocatingCondition is signaled when this value changes to
|
||||
// false.
|
||||
bool mIsAllocating;
|
||||
|
||||
// mIsAllocatingCondition is a condition variable used by producers to wait until mIsAllocating
|
||||
// becomes false.
|
||||
mutable Condition mIsAllocatingCondition;
|
||||
|
||||
// mAllowAllocation determines whether dequeueBuffer is allowed to allocate
|
||||
// new buffers
|
||||
bool mAllowAllocation;
|
||||
|
||||
// mBufferAge tracks the age of the contents of the most recently dequeued
|
||||
// buffer as the number of frames that have elapsed since it was last queued
|
||||
uint64_t mBufferAge;
|
||||
|
||||
// mGenerationNumber stores the current generation number of the attached
|
||||
// producer. Any attempt to attach a buffer with a different generation
|
||||
// number will fail.
|
||||
uint32_t mGenerationNumber;
|
||||
|
||||
}; // class BufferQueueCore
|
||||
|
||||
} // namespace android
|
||||
|
||||
#endif
|
||||
35
third_party/android_frameworks_native/include/gui/BufferQueueDefs.h
vendored
Normal file
35
third_party/android_frameworks_native/include/gui/BufferQueueDefs.h
vendored
Normal file
@@ -0,0 +1,35 @@
|
||||
/*
|
||||
* Copyright 2014 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#ifndef ANDROID_GUI_BUFFERQUEUECOREDEFS_H
|
||||
#define ANDROID_GUI_BUFFERQUEUECOREDEFS_H
|
||||
|
||||
#include <gui/BufferSlot.h>
|
||||
|
||||
namespace android {
|
||||
class BufferQueueCore;
|
||||
|
||||
namespace BufferQueueDefs {
|
||||
// BufferQueue will keep track of at most this value of buffers.
|
||||
// Attempts at runtime to increase the number of buffers past this
|
||||
// will fail.
|
||||
enum { NUM_BUFFER_SLOTS = 64 };
|
||||
|
||||
typedef BufferSlot SlotsType[NUM_BUFFER_SLOTS];
|
||||
} // namespace BufferQueueDefs
|
||||
} // namespace android
|
||||
|
||||
#endif
|
||||
228
third_party/android_frameworks_native/include/gui/BufferQueueProducer.h
vendored
Normal file
228
third_party/android_frameworks_native/include/gui/BufferQueueProducer.h
vendored
Normal file
@@ -0,0 +1,228 @@
|
||||
/*
|
||||
* Copyright 2014 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#ifndef ANDROID_GUI_BUFFERQUEUEPRODUCER_H
|
||||
#define ANDROID_GUI_BUFFERQUEUEPRODUCER_H
|
||||
|
||||
#include <gui/BufferQueueDefs.h>
|
||||
#include <gui/IGraphicBufferProducer.h>
|
||||
|
||||
namespace android {
|
||||
|
||||
class BufferSlot;
|
||||
|
||||
class BufferQueueProducer : public BnGraphicBufferProducer,
|
||||
private IBinder::DeathRecipient {
|
||||
public:
|
||||
friend class BufferQueue; // Needed to access binderDied
|
||||
|
||||
BufferQueueProducer(const sp<BufferQueueCore>& core);
|
||||
virtual ~BufferQueueProducer();
|
||||
|
||||
// requestBuffer returns the GraphicBuffer for slot N.
|
||||
//
|
||||
// In normal operation, this is called the first time slot N is returned
|
||||
// by dequeueBuffer. It must be called again if dequeueBuffer returns
|
||||
// flags indicating that previously-returned buffers are no longer valid.
|
||||
virtual status_t requestBuffer(int slot, sp<GraphicBuffer>* buf);
|
||||
|
||||
// setBufferCount updates the number of available buffer slots. If this
|
||||
// method succeeds, buffer slots will be both unallocated and owned by
|
||||
// the BufferQueue object (i.e. they are not owned by the producer or
|
||||
// consumer).
|
||||
//
|
||||
// This will fail if the producer has dequeued any buffers, or if
|
||||
// bufferCount is invalid. bufferCount must generally be a value
|
||||
// between the minimum undequeued buffer count (exclusive) and NUM_BUFFER_SLOTS
|
||||
// (inclusive). It may also be set to zero (the default) to indicate
|
||||
// that the producer does not wish to set a value. The minimum value
|
||||
// can be obtained by calling query(NATIVE_WINDOW_MIN_UNDEQUEUED_BUFFERS,
|
||||
// ...).
|
||||
//
|
||||
// This may only be called by the producer. The consumer will be told
|
||||
// to discard buffers through the onBuffersReleased callback.
|
||||
virtual status_t setBufferCount(int bufferCount);
|
||||
|
||||
// dequeueBuffer gets the next buffer slot index for the producer to use.
|
||||
// If a buffer slot is available then that slot index is written to the
|
||||
// location pointed to by the buf argument and a status of OK is returned.
|
||||
// If no slot is available then a status of -EBUSY is returned and buf is
|
||||
// unmodified.
|
||||
//
|
||||
// The outFence parameter will be updated to hold the fence associated with
|
||||
// the buffer. The contents of the buffer must not be overwritten until the
|
||||
// fence signals. If the fence is Fence::NO_FENCE, the buffer may be
|
||||
// written immediately.
|
||||
//
|
||||
// The width and height parameters must be no greater than the minimum of
|
||||
// GL_MAX_VIEWPORT_DIMS and GL_MAX_TEXTURE_SIZE (see: glGetIntegerv).
|
||||
// An error due to invalid dimensions might not be reported until
|
||||
// updateTexImage() is called. If width and height are both zero, the
|
||||
// default values specified by setDefaultBufferSize() are used instead.
|
||||
//
|
||||
// If the format is 0, the default format will be used.
|
||||
//
|
||||
// The usage argument specifies gralloc buffer usage flags. The values
|
||||
// are enumerated in gralloc.h, e.g. GRALLOC_USAGE_HW_RENDER. These
|
||||
// will be merged with the usage flags specified by setConsumerUsageBits.
|
||||
//
|
||||
// The return value may be a negative error value or a non-negative
|
||||
// collection of flags. If the flags are set, the return values are
|
||||
// valid, but additional actions must be performed.
|
||||
//
|
||||
// If IGraphicBufferProducer::BUFFER_NEEDS_REALLOCATION is set, the
|
||||
// producer must discard cached GraphicBuffer references for the slot
|
||||
// returned in buf.
|
||||
// If IGraphicBufferProducer::RELEASE_ALL_BUFFERS is set, the producer
|
||||
// must discard cached GraphicBuffer references for all slots.
|
||||
//
|
||||
// In both cases, the producer will need to call requestBuffer to get a
|
||||
// GraphicBuffer handle for the returned slot.
|
||||
virtual status_t dequeueBuffer(int *outSlot, sp<Fence>* outFence,
|
||||
bool async, uint32_t width, uint32_t height, PixelFormat format,
|
||||
uint32_t usage);
|
||||
|
||||
// See IGraphicBufferProducer::detachBuffer
|
||||
virtual status_t detachBuffer(int slot);
|
||||
|
||||
// See IGraphicBufferProducer::detachNextBuffer
|
||||
virtual status_t detachNextBuffer(sp<GraphicBuffer>* outBuffer,
|
||||
sp<Fence>* outFence);
|
||||
|
||||
// See IGraphicBufferProducer::attachBuffer
|
||||
virtual status_t attachBuffer(int* outSlot, const sp<GraphicBuffer>& buffer);
|
||||
|
||||
// queueBuffer returns a filled buffer to the BufferQueue.
|
||||
//
|
||||
// Additional data is provided in the QueueBufferInput struct. Notably,
|
||||
// a timestamp must be provided for the buffer. The timestamp is in
|
||||
// nanoseconds, and must be monotonically increasing. Its other semantics
|
||||
// (zero point, etc) are producer-specific and should be documented by the
|
||||
// producer.
|
||||
//
|
||||
// The caller may provide a fence that signals when all rendering
|
||||
// operations have completed. Alternatively, NO_FENCE may be used,
|
||||
// indicating that the buffer is ready immediately.
|
||||
//
|
||||
// Some values are returned in the output struct: the current settings
|
||||
// for default width and height, the current transform hint, and the
|
||||
// number of queued buffers.
|
||||
virtual status_t queueBuffer(int slot,
|
||||
const QueueBufferInput& input, QueueBufferOutput* output);
|
||||
|
||||
// cancelBuffer returns a dequeued buffer to the BufferQueue, but doesn't
|
||||
// queue it for use by the consumer.
|
||||
//
|
||||
// The buffer will not be overwritten until the fence signals. The fence
|
||||
// will usually be the one obtained from dequeueBuffer.
|
||||
virtual void cancelBuffer(int slot, const sp<Fence>& fence);
|
||||
|
||||
// Query native window attributes. The "what" values are enumerated in
|
||||
// window.h (e.g. NATIVE_WINDOW_FORMAT).
|
||||
virtual int query(int what, int* outValue);
|
||||
|
||||
// connect attempts to connect a producer API to the BufferQueue. This
|
||||
// must be called before any other IGraphicBufferProducer methods are
|
||||
// called except for getAllocator. A consumer must already be connected.
|
||||
//
|
||||
// This method will fail if connect was previously called on the
|
||||
// BufferQueue and no corresponding disconnect call was made (i.e. if
|
||||
// it's still connected to a producer).
|
||||
//
|
||||
// APIs are enumerated in window.h (e.g. NATIVE_WINDOW_API_CPU).
|
||||
virtual status_t connect(const sp<IProducerListener>& listener,
|
||||
int api, bool producerControlledByApp, QueueBufferOutput* output);
|
||||
|
||||
// disconnect attempts to disconnect a producer API from the BufferQueue.
|
||||
// Calling this method will cause any subsequent calls to other
|
||||
// IGraphicBufferProducer methods to fail except for getAllocator and connect.
|
||||
// Successfully calling connect after this will allow the other methods to
|
||||
// succeed again.
|
||||
//
|
||||
// This method will fail if the the BufferQueue is not currently
|
||||
// connected to the specified producer API.
|
||||
virtual status_t disconnect(int api);
|
||||
|
||||
// Attaches a sideband buffer stream to the IGraphicBufferProducer.
|
||||
//
|
||||
// A sideband stream is a device-specific mechanism for passing buffers
|
||||
// from the producer to the consumer without using dequeueBuffer/
|
||||
// queueBuffer. If a sideband stream is present, the consumer can choose
|
||||
// whether to acquire buffers from the sideband stream or from the queued
|
||||
// buffers.
|
||||
//
|
||||
// Passing NULL or a different stream handle will detach the previous
|
||||
// handle if any.
|
||||
virtual status_t setSidebandStream(const sp<NativeHandle>& stream);
|
||||
|
||||
// See IGraphicBufferProducer::allocateBuffers
|
||||
virtual void allocateBuffers(bool async, uint32_t width, uint32_t height,
|
||||
PixelFormat format, uint32_t usage);
|
||||
|
||||
// See IGraphicBufferProducer::allowAllocation
|
||||
virtual status_t allowAllocation(bool allow);
|
||||
|
||||
// See IGraphicBufferProducer::setGenerationNumber
|
||||
virtual status_t setGenerationNumber(uint32_t generationNumber);
|
||||
|
||||
// See IGraphicBufferProducer::getConsumerName
|
||||
virtual String8 getConsumerName() const override;
|
||||
|
||||
private:
|
||||
// This is required by the IBinder::DeathRecipient interface
|
||||
virtual void binderDied(const wp<IBinder>& who);
|
||||
|
||||
// waitForFreeSlotThenRelock finds the oldest slot in the FREE state. It may
|
||||
// block if there are no available slots and we are not in non-blocking
|
||||
// mode (producer and consumer controlled by the application). If it blocks,
|
||||
// it will release mCore->mMutex while blocked so that other operations on
|
||||
// the BufferQueue may succeed.
|
||||
status_t waitForFreeSlotThenRelock(const char* caller, bool async,
|
||||
int* found, status_t* returnFlags) const;
|
||||
|
||||
sp<BufferQueueCore> mCore;
|
||||
|
||||
// This references mCore->mSlots. Lock mCore->mMutex while accessing.
|
||||
BufferQueueDefs::SlotsType& mSlots;
|
||||
|
||||
// This is a cached copy of the name stored in the BufferQueueCore.
|
||||
// It's updated during connect and dequeueBuffer (which should catch
|
||||
// most updates).
|
||||
String8 mConsumerName;
|
||||
|
||||
uint32_t mStickyTransform;
|
||||
|
||||
// This saves the fence from the last queueBuffer, such that the
|
||||
// next queueBuffer call can throttle buffer production. The prior
|
||||
// queueBuffer's fence is not nessessarily available elsewhere,
|
||||
// since the previous buffer might have already been acquired.
|
||||
sp<Fence> mLastQueueBufferFence;
|
||||
|
||||
// Take-a-ticket system for ensuring that onFrame* callbacks are called in
|
||||
// the order that frames are queued. While the BufferQueue lock
|
||||
// (mCore->mMutex) is held, a ticket is retained by the producer. After
|
||||
// dropping the BufferQueue lock, the producer must wait on the condition
|
||||
// variable until the current callback ticket matches its retained ticket.
|
||||
Mutex mCallbackMutex;
|
||||
int mNextCallbackTicket; // Protected by mCore->mMutex
|
||||
int mCurrentCallbackTicket; // Protected by mCallbackMutex
|
||||
Condition mCallbackCondition;
|
||||
|
||||
}; // class BufferQueueProducer
|
||||
|
||||
} // namespace android
|
||||
|
||||
#endif
|
||||
142
third_party/android_frameworks_native/include/gui/BufferSlot.h
vendored
Normal file
142
third_party/android_frameworks_native/include/gui/BufferSlot.h
vendored
Normal file
@@ -0,0 +1,142 @@
|
||||
/*
|
||||
* Copyright 2014 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#ifndef ANDROID_GUI_BUFFERSLOT_H
|
||||
#define ANDROID_GUI_BUFFERSLOT_H
|
||||
|
||||
#include <ui/Fence.h>
|
||||
#include <ui/GraphicBuffer.h>
|
||||
|
||||
#include <EGL/egl.h>
|
||||
#include <EGL/eglext.h>
|
||||
|
||||
#include <utils/StrongPointer.h>
|
||||
|
||||
namespace android {
|
||||
|
||||
class Fence;
|
||||
|
||||
struct BufferSlot {
|
||||
|
||||
BufferSlot()
|
||||
: mEglDisplay(EGL_NO_DISPLAY),
|
||||
mBufferState(BufferSlot::FREE),
|
||||
mRequestBufferCalled(false),
|
||||
mFrameNumber(0),
|
||||
mEglFence(EGL_NO_SYNC_KHR),
|
||||
mAcquireCalled(false),
|
||||
mNeedsCleanupOnRelease(false),
|
||||
mAttachedByConsumer(false) {
|
||||
}
|
||||
|
||||
// mGraphicBuffer points to the buffer allocated for this slot or is NULL
|
||||
// if no buffer has been allocated.
|
||||
sp<GraphicBuffer> mGraphicBuffer;
|
||||
|
||||
// mEglDisplay is the EGLDisplay used to create EGLSyncKHR objects.
|
||||
EGLDisplay mEglDisplay;
|
||||
|
||||
// BufferState represents the different states in which a buffer slot
|
||||
// can be. All slots are initially FREE.
|
||||
enum BufferState {
|
||||
// FREE indicates that the buffer is available to be dequeued
|
||||
// by the producer. The buffer may be in use by the consumer for
|
||||
// a finite time, so the buffer must not be modified until the
|
||||
// associated fence is signaled.
|
||||
//
|
||||
// The slot is "owned" by BufferQueue. It transitions to DEQUEUED
|
||||
// when dequeueBuffer is called.
|
||||
FREE = 0,
|
||||
|
||||
// DEQUEUED indicates that the buffer has been dequeued by the
|
||||
// producer, but has not yet been queued or canceled. The
|
||||
// producer may modify the buffer's contents as soon as the
|
||||
// associated ready fence is signaled.
|
||||
//
|
||||
// The slot is "owned" by the producer. It can transition to
|
||||
// QUEUED (via queueBuffer) or back to FREE (via cancelBuffer).
|
||||
DEQUEUED = 1,
|
||||
|
||||
// QUEUED indicates that the buffer has been filled by the
|
||||
// producer and queued for use by the consumer. The buffer
|
||||
// contents may continue to be modified for a finite time, so
|
||||
// the contents must not be accessed until the associated fence
|
||||
// is signaled.
|
||||
//
|
||||
// The slot is "owned" by BufferQueue. It can transition to
|
||||
// ACQUIRED (via acquireBuffer) or to FREE (if another buffer is
|
||||
// queued in asynchronous mode).
|
||||
QUEUED = 2,
|
||||
|
||||
// ACQUIRED indicates that the buffer has been acquired by the
|
||||
// consumer. As with QUEUED, the contents must not be accessed
|
||||
// by the consumer until the fence is signaled.
|
||||
//
|
||||
// The slot is "owned" by the consumer. It transitions to FREE
|
||||
// when releaseBuffer is called.
|
||||
ACQUIRED = 3
|
||||
};
|
||||
|
||||
static const char* bufferStateName(BufferState state);
|
||||
|
||||
// mBufferState is the current state of this buffer slot.
|
||||
BufferState mBufferState;
|
||||
|
||||
// mRequestBufferCalled is used for validating that the producer did
|
||||
// call requestBuffer() when told to do so. Technically this is not
|
||||
// needed but useful for debugging and catching producer bugs.
|
||||
bool mRequestBufferCalled;
|
||||
|
||||
// mFrameNumber is the number of the queued frame for this slot. This
|
||||
// is used to dequeue buffers in LRU order (useful because buffers
|
||||
// may be released before their release fence is signaled).
|
||||
uint64_t mFrameNumber;
|
||||
|
||||
// mEglFence is the EGL sync object that must signal before the buffer
|
||||
// associated with this buffer slot may be dequeued. It is initialized
|
||||
// to EGL_NO_SYNC_KHR when the buffer is created and may be set to a
|
||||
// new sync object in releaseBuffer. (This is deprecated in favor of
|
||||
// mFence, below.)
|
||||
EGLSyncKHR mEglFence;
|
||||
|
||||
// mFence is a fence which will signal when work initiated by the
|
||||
// previous owner of the buffer is finished. When the buffer is FREE,
|
||||
// the fence indicates when the consumer has finished reading
|
||||
// from the buffer, or when the producer has finished writing if it
|
||||
// called cancelBuffer after queueing some writes. When the buffer is
|
||||
// QUEUED, it indicates when the producer has finished filling the
|
||||
// buffer. When the buffer is DEQUEUED or ACQUIRED, the fence has been
|
||||
// passed to the consumer or producer along with ownership of the
|
||||
// buffer, and mFence is set to NO_FENCE.
|
||||
sp<Fence> mFence;
|
||||
|
||||
// Indicates whether this buffer has been seen by a consumer yet
|
||||
bool mAcquireCalled;
|
||||
|
||||
// Indicates whether this buffer needs to be cleaned up by the
|
||||
// consumer. This is set when a buffer in ACQUIRED state is freed.
|
||||
// It causes releaseBuffer to return STALE_BUFFER_SLOT.
|
||||
bool mNeedsCleanupOnRelease;
|
||||
|
||||
// Indicates whether the buffer was attached on the consumer side.
|
||||
// If so, it needs to set the BUFFER_NEEDS_REALLOCATION flag when dequeued
|
||||
// to prevent the producer from using a stale cached buffer.
|
||||
bool mAttachedByConsumer;
|
||||
};
|
||||
|
||||
} // namespace android
|
||||
|
||||
#endif
|
||||
252
third_party/android_frameworks_native/include/gui/ConsumerBase.h
vendored
Normal file
252
third_party/android_frameworks_native/include/gui/ConsumerBase.h
vendored
Normal file
@@ -0,0 +1,252 @@
|
||||
/*
|
||||
* Copyright (C) 2010 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#ifndef ANDROID_GUI_CONSUMERBASE_H
|
||||
#define ANDROID_GUI_CONSUMERBASE_H
|
||||
|
||||
#include <gui/BufferQueue.h>
|
||||
|
||||
#include <ui/GraphicBuffer.h>
|
||||
|
||||
#include <utils/String8.h>
|
||||
#include <utils/Vector.h>
|
||||
#include <utils/threads.h>
|
||||
#include <gui/IConsumerListener.h>
|
||||
|
||||
namespace android {
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
class String8;
|
||||
|
||||
// ConsumerBase is a base class for BufferQueue consumer end-points. It
|
||||
// handles common tasks like management of the connection to the BufferQueue
|
||||
// and the buffer pool.
|
||||
class ConsumerBase : public virtual RefBase,
|
||||
protected ConsumerListener {
|
||||
public:
|
||||
struct FrameAvailableListener : public virtual RefBase {
|
||||
// See IConsumerListener::onFrame{Available,Replaced}
|
||||
virtual void onFrameAvailable(const BufferItem& item) = 0;
|
||||
virtual void onFrameReplaced(const BufferItem& /* item */) {}
|
||||
};
|
||||
|
||||
virtual ~ConsumerBase();
|
||||
|
||||
// abandon frees all the buffers and puts the ConsumerBase into the
|
||||
// 'abandoned' state. Once put in this state the ConsumerBase can never
|
||||
// leave it. When in the 'abandoned' state, all methods of the
|
||||
// IGraphicBufferProducer interface will fail with the NO_INIT error.
|
||||
//
|
||||
// Note that while calling this method causes all the buffers to be freed
|
||||
// from the perspective of the the ConsumerBase, if there are additional
|
||||
// references on the buffers (e.g. if a buffer is referenced by a client
|
||||
// or by OpenGL ES as a texture) then those buffer will remain allocated.
|
||||
void abandon();
|
||||
|
||||
// Returns true if the ConsumerBase is in the 'abandoned' state
|
||||
bool isAbandoned();
|
||||
|
||||
// set the name of the ConsumerBase that will be used to identify it in
|
||||
// log messages.
|
||||
void setName(const String8& name);
|
||||
|
||||
// dump writes the current state to a string. Child classes should add
|
||||
// their state to the dump by overriding the dumpLocked method, which is
|
||||
// called by these methods after locking the mutex.
|
||||
void dump(String8& result) const;
|
||||
void dump(String8& result, const char* prefix) const;
|
||||
|
||||
// setFrameAvailableListener sets the listener object that will be notified
|
||||
// when a new frame becomes available.
|
||||
void setFrameAvailableListener(const wp<FrameAvailableListener>& listener);
|
||||
|
||||
// See IGraphicBufferConsumer::detachBuffer
|
||||
status_t detachBuffer(int slot);
|
||||
|
||||
// See IGraphicBufferConsumer::setDefaultBufferSize
|
||||
status_t setDefaultBufferSize(uint32_t width, uint32_t height);
|
||||
|
||||
// See IGraphicBufferConsumer::setDefaultBufferFormat
|
||||
status_t setDefaultBufferFormat(PixelFormat defaultFormat);
|
||||
|
||||
// See IGraphicBufferConsumer::setDefaultBufferDataSpace
|
||||
status_t setDefaultBufferDataSpace(android_dataspace defaultDataSpace);
|
||||
|
||||
private:
|
||||
ConsumerBase(const ConsumerBase&);
|
||||
void operator=(const ConsumerBase&);
|
||||
|
||||
protected:
|
||||
// ConsumerBase constructs a new ConsumerBase object to consume image
|
||||
// buffers from the given IGraphicBufferConsumer.
|
||||
// The controlledByApp flag indicates that this consumer is under the application's
|
||||
// control.
|
||||
ConsumerBase(const sp<IGraphicBufferConsumer>& consumer, bool controlledByApp = false);
|
||||
|
||||
// onLastStrongRef gets called by RefBase just before the dtor of the most
|
||||
// derived class. It is used to clean up the buffers so that ConsumerBase
|
||||
// can coordinate the clean-up by calling into virtual methods implemented
|
||||
// by the derived classes. This would not be possible from the
|
||||
// ConsuemrBase dtor because by the time that gets called the derived
|
||||
// classes have already been destructed.
|
||||
//
|
||||
// This methods should not need to be overridden by derived classes, but
|
||||
// if they are overridden the ConsumerBase implementation must be called
|
||||
// from the derived class.
|
||||
virtual void onLastStrongRef(const void* id);
|
||||
|
||||
// Implementation of the IConsumerListener interface. These
|
||||
// calls are used to notify the ConsumerBase of asynchronous events in the
|
||||
// BufferQueue. The onFrameAvailable, onFrameReplaced, and
|
||||
// onBuffersReleased methods should not need to be overridden by derived
|
||||
// classes, but if they are overridden the ConsumerBase implementation must
|
||||
// be called from the derived class. The ConsumerBase version of
|
||||
// onSidebandStreamChanged does nothing and can be overriden by derived
|
||||
// classes if they want the notification.
|
||||
virtual void onFrameAvailable(const BufferItem& item) override;
|
||||
virtual void onFrameReplaced(const BufferItem& item) override;
|
||||
virtual void onBuffersReleased() override;
|
||||
virtual void onSidebandStreamChanged() override;
|
||||
|
||||
// freeBufferLocked frees up the given buffer slot. If the slot has been
|
||||
// initialized this will release the reference to the GraphicBuffer in that
|
||||
// slot. Otherwise it has no effect.
|
||||
//
|
||||
// Derived classes should override this method to clean up any state they
|
||||
// keep per slot. If it is overridden, the derived class's implementation
|
||||
// must call ConsumerBase::freeBufferLocked.
|
||||
//
|
||||
// This method must be called with mMutex locked.
|
||||
virtual void freeBufferLocked(int slotIndex);
|
||||
|
||||
// abandonLocked puts the BufferQueue into the abandoned state, causing
|
||||
// all future operations on it to fail. This method rather than the public
|
||||
// abandon method should be overridden by child classes to add abandon-
|
||||
// time behavior.
|
||||
//
|
||||
// Derived classes should override this method to clean up any object
|
||||
// state they keep (as opposed to per-slot state). If it is overridden,
|
||||
// the derived class's implementation must call ConsumerBase::abandonLocked.
|
||||
//
|
||||
// This method must be called with mMutex locked.
|
||||
virtual void abandonLocked();
|
||||
|
||||
// dumpLocked dumps the current state of the ConsumerBase object to the
|
||||
// result string. Each line is prefixed with the string pointed to by the
|
||||
// prefix argument. The buffer argument points to a buffer that may be
|
||||
// used for intermediate formatting data, and the size of that buffer is
|
||||
// indicated by the size argument.
|
||||
//
|
||||
// Derived classes should override this method to dump their internal
|
||||
// state. If this method is overridden the derived class's implementation
|
||||
// should call ConsumerBase::dumpLocked.
|
||||
//
|
||||
// This method must be called with mMutex locked.
|
||||
virtual void dumpLocked(String8& result, const char* prefix) const;
|
||||
|
||||
// acquireBufferLocked fetches the next buffer from the BufferQueue and
|
||||
// updates the buffer slot for the buffer returned.
|
||||
//
|
||||
// Derived classes should override this method to perform any
|
||||
// initialization that must take place the first time a buffer is assigned
|
||||
// to a slot. If it is overridden the derived class's implementation must
|
||||
// call ConsumerBase::acquireBufferLocked.
|
||||
virtual status_t acquireBufferLocked(BufferItem *item, nsecs_t presentWhen,
|
||||
uint64_t maxFrameNumber = 0);
|
||||
|
||||
// releaseBufferLocked relinquishes control over a buffer, returning that
|
||||
// control to the BufferQueue.
|
||||
//
|
||||
// Derived classes should override this method to perform any cleanup that
|
||||
// must take place when a buffer is released back to the BufferQueue. If
|
||||
// it is overridden the derived class's implementation must call
|
||||
// ConsumerBase::releaseBufferLocked.e
|
||||
virtual status_t releaseBufferLocked(int slot,
|
||||
const sp<GraphicBuffer> graphicBuffer,
|
||||
EGLDisplay display, EGLSyncKHR eglFence);
|
||||
|
||||
// returns true iff the slot still has the graphicBuffer in it.
|
||||
bool stillTracking(int slot, const sp<GraphicBuffer> graphicBuffer);
|
||||
|
||||
// addReleaseFence* adds the sync points associated with a fence to the set
|
||||
// of sync points that must be reached before the buffer in the given slot
|
||||
// may be used after the slot has been released. This should be called by
|
||||
// derived classes each time some asynchronous work is kicked off that
|
||||
// references the buffer.
|
||||
status_t addReleaseFence(int slot,
|
||||
const sp<GraphicBuffer> graphicBuffer, const sp<Fence>& fence);
|
||||
status_t addReleaseFenceLocked(int slot,
|
||||
const sp<GraphicBuffer> graphicBuffer, const sp<Fence>& fence);
|
||||
|
||||
// Slot contains the information and object references that
|
||||
// ConsumerBase maintains about a BufferQueue buffer slot.
|
||||
struct Slot {
|
||||
// mGraphicBuffer is the Gralloc buffer store in the slot or NULL if
|
||||
// no Gralloc buffer is in the slot.
|
||||
sp<GraphicBuffer> mGraphicBuffer;
|
||||
|
||||
// mFence is a fence which will signal when the buffer associated with
|
||||
// this buffer slot is no longer being used by the consumer and can be
|
||||
// overwritten. The buffer can be dequeued before the fence signals;
|
||||
// the producer is responsible for delaying writes until it signals.
|
||||
sp<Fence> mFence;
|
||||
|
||||
// the frame number of the last acquired frame for this slot
|
||||
uint64_t mFrameNumber;
|
||||
};
|
||||
|
||||
// mSlots stores the buffers that have been allocated by the BufferQueue
|
||||
// for each buffer slot. It is initialized to null pointers, and gets
|
||||
// filled in with the result of BufferQueue::acquire when the
|
||||
// client dequeues a buffer from a
|
||||
// slot that has not yet been used. The buffer allocated to a slot will also
|
||||
// be replaced if the requested buffer usage or geometry differs from that
|
||||
// of the buffer allocated to a slot.
|
||||
Slot mSlots[BufferQueue::NUM_BUFFER_SLOTS];
|
||||
|
||||
// mAbandoned indicates that the BufferQueue will no longer be used to
|
||||
// consume images buffers pushed to it using the IGraphicBufferProducer
|
||||
// interface. It is initialized to false, and set to true in the abandon
|
||||
// method. A BufferQueue that has been abandoned will return the NO_INIT
|
||||
// error from all IConsumerBase methods capable of returning an error.
|
||||
bool mAbandoned;
|
||||
|
||||
// mName is a string used to identify the ConsumerBase in log messages.
|
||||
// It can be set by the setName method.
|
||||
String8 mName;
|
||||
|
||||
// mFrameAvailableListener is the listener object that will be called when a
|
||||
// new frame becomes available. If it is not NULL it will be called from
|
||||
// queueBuffer.
|
||||
wp<FrameAvailableListener> mFrameAvailableListener;
|
||||
|
||||
// The ConsumerBase has-a BufferQueue and is responsible for creating this object
|
||||
// if none is supplied
|
||||
sp<IGraphicBufferConsumer> mConsumer;
|
||||
|
||||
// mMutex is the mutex used to prevent concurrent access to the member
|
||||
// variables of ConsumerBase objects. It must be locked whenever the
|
||||
// member variables are accessed or when any of the *Locked methods are
|
||||
// called.
|
||||
//
|
||||
// This mutex is intended to be locked by derived classes.
|
||||
mutable Mutex mMutex;
|
||||
};
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
}; // namespace android
|
||||
|
||||
#endif // ANDROID_GUI_CONSUMERBASE_H
|
||||
131
third_party/android_frameworks_native/include/gui/CpuConsumer.h
vendored
Normal file
131
third_party/android_frameworks_native/include/gui/CpuConsumer.h
vendored
Normal file
@@ -0,0 +1,131 @@
|
||||
/*
|
||||
* Copyright (C) 2012 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#ifndef ANDROID_GUI_CPUCONSUMER_H
|
||||
#define ANDROID_GUI_CPUCONSUMER_H
|
||||
|
||||
#include <gui/ConsumerBase.h>
|
||||
|
||||
#include <ui/GraphicBuffer.h>
|
||||
|
||||
#include <utils/String8.h>
|
||||
#include <utils/Vector.h>
|
||||
#include <utils/threads.h>
|
||||
|
||||
|
||||
namespace android {
|
||||
|
||||
class BufferQueue;
|
||||
|
||||
/**
|
||||
* CpuConsumer is a BufferQueue consumer endpoint that allows direct CPU
|
||||
* access to the underlying gralloc buffers provided by BufferQueue. Multiple
|
||||
* buffers may be acquired by it at once, to be used concurrently by the
|
||||
* CpuConsumer owner. Sets gralloc usage flags to be software-read-only.
|
||||
* This queue is synchronous by default.
|
||||
*/
|
||||
|
||||
class CpuConsumer : public ConsumerBase
|
||||
{
|
||||
public:
|
||||
typedef ConsumerBase::FrameAvailableListener FrameAvailableListener;
|
||||
|
||||
struct LockedBuffer {
|
||||
uint8_t *data;
|
||||
uint32_t width;
|
||||
uint32_t height;
|
||||
PixelFormat format;
|
||||
uint32_t stride;
|
||||
Rect crop;
|
||||
uint32_t transform;
|
||||
uint32_t scalingMode;
|
||||
int64_t timestamp;
|
||||
android_dataspace dataSpace;
|
||||
uint64_t frameNumber;
|
||||
// this is the same as format, except for formats that are compatible with
|
||||
// a flexible format (e.g. HAL_PIXEL_FORMAT_YCbCr_420_888). In the latter
|
||||
// case this contains that flexible format
|
||||
PixelFormat flexFormat;
|
||||
// Values below are only valid when using HAL_PIXEL_FORMAT_YCbCr_420_888
|
||||
// or compatible format, in which case LockedBuffer::data
|
||||
// contains the Y channel, and stride is the Y channel stride. For other
|
||||
// formats, these will all be 0.
|
||||
uint8_t *dataCb;
|
||||
uint8_t *dataCr;
|
||||
uint32_t chromaStride;
|
||||
uint32_t chromaStep;
|
||||
};
|
||||
|
||||
// Create a new CPU consumer. The maxLockedBuffers parameter specifies
|
||||
// how many buffers can be locked for user access at the same time.
|
||||
CpuConsumer(const sp<IGraphicBufferConsumer>& bq,
|
||||
size_t maxLockedBuffers, bool controlledByApp = false);
|
||||
|
||||
virtual ~CpuConsumer();
|
||||
|
||||
// set the name of the CpuConsumer that will be used to identify it in
|
||||
// log messages.
|
||||
void setName(const String8& name);
|
||||
|
||||
// Gets the next graphics buffer from the producer and locks it for CPU use,
|
||||
// filling out the passed-in locked buffer structure with the native pointer
|
||||
// and metadata. Returns BAD_VALUE if no new buffer is available, and
|
||||
// NOT_ENOUGH_DATA if the maximum number of buffers is already locked.
|
||||
//
|
||||
// Only a fixed number of buffers can be locked at a time, determined by the
|
||||
// construction-time maxLockedBuffers parameter. If INVALID_OPERATION is
|
||||
// returned by lockNextBuffer, then old buffers must be returned to the queue
|
||||
// by calling unlockBuffer before more buffers can be acquired.
|
||||
status_t lockNextBuffer(LockedBuffer *nativeBuffer);
|
||||
|
||||
// Returns a locked buffer to the queue, allowing it to be reused. Since
|
||||
// only a fixed number of buffers may be locked at a time, old buffers must
|
||||
// be released by calling unlockBuffer to ensure new buffers can be acquired by
|
||||
// lockNextBuffer.
|
||||
status_t unlockBuffer(const LockedBuffer &nativeBuffer);
|
||||
|
||||
private:
|
||||
// Maximum number of buffers that can be locked at a time
|
||||
size_t mMaxLockedBuffers;
|
||||
|
||||
status_t releaseAcquiredBufferLocked(size_t lockedIdx);
|
||||
|
||||
virtual void freeBufferLocked(int slotIndex);
|
||||
|
||||
// Tracking for buffers acquired by the user
|
||||
struct AcquiredBuffer {
|
||||
// Need to track the original mSlot index and the buffer itself because
|
||||
// the mSlot entry may be freed/reused before the acquired buffer is
|
||||
// released.
|
||||
int mSlot;
|
||||
sp<GraphicBuffer> mGraphicBuffer;
|
||||
void *mBufferPointer;
|
||||
|
||||
AcquiredBuffer() :
|
||||
mSlot(BufferQueue::INVALID_BUFFER_SLOT),
|
||||
mBufferPointer(NULL) {
|
||||
}
|
||||
};
|
||||
Vector<AcquiredBuffer> mAcquiredBuffers;
|
||||
|
||||
// Count of currently locked buffers
|
||||
size_t mCurrentLockedBuffers;
|
||||
|
||||
};
|
||||
|
||||
} // namespace android
|
||||
|
||||
#endif // ANDROID_GUI_CPUCONSUMER_H
|
||||
137
third_party/android_frameworks_native/include/gui/DisplayEventReceiver.h
vendored
Normal file
137
third_party/android_frameworks_native/include/gui/DisplayEventReceiver.h
vendored
Normal file
@@ -0,0 +1,137 @@
|
||||
/*
|
||||
* Copyright (C) 2011 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#ifndef ANDROID_GUI_DISPLAY_EVENT_H
|
||||
#define ANDROID_GUI_DISPLAY_EVENT_H
|
||||
|
||||
#include <stdint.h>
|
||||
#include <sys/types.h>
|
||||
|
||||
#include <utils/Errors.h>
|
||||
#include <utils/RefBase.h>
|
||||
#include <utils/Timers.h>
|
||||
|
||||
#include <binder/IInterface.h>
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
namespace android {
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
class BitTube;
|
||||
class IDisplayEventConnection;
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
class DisplayEventReceiver {
|
||||
public:
|
||||
enum {
|
||||
DISPLAY_EVENT_VSYNC = 'vsyn',
|
||||
DISPLAY_EVENT_HOTPLUG = 'plug'
|
||||
};
|
||||
|
||||
struct Event {
|
||||
|
||||
struct Header {
|
||||
uint32_t type;
|
||||
uint32_t id;
|
||||
nsecs_t timestamp __attribute__((aligned(8)));
|
||||
};
|
||||
|
||||
struct VSync {
|
||||
uint32_t count;
|
||||
};
|
||||
|
||||
struct Hotplug {
|
||||
bool connected;
|
||||
};
|
||||
|
||||
Header header;
|
||||
union {
|
||||
VSync vsync;
|
||||
Hotplug hotplug;
|
||||
};
|
||||
};
|
||||
|
||||
public:
|
||||
/*
|
||||
* DisplayEventReceiver creates and registers an event connection with
|
||||
* SurfaceFlinger. VSync events are disabled by default. Call setVSyncRate
|
||||
* or requestNextVsync to receive them.
|
||||
* Other events start being delivered immediately.
|
||||
*/
|
||||
DisplayEventReceiver();
|
||||
|
||||
/*
|
||||
* ~DisplayEventReceiver severs the connection with SurfaceFlinger, new events
|
||||
* stop being delivered immediately. Note that the queue could have
|
||||
* some events pending. These will be delivered.
|
||||
*/
|
||||
~DisplayEventReceiver();
|
||||
|
||||
/*
|
||||
* initCheck returns the state of DisplayEventReceiver after construction.
|
||||
*/
|
||||
status_t initCheck() const;
|
||||
|
||||
/*
|
||||
* getFd returns the file descriptor to use to receive events.
|
||||
* OWNERSHIP IS RETAINED by DisplayEventReceiver. DO NOT CLOSE this
|
||||
* file-descriptor.
|
||||
*/
|
||||
int getFd() const;
|
||||
|
||||
/*
|
||||
* getEvents reads events from the queue and returns how many events were
|
||||
* read. Returns 0 if there are no more events or a negative error code.
|
||||
* If NOT_ENOUGH_DATA is returned, the object has become invalid forever, it
|
||||
* should be destroyed and getEvents() shouldn't be called again.
|
||||
*/
|
||||
ssize_t getEvents(Event* events, size_t count);
|
||||
static ssize_t getEvents(const sp<BitTube>& dataChannel,
|
||||
Event* events, size_t count);
|
||||
|
||||
/*
|
||||
* sendEvents write events to the queue and returns how many events were
|
||||
* written.
|
||||
*/
|
||||
static ssize_t sendEvents(const sp<BitTube>& dataChannel,
|
||||
Event const* events, size_t count);
|
||||
|
||||
/*
|
||||
* setVsyncRate() sets the Event::VSync delivery rate. A value of
|
||||
* 1 returns every Event::VSync. A value of 2 returns every other event,
|
||||
* etc... a value of 0 returns no event unless requestNextVsync() has
|
||||
* been called.
|
||||
*/
|
||||
status_t setVsyncRate(uint32_t count);
|
||||
|
||||
/*
|
||||
* requestNextVsync() schedules the next Event::VSync. It has no effect
|
||||
* if the vsync rate is > 0.
|
||||
*/
|
||||
status_t requestNextVsync();
|
||||
|
||||
private:
|
||||
sp<IDisplayEventConnection> mEventConnection;
|
||||
sp<BitTube> mDataChannel;
|
||||
};
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
}; // namespace android
|
||||
|
||||
#endif // ANDROID_GUI_DISPLAY_EVENT_H
|
||||
488
third_party/android_frameworks_native/include/gui/GLConsumer.h
vendored
Normal file
488
third_party/android_frameworks_native/include/gui/GLConsumer.h
vendored
Normal file
@@ -0,0 +1,488 @@
|
||||
/*
|
||||
* Copyright (C) 2010 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#ifndef ANDROID_GUI_CONSUMER_H
|
||||
#define ANDROID_GUI_CONSUMER_H
|
||||
|
||||
#include <EGL/egl.h>
|
||||
#include <EGL/eglext.h>
|
||||
|
||||
#include <gui/IGraphicBufferProducer.h>
|
||||
#include <gui/BufferQueue.h>
|
||||
#include <gui/ConsumerBase.h>
|
||||
|
||||
#include <ui/GraphicBuffer.h>
|
||||
|
||||
#include <utils/String8.h>
|
||||
#include <utils/Vector.h>
|
||||
#include <utils/threads.h>
|
||||
|
||||
namespace android {
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
|
||||
class String8;
|
||||
|
||||
/*
|
||||
* GLConsumer consumes buffers of graphics data from a BufferQueue,
|
||||
* and makes them available to OpenGL as a texture.
|
||||
*
|
||||
* A typical usage pattern is to set up the GLConsumer with the
|
||||
* desired options, and call updateTexImage() when a new frame is desired.
|
||||
* If a new frame is available, the texture will be updated. If not,
|
||||
* the previous contents are retained.
|
||||
*
|
||||
* By default, the texture is attached to the GL_TEXTURE_EXTERNAL_OES
|
||||
* texture target, in the EGL context of the first thread that calls
|
||||
* updateTexImage().
|
||||
*
|
||||
* This class was previously called SurfaceTexture.
|
||||
*/
|
||||
class GLConsumer : public ConsumerBase {
|
||||
public:
|
||||
enum { TEXTURE_EXTERNAL = 0x8D65 }; // GL_TEXTURE_EXTERNAL_OES
|
||||
typedef ConsumerBase::FrameAvailableListener FrameAvailableListener;
|
||||
|
||||
// GLConsumer constructs a new GLConsumer object. If the constructor with
|
||||
// the tex parameter is used, tex indicates the name of the OpenGL ES
|
||||
// texture to which images are to be streamed. texTarget specifies the
|
||||
// OpenGL ES texture target to which the texture will be bound in
|
||||
// updateTexImage. useFenceSync specifies whether fences should be used to
|
||||
// synchronize access to buffers if that behavior is enabled at
|
||||
// compile-time.
|
||||
//
|
||||
// A GLConsumer may be detached from one OpenGL ES context and then
|
||||
// attached to a different context using the detachFromContext and
|
||||
// attachToContext methods, respectively. The intention of these methods is
|
||||
// purely to allow a GLConsumer to be transferred from one consumer
|
||||
// context to another. If such a transfer is not needed there is no
|
||||
// requirement that either of these methods be called.
|
||||
//
|
||||
// If the constructor with the tex parameter is used, the GLConsumer is
|
||||
// created in a state where it is considered attached to an OpenGL ES
|
||||
// context for the purposes of the attachToContext and detachFromContext
|
||||
// methods. However, despite being considered "attached" to a context, the
|
||||
// specific OpenGL ES context doesn't get latched until the first call to
|
||||
// updateTexImage. After that point, all calls to updateTexImage must be
|
||||
// made with the same OpenGL ES context current.
|
||||
//
|
||||
// If the constructor without the tex parameter is used, the GLConsumer is
|
||||
// created in a detached state, and attachToContext must be called before
|
||||
// calls to updateTexImage.
|
||||
GLConsumer(const sp<IGraphicBufferConsumer>& bq,
|
||||
uint32_t tex, uint32_t texureTarget, bool useFenceSync,
|
||||
bool isControlledByApp);
|
||||
|
||||
GLConsumer(const sp<IGraphicBufferConsumer>& bq, uint32_t texureTarget,
|
||||
bool useFenceSync, bool isControlledByApp);
|
||||
|
||||
// updateTexImage acquires the most recently queued buffer, and sets the
|
||||
// image contents of the target texture to it.
|
||||
//
|
||||
// This call may only be made while the OpenGL ES context to which the
|
||||
// target texture belongs is bound to the calling thread.
|
||||
//
|
||||
// This calls doGLFenceWait to ensure proper synchronization.
|
||||
status_t updateTexImage();
|
||||
|
||||
// releaseTexImage releases the texture acquired in updateTexImage().
|
||||
// This is intended to be used in single buffer mode.
|
||||
//
|
||||
// This call may only be made while the OpenGL ES context to which the
|
||||
// target texture belongs is bound to the calling thread.
|
||||
status_t releaseTexImage();
|
||||
|
||||
// setReleaseFence stores a fence that will signal when the current buffer
|
||||
// is no longer being read. This fence will be returned to the producer
|
||||
// when the current buffer is released by updateTexImage(). Multiple
|
||||
// fences can be set for a given buffer; they will be merged into a single
|
||||
// union fence.
|
||||
void setReleaseFence(const sp<Fence>& fence);
|
||||
|
||||
// setDefaultMaxBufferCount sets the default limit on the maximum number
|
||||
// of buffers that will be allocated at one time. The image producer may
|
||||
// override the limit.
|
||||
status_t setDefaultMaxBufferCount(int bufferCount);
|
||||
|
||||
// getTransformMatrix retrieves the 4x4 texture coordinate transform matrix
|
||||
// associated with the texture image set by the most recent call to
|
||||
// updateTexImage.
|
||||
//
|
||||
// This transform matrix maps 2D homogeneous texture coordinates of the form
|
||||
// (s, t, 0, 1) with s and t in the inclusive range [0, 1] to the texture
|
||||
// coordinate that should be used to sample that location from the texture.
|
||||
// Sampling the texture outside of the range of this transform is undefined.
|
||||
//
|
||||
// This transform is necessary to compensate for transforms that the stream
|
||||
// content producer may implicitly apply to the content. By forcing users of
|
||||
// a GLConsumer to apply this transform we avoid performing an extra
|
||||
// copy of the data that would be needed to hide the transform from the
|
||||
// user.
|
||||
//
|
||||
// The matrix is stored in column-major order so that it may be passed
|
||||
// directly to OpenGL ES via the glLoadMatrixf or glUniformMatrix4fv
|
||||
// functions.
|
||||
void getTransformMatrix(float mtx[16]);
|
||||
|
||||
// getTimestamp retrieves the timestamp associated with the texture image
|
||||
// set by the most recent call to updateTexImage.
|
||||
//
|
||||
// The timestamp is in nanoseconds, and is monotonically increasing. Its
|
||||
// other semantics (zero point, etc) are source-dependent and should be
|
||||
// documented by the source.
|
||||
int64_t getTimestamp();
|
||||
|
||||
// getFrameNumber retrieves the frame number associated with the texture
|
||||
// image set by the most recent call to updateTexImage.
|
||||
//
|
||||
// The frame number is an incrementing counter set to 0 at the creation of
|
||||
// the BufferQueue associated with this consumer.
|
||||
uint64_t getFrameNumber();
|
||||
|
||||
// setDefaultBufferSize is used to set the size of buffers returned by
|
||||
// requestBuffers when a with and height of zero is requested.
|
||||
// A call to setDefaultBufferSize() may trigger requestBuffers() to
|
||||
// be called from the client.
|
||||
// The width and height parameters must be no greater than the minimum of
|
||||
// GL_MAX_VIEWPORT_DIMS and GL_MAX_TEXTURE_SIZE (see: glGetIntegerv).
|
||||
// An error due to invalid dimensions might not be reported until
|
||||
// updateTexImage() is called.
|
||||
status_t setDefaultBufferSize(uint32_t width, uint32_t height);
|
||||
|
||||
// setFilteringEnabled sets whether the transform matrix should be computed
|
||||
// for use with bilinear filtering.
|
||||
void setFilteringEnabled(bool enabled);
|
||||
|
||||
// getCurrentBuffer returns the buffer associated with the current image.
|
||||
sp<GraphicBuffer> getCurrentBuffer() const;
|
||||
|
||||
// getCurrentTextureTarget returns the texture target of the current
|
||||
// texture as returned by updateTexImage().
|
||||
uint32_t getCurrentTextureTarget() const;
|
||||
|
||||
// getCurrentCrop returns the cropping rectangle of the current buffer.
|
||||
Rect getCurrentCrop() const;
|
||||
|
||||
// getCurrentTransform returns the transform of the current buffer.
|
||||
uint32_t getCurrentTransform() const;
|
||||
|
||||
// getCurrentScalingMode returns the scaling mode of the current buffer.
|
||||
uint32_t getCurrentScalingMode() const;
|
||||
|
||||
// getCurrentFence returns the fence indicating when the current buffer is
|
||||
// ready to be read from.
|
||||
sp<Fence> getCurrentFence() const;
|
||||
|
||||
// doGLFenceWait inserts a wait command into the OpenGL ES command stream
|
||||
// to ensure that it is safe for future OpenGL ES commands to access the
|
||||
// current texture buffer.
|
||||
status_t doGLFenceWait() const;
|
||||
|
||||
// set the name of the GLConsumer that will be used to identify it in
|
||||
// log messages.
|
||||
void setName(const String8& name);
|
||||
|
||||
// These functions call the corresponding BufferQueue implementation
|
||||
// so the refactoring can proceed smoothly
|
||||
status_t setDefaultBufferFormat(PixelFormat defaultFormat);
|
||||
status_t setDefaultBufferDataSpace(android_dataspace defaultDataSpace);
|
||||
status_t setConsumerUsageBits(uint32_t usage);
|
||||
status_t setTransformHint(uint32_t hint);
|
||||
|
||||
// detachFromContext detaches the GLConsumer from the calling thread's
|
||||
// current OpenGL ES context. This context must be the same as the context
|
||||
// that was current for previous calls to updateTexImage.
|
||||
//
|
||||
// Detaching a GLConsumer from an OpenGL ES context will result in the
|
||||
// deletion of the OpenGL ES texture object into which the images were being
|
||||
// streamed. After a GLConsumer has been detached from the OpenGL ES
|
||||
// context calls to updateTexImage will fail returning INVALID_OPERATION
|
||||
// until the GLConsumer is attached to a new OpenGL ES context using the
|
||||
// attachToContext method.
|
||||
status_t detachFromContext();
|
||||
|
||||
// attachToContext attaches a GLConsumer that is currently in the
|
||||
// 'detached' state to the current OpenGL ES context. A GLConsumer is
|
||||
// in the 'detached' state iff detachFromContext has successfully been
|
||||
// called and no calls to attachToContext have succeeded since the last
|
||||
// detachFromContext call. Calls to attachToContext made on a
|
||||
// GLConsumer that is not in the 'detached' state will result in an
|
||||
// INVALID_OPERATION error.
|
||||
//
|
||||
// The tex argument specifies the OpenGL ES texture object name in the
|
||||
// new context into which the image contents will be streamed. A successful
|
||||
// call to attachToContext will result in this texture object being bound to
|
||||
// the texture target and populated with the image contents that were
|
||||
// current at the time of the last call to detachFromContext.
|
||||
status_t attachToContext(uint32_t tex);
|
||||
|
||||
protected:
|
||||
|
||||
// abandonLocked overrides the ConsumerBase method to clear
|
||||
// mCurrentTextureImage in addition to the ConsumerBase behavior.
|
||||
virtual void abandonLocked();
|
||||
|
||||
// dumpLocked overrides the ConsumerBase method to dump GLConsumer-
|
||||
// specific info in addition to the ConsumerBase behavior.
|
||||
virtual void dumpLocked(String8& result, const char* prefix) const;
|
||||
|
||||
// acquireBufferLocked overrides the ConsumerBase method to update the
|
||||
// mEglSlots array in addition to the ConsumerBase behavior.
|
||||
virtual status_t acquireBufferLocked(BufferItem *item, nsecs_t presentWhen,
|
||||
uint64_t maxFrameNumber = 0) override;
|
||||
|
||||
// releaseBufferLocked overrides the ConsumerBase method to update the
|
||||
// mEglSlots array in addition to the ConsumerBase.
|
||||
virtual status_t releaseBufferLocked(int slot,
|
||||
const sp<GraphicBuffer> graphicBuffer,
|
||||
EGLDisplay display, EGLSyncKHR eglFence);
|
||||
|
||||
status_t releaseBufferLocked(int slot,
|
||||
const sp<GraphicBuffer> graphicBuffer, EGLSyncKHR eglFence) {
|
||||
return releaseBufferLocked(slot, graphicBuffer, mEglDisplay, eglFence);
|
||||
}
|
||||
|
||||
static bool isExternalFormat(PixelFormat format);
|
||||
|
||||
// This releases the buffer in the slot referenced by mCurrentTexture,
|
||||
// then updates state to refer to the BufferItem, which must be a
|
||||
// newly-acquired buffer.
|
||||
status_t updateAndReleaseLocked(const BufferItem& item);
|
||||
|
||||
// Binds mTexName and the current buffer to mTexTarget. Uses
|
||||
// mCurrentTexture if it's set, mCurrentTextureImage if not. If the
|
||||
// bind succeeds, this calls doGLFenceWait.
|
||||
status_t bindTextureImageLocked();
|
||||
|
||||
// Gets the current EGLDisplay and EGLContext values, and compares them
|
||||
// to mEglDisplay and mEglContext. If the fields have been previously
|
||||
// set, the values must match; if not, the fields are set to the current
|
||||
// values.
|
||||
// The contextCheck argument is used to ensure that a GL context is
|
||||
// properly set; when set to false, the check is not performed.
|
||||
status_t checkAndUpdateEglStateLocked(bool contextCheck = false);
|
||||
|
||||
private:
|
||||
// EglImage is a utility class for tracking and creating EGLImageKHRs. There
|
||||
// is primarily just one image per slot, but there is also special cases:
|
||||
// - For releaseTexImage, we use a debug image (mReleasedTexImage)
|
||||
// - After freeBuffer, we must still keep the current image/buffer
|
||||
// Reference counting EGLImages lets us handle all these cases easily while
|
||||
// also only creating new EGLImages from buffers when required.
|
||||
class EglImage : public LightRefBase<EglImage> {
|
||||
public:
|
||||
EglImage(sp<GraphicBuffer> graphicBuffer);
|
||||
|
||||
// createIfNeeded creates an EGLImage if required (we haven't created
|
||||
// one yet, or the EGLDisplay or crop-rect has changed).
|
||||
status_t createIfNeeded(EGLDisplay display,
|
||||
const Rect& cropRect,
|
||||
bool forceCreate = false);
|
||||
|
||||
// This calls glEGLImageTargetTexture2DOES to bind the image to the
|
||||
// texture in the specified texture target.
|
||||
void bindToTextureTarget(uint32_t texTarget);
|
||||
|
||||
const sp<GraphicBuffer>& graphicBuffer() { return mGraphicBuffer; }
|
||||
const native_handle* graphicBufferHandle() {
|
||||
return mGraphicBuffer == NULL ? NULL : mGraphicBuffer->handle;
|
||||
}
|
||||
|
||||
private:
|
||||
// Only allow instantiation using ref counting.
|
||||
friend class LightRefBase<EglImage>;
|
||||
virtual ~EglImage();
|
||||
|
||||
// createImage creates a new EGLImage from a GraphicBuffer.
|
||||
EGLImageKHR createImage(EGLDisplay dpy,
|
||||
const sp<GraphicBuffer>& graphicBuffer, const Rect& crop);
|
||||
|
||||
// Disallow copying
|
||||
EglImage(const EglImage& rhs);
|
||||
void operator = (const EglImage& rhs);
|
||||
|
||||
// mGraphicBuffer is the buffer that was used to create this image.
|
||||
sp<GraphicBuffer> mGraphicBuffer;
|
||||
|
||||
// mEglImage is the EGLImage created from mGraphicBuffer.
|
||||
EGLImageKHR mEglImage;
|
||||
|
||||
// mEGLDisplay is the EGLDisplay that was used to create mEglImage.
|
||||
EGLDisplay mEglDisplay;
|
||||
|
||||
// mCropRect is the crop rectangle passed to EGL when mEglImage
|
||||
// was created.
|
||||
Rect mCropRect;
|
||||
};
|
||||
|
||||
// freeBufferLocked frees up the given buffer slot. If the slot has been
|
||||
// initialized this will release the reference to the GraphicBuffer in that
|
||||
// slot and destroy the EGLImage in that slot. Otherwise it has no effect.
|
||||
//
|
||||
// This method must be called with mMutex locked.
|
||||
virtual void freeBufferLocked(int slotIndex);
|
||||
|
||||
// computeCurrentTransformMatrixLocked computes the transform matrix for the
|
||||
// current texture. It uses mCurrentTransform and the current GraphicBuffer
|
||||
// to compute this matrix and stores it in mCurrentTransformMatrix.
|
||||
// mCurrentTextureImage must not be NULL.
|
||||
void computeCurrentTransformMatrixLocked();
|
||||
|
||||
// doGLFenceWaitLocked inserts a wait command into the OpenGL ES command
|
||||
// stream to ensure that it is safe for future OpenGL ES commands to
|
||||
// access the current texture buffer.
|
||||
status_t doGLFenceWaitLocked() const;
|
||||
|
||||
// syncForReleaseLocked performs the synchronization needed to release the
|
||||
// current slot from an OpenGL ES context. If needed it will set the
|
||||
// current slot's fence to guard against a producer accessing the buffer
|
||||
// before the outstanding accesses have completed.
|
||||
status_t syncForReleaseLocked(EGLDisplay dpy);
|
||||
|
||||
// returns a graphic buffer used when the texture image has been released
|
||||
static sp<GraphicBuffer> getDebugTexImageBuffer();
|
||||
|
||||
// The default consumer usage flags that GLConsumer always sets on its
|
||||
// BufferQueue instance; these will be OR:d with any additional flags passed
|
||||
// from the GLConsumer user. In particular, GLConsumer will always
|
||||
// consume buffers as hardware textures.
|
||||
static const uint32_t DEFAULT_USAGE_FLAGS = GraphicBuffer::USAGE_HW_TEXTURE;
|
||||
|
||||
// mCurrentTextureImage is the EglImage/buffer of the current texture. It's
|
||||
// possible that this buffer is not associated with any buffer slot, so we
|
||||
// must track it separately in order to support the getCurrentBuffer method.
|
||||
sp<EglImage> mCurrentTextureImage;
|
||||
|
||||
// mCurrentCrop is the crop rectangle that applies to the current texture.
|
||||
// It gets set each time updateTexImage is called.
|
||||
Rect mCurrentCrop;
|
||||
|
||||
// mCurrentTransform is the transform identifier for the current texture. It
|
||||
// gets set each time updateTexImage is called.
|
||||
uint32_t mCurrentTransform;
|
||||
|
||||
// mCurrentScalingMode is the scaling mode for the current texture. It gets
|
||||
// set each time updateTexImage is called.
|
||||
uint32_t mCurrentScalingMode;
|
||||
|
||||
// mCurrentFence is the fence received from BufferQueue in updateTexImage.
|
||||
sp<Fence> mCurrentFence;
|
||||
|
||||
// mCurrentTransformMatrix is the transform matrix for the current texture.
|
||||
// It gets computed by computeTransformMatrix each time updateTexImage is
|
||||
// called.
|
||||
float mCurrentTransformMatrix[16];
|
||||
|
||||
// mCurrentTimestamp is the timestamp for the current texture. It
|
||||
// gets set each time updateTexImage is called.
|
||||
int64_t mCurrentTimestamp;
|
||||
|
||||
// mCurrentFrameNumber is the frame counter for the current texture.
|
||||
// It gets set each time updateTexImage is called.
|
||||
uint64_t mCurrentFrameNumber;
|
||||
|
||||
uint32_t mDefaultWidth, mDefaultHeight;
|
||||
|
||||
// mFilteringEnabled indicates whether the transform matrix is computed for
|
||||
// use with bilinear filtering. It defaults to true and is changed by
|
||||
// setFilteringEnabled().
|
||||
bool mFilteringEnabled;
|
||||
|
||||
// mTexName is the name of the OpenGL texture to which streamed images will
|
||||
// be bound when updateTexImage is called. It is set at construction time
|
||||
// and can be changed with a call to attachToContext.
|
||||
uint32_t mTexName;
|
||||
|
||||
// mUseFenceSync indicates whether creation of the EGL_KHR_fence_sync
|
||||
// extension should be used to prevent buffers from being dequeued before
|
||||
// it's safe for them to be written. It gets set at construction time and
|
||||
// never changes.
|
||||
const bool mUseFenceSync;
|
||||
|
||||
// mTexTarget is the GL texture target with which the GL texture object is
|
||||
// associated. It is set in the constructor and never changed. It is
|
||||
// almost always GL_TEXTURE_EXTERNAL_OES except for one use case in Android
|
||||
// Browser. In that case it is set to GL_TEXTURE_2D to allow
|
||||
// glCopyTexSubImage to read from the texture. This is a hack to work
|
||||
// around a GL driver limitation on the number of FBO attachments, which the
|
||||
// browser's tile cache exceeds.
|
||||
const uint32_t mTexTarget;
|
||||
|
||||
// EGLSlot contains the information and object references that
|
||||
// GLConsumer maintains about a BufferQueue buffer slot.
|
||||
struct EglSlot {
|
||||
EglSlot() : mEglFence(EGL_NO_SYNC_KHR) {}
|
||||
|
||||
// mEglImage is the EGLImage created from mGraphicBuffer.
|
||||
sp<EglImage> mEglImage;
|
||||
|
||||
// mFence is the EGL sync object that must signal before the buffer
|
||||
// associated with this buffer slot may be dequeued. It is initialized
|
||||
// to EGL_NO_SYNC_KHR when the buffer is created and (optionally, based
|
||||
// on a compile-time option) set to a new sync object in updateTexImage.
|
||||
EGLSyncKHR mEglFence;
|
||||
};
|
||||
|
||||
// mEglDisplay is the EGLDisplay with which this GLConsumer is currently
|
||||
// associated. It is intialized to EGL_NO_DISPLAY and gets set to the
|
||||
// current display when updateTexImage is called for the first time and when
|
||||
// attachToContext is called.
|
||||
EGLDisplay mEglDisplay;
|
||||
|
||||
// mEglContext is the OpenGL ES context with which this GLConsumer is
|
||||
// currently associated. It is initialized to EGL_NO_CONTEXT and gets set
|
||||
// to the current GL context when updateTexImage is called for the first
|
||||
// time and when attachToContext is called.
|
||||
EGLContext mEglContext;
|
||||
|
||||
// mEGLSlots stores the buffers that have been allocated by the BufferQueue
|
||||
// for each buffer slot. It is initialized to null pointers, and gets
|
||||
// filled in with the result of BufferQueue::acquire when the
|
||||
// client dequeues a buffer from a
|
||||
// slot that has not yet been used. The buffer allocated to a slot will also
|
||||
// be replaced if the requested buffer usage or geometry differs from that
|
||||
// of the buffer allocated to a slot.
|
||||
EglSlot mEglSlots[BufferQueue::NUM_BUFFER_SLOTS];
|
||||
|
||||
// mCurrentTexture is the buffer slot index of the buffer that is currently
|
||||
// bound to the OpenGL texture. It is initialized to INVALID_BUFFER_SLOT,
|
||||
// indicating that no buffer slot is currently bound to the texture. Note,
|
||||
// however, that a value of INVALID_BUFFER_SLOT does not necessarily mean
|
||||
// that no buffer is bound to the texture. A call to setBufferCount will
|
||||
// reset mCurrentTexture to INVALID_BUFFER_SLOT.
|
||||
int mCurrentTexture;
|
||||
|
||||
// mAttached indicates whether the ConsumerBase is currently attached to
|
||||
// an OpenGL ES context. For legacy reasons, this is initialized to true,
|
||||
// indicating that the ConsumerBase is considered to be attached to
|
||||
// whatever context is current at the time of the first updateTexImage call.
|
||||
// It is set to false by detachFromContext, and then set to true again by
|
||||
// attachToContext.
|
||||
bool mAttached;
|
||||
|
||||
// protects static initialization
|
||||
static Mutex sStaticInitLock;
|
||||
|
||||
// mReleasedTexImageBuffer is a dummy buffer used when in single buffer
|
||||
// mode and releaseTexImage() has been called
|
||||
static sp<GraphicBuffer> sReleasedTexImageBuffer;
|
||||
sp<EglImage> mReleasedTexImage;
|
||||
};
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
}; // namespace android
|
||||
|
||||
#endif // ANDROID_GUI_CONSUMER_H
|
||||
45
third_party/android_frameworks_native/include/gui/GraphicBufferAlloc.h
vendored
Normal file
45
third_party/android_frameworks_native/include/gui/GraphicBufferAlloc.h
vendored
Normal file
@@ -0,0 +1,45 @@
|
||||
/*
|
||||
* Copyright (C) 2012 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#ifndef ANDROID_SF_GRAPHIC_BUFFER_ALLOC_H
|
||||
#define ANDROID_SF_GRAPHIC_BUFFER_ALLOC_H
|
||||
|
||||
#include <stdint.h>
|
||||
#include <sys/types.h>
|
||||
|
||||
#include <gui/IGraphicBufferAlloc.h>
|
||||
#include <ui/PixelFormat.h>
|
||||
#include <utils/Errors.h>
|
||||
|
||||
namespace android {
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
class GraphicBuffer;
|
||||
|
||||
class GraphicBufferAlloc : public BnGraphicBufferAlloc {
|
||||
public:
|
||||
GraphicBufferAlloc();
|
||||
virtual ~GraphicBufferAlloc();
|
||||
virtual sp<GraphicBuffer> createGraphicBuffer(uint32_t width,
|
||||
uint32_t height, PixelFormat format, uint32_t usage,
|
||||
status_t* error);
|
||||
};
|
||||
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
}; // namespace android
|
||||
|
||||
#endif // ANDROID_SF_GRAPHIC_BUFFER_ALLOC_H
|
||||
29
third_party/android_frameworks_native/include/gui/GuiConfig.h
vendored
Normal file
29
third_party/android_frameworks_native/include/gui/GuiConfig.h
vendored
Normal file
@@ -0,0 +1,29 @@
|
||||
/*
|
||||
* Copyright (C) 2012 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#ifndef ANDROID_GUI_CONFIG_H
|
||||
#define ANDROID_GUI_CONFIG_H
|
||||
|
||||
#include <utils/String8.h>
|
||||
|
||||
namespace android {
|
||||
|
||||
// Append the libgui configuration details to configStr.
|
||||
void appendGuiConfigString(String8& configStr);
|
||||
|
||||
}; // namespace android
|
||||
|
||||
#endif /*ANDROID_GUI_CONFIG_H*/
|
||||
104
third_party/android_frameworks_native/include/gui/IConsumerListener.h
vendored
Normal file
104
third_party/android_frameworks_native/include/gui/IConsumerListener.h
vendored
Normal file
@@ -0,0 +1,104 @@
|
||||
/*
|
||||
* Copyright (C) 2013 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#ifndef ANDROID_GUI_ICONSUMERLISTENER_H
|
||||
#define ANDROID_GUI_ICONSUMERLISTENER_H
|
||||
|
||||
#include <stdint.h>
|
||||
#include <sys/types.h>
|
||||
|
||||
#include <utils/Errors.h>
|
||||
#include <utils/RefBase.h>
|
||||
|
||||
#include <binder/IInterface.h>
|
||||
|
||||
namespace android {
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
class BufferItem;
|
||||
|
||||
// ConsumerListener is the interface through which the BufferQueue notifies
|
||||
// the consumer of events that the consumer may wish to react to. Because
|
||||
// the consumer will generally have a mutex that is locked during calls from
|
||||
// the consumer to the BufferQueue, these calls from the BufferQueue to the
|
||||
// consumer *MUST* be called only when the BufferQueue mutex is NOT locked.
|
||||
|
||||
class ConsumerListener : public virtual RefBase {
|
||||
public:
|
||||
ConsumerListener() { }
|
||||
virtual ~ConsumerListener() { }
|
||||
|
||||
// onFrameAvailable is called from queueBuffer each time an additional
|
||||
// frame becomes available for consumption. This means that frames that
|
||||
// are queued while in asynchronous mode only trigger the callback if no
|
||||
// previous frames are pending. Frames queued while in synchronous mode
|
||||
// always trigger the callback. The item passed to the callback will contain
|
||||
// all of the information about the queued frame except for its
|
||||
// GraphicBuffer pointer, which will always be null.
|
||||
//
|
||||
// This is called without any lock held and can be called concurrently
|
||||
// by multiple threads.
|
||||
virtual void onFrameAvailable(const BufferItem& item) = 0; /* Asynchronous */
|
||||
|
||||
// onFrameReplaced is called from queueBuffer if the frame being queued is
|
||||
// replacing an existing slot in the queue. Any call to queueBuffer that
|
||||
// doesn't call onFrameAvailable will call this callback instead. The item
|
||||
// passed to the callback will contain all of the information about the
|
||||
// queued frame except for its GraphicBuffer pointer, which will always be
|
||||
// null.
|
||||
//
|
||||
// This is called without any lock held and can be called concurrently
|
||||
// by multiple threads.
|
||||
virtual void onFrameReplaced(const BufferItem& /* item */) {} /* Asynchronous */
|
||||
|
||||
// onBuffersReleased is called to notify the buffer consumer that the
|
||||
// BufferQueue has released its references to one or more GraphicBuffers
|
||||
// contained in its slots. The buffer consumer should then call
|
||||
// BufferQueue::getReleasedBuffers to retrieve the list of buffers
|
||||
//
|
||||
// This is called without any lock held and can be called concurrently
|
||||
// by multiple threads.
|
||||
virtual void onBuffersReleased() = 0; /* Asynchronous */
|
||||
|
||||
// onSidebandStreamChanged is called to notify the buffer consumer that the
|
||||
// BufferQueue's sideband buffer stream has changed. This is called when a
|
||||
// stream is first attached and when it is either detached or replaced by a
|
||||
// different stream.
|
||||
virtual void onSidebandStreamChanged() = 0; /* Asynchronous */
|
||||
};
|
||||
|
||||
|
||||
class IConsumerListener : public ConsumerListener, public IInterface
|
||||
{
|
||||
public:
|
||||
DECLARE_META_INTERFACE(ConsumerListener);
|
||||
};
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
class BnConsumerListener : public BnInterface<IConsumerListener>
|
||||
{
|
||||
public:
|
||||
virtual status_t onTransact( uint32_t code,
|
||||
const Parcel& data,
|
||||
Parcel* reply,
|
||||
uint32_t flags = 0);
|
||||
};
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
}; // namespace android
|
||||
|
||||
#endif // ANDROID_GUI_ICONSUMERLISTENER_H
|
||||
73
third_party/android_frameworks_native/include/gui/IDisplayEventConnection.h
vendored
Normal file
73
third_party/android_frameworks_native/include/gui/IDisplayEventConnection.h
vendored
Normal file
@@ -0,0 +1,73 @@
|
||||
/*
|
||||
* Copyright (C) 2011 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#ifndef ANDROID_GUI_IDISPLAY_EVENT_CONNECTION_H
|
||||
#define ANDROID_GUI_IDISPLAY_EVENT_CONNECTION_H
|
||||
|
||||
#include <stdint.h>
|
||||
#include <sys/types.h>
|
||||
|
||||
#include <utils/Errors.h>
|
||||
#include <utils/RefBase.h>
|
||||
|
||||
#include <binder/IInterface.h>
|
||||
|
||||
namespace android {
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
class BitTube;
|
||||
|
||||
class IDisplayEventConnection : public IInterface
|
||||
{
|
||||
public:
|
||||
|
||||
DECLARE_META_INTERFACE(DisplayEventConnection);
|
||||
|
||||
/*
|
||||
* getDataChannel() returns a BitTube where to receive the events from
|
||||
*/
|
||||
virtual sp<BitTube> getDataChannel() const = 0;
|
||||
|
||||
/*
|
||||
* setVsyncRate() sets the vsync event delivery rate. A value of
|
||||
* 1 returns every vsync events. A value of 2 returns every other events,
|
||||
* etc... a value of 0 returns no event unless requestNextVsync() has
|
||||
* been called.
|
||||
*/
|
||||
virtual void setVsyncRate(uint32_t count) = 0;
|
||||
|
||||
/*
|
||||
* requestNextVsync() schedules the next vsync event. It has no effect
|
||||
* if the vsync rate is > 0.
|
||||
*/
|
||||
virtual void requestNextVsync() = 0; // asynchronous
|
||||
};
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
class BnDisplayEventConnection : public BnInterface<IDisplayEventConnection>
|
||||
{
|
||||
public:
|
||||
virtual status_t onTransact( uint32_t code,
|
||||
const Parcel& data,
|
||||
Parcel* reply,
|
||||
uint32_t flags = 0);
|
||||
};
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
}; // namespace android
|
||||
|
||||
#endif // ANDROID_GUI_IDISPLAY_EVENT_CONNECTION_H
|
||||
58
third_party/android_frameworks_native/include/gui/IGraphicBufferAlloc.h
vendored
Normal file
58
third_party/android_frameworks_native/include/gui/IGraphicBufferAlloc.h
vendored
Normal file
@@ -0,0 +1,58 @@
|
||||
/*
|
||||
* Copyright (C) 2011 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#ifndef ANDROID_GUI_IGRAPHIC_BUFFER_ALLOC_H
|
||||
#define ANDROID_GUI_IGRAPHIC_BUFFER_ALLOC_H
|
||||
|
||||
#include <stdint.h>
|
||||
#include <sys/types.h>
|
||||
|
||||
#include <binder/IInterface.h>
|
||||
#include <ui/PixelFormat.h>
|
||||
#include <utils/RefBase.h>
|
||||
|
||||
namespace android {
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
class GraphicBuffer;
|
||||
|
||||
class IGraphicBufferAlloc : public IInterface
|
||||
{
|
||||
public:
|
||||
DECLARE_META_INTERFACE(GraphicBufferAlloc);
|
||||
|
||||
/* Create a new GraphicBuffer for the client to use.
|
||||
*/
|
||||
virtual sp<GraphicBuffer> createGraphicBuffer(uint32_t w, uint32_t h,
|
||||
PixelFormat format, uint32_t usage, status_t* error) = 0;
|
||||
};
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
class BnGraphicBufferAlloc : public BnInterface<IGraphicBufferAlloc>
|
||||
{
|
||||
public:
|
||||
virtual status_t onTransact(uint32_t code,
|
||||
const Parcel& data,
|
||||
Parcel* reply,
|
||||
uint32_t flags = 0);
|
||||
};
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
}; // namespace android
|
||||
|
||||
#endif // ANDROID_GUI_IGRAPHIC_BUFFER_ALLOC_H
|
||||
280
third_party/android_frameworks_native/include/gui/IGraphicBufferConsumer.h
vendored
Normal file
280
third_party/android_frameworks_native/include/gui/IGraphicBufferConsumer.h
vendored
Normal file
@@ -0,0 +1,280 @@
|
||||
/*
|
||||
* Copyright (C) 2013 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#ifndef ANDROID_GUI_IGRAPHICBUFFERCONSUMER_H
|
||||
#define ANDROID_GUI_IGRAPHICBUFFERCONSUMER_H
|
||||
|
||||
#include <stdint.h>
|
||||
#include <sys/types.h>
|
||||
|
||||
#include <utils/Errors.h>
|
||||
#include <utils/RefBase.h>
|
||||
#include <utils/Timers.h>
|
||||
|
||||
#include <binder/IInterface.h>
|
||||
#include <ui/PixelFormat.h>
|
||||
#include <ui/Rect.h>
|
||||
|
||||
#include <EGL/egl.h>
|
||||
#include <EGL/eglext.h>
|
||||
|
||||
namespace android {
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
class BufferItem;
|
||||
class Fence;
|
||||
class GraphicBuffer;
|
||||
class IConsumerListener;
|
||||
class NativeHandle;
|
||||
|
||||
class IGraphicBufferConsumer : public IInterface {
|
||||
|
||||
public:
|
||||
enum {
|
||||
// Returned by releaseBuffer, after which the consumer must
|
||||
// free any references to the just-released buffer that it might have.
|
||||
STALE_BUFFER_SLOT = 1,
|
||||
// Returned by dequeueBuffer if there are no pending buffers available.
|
||||
NO_BUFFER_AVAILABLE,
|
||||
// Returned by dequeueBuffer if it's too early for the buffer to be acquired.
|
||||
PRESENT_LATER,
|
||||
};
|
||||
|
||||
// acquireBuffer attempts to acquire ownership of the next pending buffer in
|
||||
// the BufferQueue. If no buffer is pending then it returns
|
||||
// NO_BUFFER_AVAILABLE. If a buffer is successfully acquired, the
|
||||
// information about the buffer is returned in BufferItem.
|
||||
//
|
||||
// If the buffer returned had previously been
|
||||
// acquired then the BufferItem::mGraphicBuffer field of buffer is set to
|
||||
// NULL and it is assumed that the consumer still holds a reference to the
|
||||
// buffer.
|
||||
//
|
||||
// If presentWhen is non-zero, it indicates the time when the buffer will
|
||||
// be displayed on screen. If the buffer's timestamp is farther in the
|
||||
// future, the buffer won't be acquired, and PRESENT_LATER will be
|
||||
// returned. The presentation time is in nanoseconds, and the time base
|
||||
// is CLOCK_MONOTONIC.
|
||||
//
|
||||
// If maxFrameNumber is non-zero, it indicates that acquireBuffer should
|
||||
// only return a buffer with a frame number less than or equal to
|
||||
// maxFrameNumber. If no such frame is available (such as when a buffer has
|
||||
// been replaced but the consumer has not received the onFrameReplaced
|
||||
// callback), then PRESENT_LATER will be returned.
|
||||
//
|
||||
// Return of NO_ERROR means the operation completed as normal.
|
||||
//
|
||||
// Return of a positive value means the operation could not be completed
|
||||
// at this time, but the user should try again later:
|
||||
// * NO_BUFFER_AVAILABLE - no buffer is pending (nothing queued by producer)
|
||||
// * PRESENT_LATER - the buffer's timestamp is farther in the future
|
||||
//
|
||||
// Return of a negative value means an error has occurred:
|
||||
// * INVALID_OPERATION - too many buffers have been acquired
|
||||
virtual status_t acquireBuffer(BufferItem* buffer, nsecs_t presentWhen,
|
||||
uint64_t maxFrameNumber = 0) = 0;
|
||||
|
||||
// detachBuffer attempts to remove all ownership of the buffer in the given
|
||||
// slot from the buffer queue. If this call succeeds, the slot will be
|
||||
// freed, and there will be no way to obtain the buffer from this interface.
|
||||
// The freed slot will remain unallocated until either it is selected to
|
||||
// hold a freshly allocated buffer in dequeueBuffer or a buffer is attached
|
||||
// to the slot. The buffer must have already been acquired.
|
||||
//
|
||||
// Return of a value other than NO_ERROR means an error has occurred:
|
||||
// * BAD_VALUE - the given slot number is invalid, either because it is
|
||||
// out of the range [0, NUM_BUFFER_SLOTS) or because the slot
|
||||
// it refers to is not currently acquired.
|
||||
virtual status_t detachBuffer(int slot) = 0;
|
||||
|
||||
// attachBuffer attempts to transfer ownership of a buffer to the buffer
|
||||
// queue. If this call succeeds, it will be as if this buffer was acquired
|
||||
// from the returned slot number. As such, this call will fail if attaching
|
||||
// this buffer would cause too many buffers to be simultaneously acquired.
|
||||
//
|
||||
// If the buffer is successfully attached, its frameNumber is initialized
|
||||
// to 0. This must be passed into the releaseBuffer call or else the buffer
|
||||
// will be deallocated as stale.
|
||||
//
|
||||
// Return of a value other than NO_ERROR means an error has occurred:
|
||||
// * BAD_VALUE - outSlot or buffer were NULL, or the generation number of
|
||||
// the buffer did not match the buffer queue.
|
||||
// * INVALID_OPERATION - cannot attach the buffer because it would cause too
|
||||
// many buffers to be acquired.
|
||||
// * NO_MEMORY - no free slots available
|
||||
virtual status_t attachBuffer(int *outSlot,
|
||||
const sp<GraphicBuffer>& buffer) = 0;
|
||||
|
||||
// releaseBuffer releases a buffer slot from the consumer back to the
|
||||
// BufferQueue. This may be done while the buffer's contents are still
|
||||
// being accessed. The fence will signal when the buffer is no longer
|
||||
// in use. frameNumber is used to indentify the exact buffer returned.
|
||||
//
|
||||
// If releaseBuffer returns STALE_BUFFER_SLOT, then the consumer must free
|
||||
// any references to the just-released buffer that it might have, as if it
|
||||
// had received a onBuffersReleased() call with a mask set for the released
|
||||
// buffer.
|
||||
//
|
||||
// Note that the dependencies on EGL will be removed once we switch to using
|
||||
// the Android HW Sync HAL.
|
||||
//
|
||||
// Return of NO_ERROR means the operation completed as normal.
|
||||
//
|
||||
// Return of a positive value means the operation could not be completed
|
||||
// at this time, but the user should try again later:
|
||||
// * STALE_BUFFER_SLOT - see above (second paragraph)
|
||||
//
|
||||
// Return of a negative value means an error has occurred:
|
||||
// * BAD_VALUE - one of the following could've happened:
|
||||
// * the buffer slot was invalid
|
||||
// * the fence was NULL
|
||||
// * the buffer slot specified is not in the acquired state
|
||||
virtual status_t releaseBuffer(int buf, uint64_t frameNumber,
|
||||
EGLDisplay display, EGLSyncKHR fence,
|
||||
const sp<Fence>& releaseFence) = 0;
|
||||
|
||||
// consumerConnect connects a consumer to the BufferQueue. Only one
|
||||
// consumer may be connected, and when that consumer disconnects the
|
||||
// BufferQueue is placed into the "abandoned" state, causing most
|
||||
// interactions with the BufferQueue by the producer to fail.
|
||||
// controlledByApp indicates whether the consumer is controlled by
|
||||
// the application.
|
||||
//
|
||||
// consumer may not be NULL.
|
||||
//
|
||||
// Return of a value other than NO_ERROR means an error has occurred:
|
||||
// * NO_INIT - the buffer queue has been abandoned
|
||||
// * BAD_VALUE - a NULL consumer was provided
|
||||
virtual status_t consumerConnect(const sp<IConsumerListener>& consumer, bool controlledByApp) = 0;
|
||||
|
||||
// consumerDisconnect disconnects a consumer from the BufferQueue. All
|
||||
// buffers will be freed and the BufferQueue is placed in the "abandoned"
|
||||
// state, causing most interactions with the BufferQueue by the producer to
|
||||
// fail.
|
||||
//
|
||||
// Return of a value other than NO_ERROR means an error has occurred:
|
||||
// * BAD_VALUE - no consumer is currently connected
|
||||
virtual status_t consumerDisconnect() = 0;
|
||||
|
||||
// getReleasedBuffers sets the value pointed to by slotMask to a bit set.
|
||||
// Each bit index with a 1 corresponds to a released buffer slot with that
|
||||
// index value. In particular, a released buffer is one that has
|
||||
// been released by the BufferQueue but have not yet been released by the consumer.
|
||||
//
|
||||
// This should be called from the onBuffersReleased() callback.
|
||||
//
|
||||
// Return of a value other than NO_ERROR means an error has occurred:
|
||||
// * NO_INIT - the buffer queue has been abandoned.
|
||||
virtual status_t getReleasedBuffers(uint64_t* slotMask) = 0;
|
||||
|
||||
// setDefaultBufferSize is used to set the size of buffers returned by
|
||||
// dequeueBuffer when a width and height of zero is requested. Default
|
||||
// is 1x1.
|
||||
//
|
||||
// Return of a value other than NO_ERROR means an error has occurred:
|
||||
// * BAD_VALUE - either w or h was zero
|
||||
virtual status_t setDefaultBufferSize(uint32_t w, uint32_t h) = 0;
|
||||
|
||||
// setDefaultMaxBufferCount sets the default value for the maximum buffer
|
||||
// count (the initial default is 2). If the producer has requested a
|
||||
// buffer count using setBufferCount, the default buffer count will only
|
||||
// take effect if the producer sets the count back to zero.
|
||||
//
|
||||
// The count must be between 2 and NUM_BUFFER_SLOTS, inclusive.
|
||||
//
|
||||
// Return of a value other than NO_ERROR means an error has occurred:
|
||||
// * BAD_VALUE - bufferCount was out of range (see above).
|
||||
virtual status_t setDefaultMaxBufferCount(int bufferCount) = 0;
|
||||
|
||||
// disableAsyncBuffer disables the extra buffer used in async mode
|
||||
// (when both producer and consumer have set their "isControlledByApp"
|
||||
// flag) and has dequeueBuffer() return WOULD_BLOCK instead.
|
||||
//
|
||||
// This can only be called before consumerConnect().
|
||||
//
|
||||
// Return of a value other than NO_ERROR means an error has occurred:
|
||||
// * INVALID_OPERATION - attempting to call this after consumerConnect.
|
||||
virtual status_t disableAsyncBuffer() = 0;
|
||||
|
||||
// setMaxAcquiredBufferCount sets the maximum number of buffers that can
|
||||
// be acquired by the consumer at one time (default 1). This call will
|
||||
// fail if a producer is connected to the BufferQueue.
|
||||
//
|
||||
// maxAcquiredBuffers must be (inclusive) between 1 and MAX_MAX_ACQUIRED_BUFFERS.
|
||||
//
|
||||
// Return of a value other than NO_ERROR means an error has occurred:
|
||||
// * BAD_VALUE - maxAcquiredBuffers was out of range (see above).
|
||||
// * INVALID_OPERATION - attempting to call this after a producer connected.
|
||||
virtual status_t setMaxAcquiredBufferCount(int maxAcquiredBuffers) = 0;
|
||||
|
||||
// setConsumerName sets the name used in logging
|
||||
virtual void setConsumerName(const String8& name) = 0;
|
||||
|
||||
// setDefaultBufferFormat allows the BufferQueue to create
|
||||
// GraphicBuffers of a defaultFormat if no format is specified
|
||||
// in dequeueBuffer.
|
||||
// The initial default is PIXEL_FORMAT_RGBA_8888.
|
||||
//
|
||||
// Return of a value other than NO_ERROR means an unknown error has occurred.
|
||||
virtual status_t setDefaultBufferFormat(PixelFormat defaultFormat) = 0;
|
||||
|
||||
// setDefaultBufferDataSpace is a request to the producer to provide buffers
|
||||
// of the indicated dataSpace. The producer may ignore this request.
|
||||
// The initial default is HAL_DATASPACE_UNKNOWN.
|
||||
//
|
||||
// Return of a value other than NO_ERROR means an unknown error has occurred.
|
||||
virtual status_t setDefaultBufferDataSpace(
|
||||
android_dataspace defaultDataSpace) = 0;
|
||||
|
||||
// setConsumerUsageBits will turn on additional usage bits for dequeueBuffer.
|
||||
// These are merged with the bits passed to dequeueBuffer. The values are
|
||||
// enumerated in gralloc.h, e.g. GRALLOC_USAGE_HW_RENDER; the default is 0.
|
||||
//
|
||||
// Return of a value other than NO_ERROR means an unknown error has occurred.
|
||||
virtual status_t setConsumerUsageBits(uint32_t usage) = 0;
|
||||
|
||||
// setTransformHint bakes in rotation to buffers so overlays can be used.
|
||||
// The values are enumerated in window.h, e.g.
|
||||
// NATIVE_WINDOW_TRANSFORM_ROT_90. The default is 0 (no transform).
|
||||
//
|
||||
// Return of a value other than NO_ERROR means an unknown error has occurred.
|
||||
virtual status_t setTransformHint(uint32_t hint) = 0;
|
||||
|
||||
// Retrieve the sideband buffer stream, if any.
|
||||
virtual sp<NativeHandle> getSidebandStream() const = 0;
|
||||
|
||||
// dump state into a string
|
||||
virtual void dump(String8& result, const char* prefix) const = 0;
|
||||
|
||||
public:
|
||||
DECLARE_META_INTERFACE(GraphicBufferConsumer);
|
||||
};
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
class BnGraphicBufferConsumer : public BnInterface<IGraphicBufferConsumer>
|
||||
{
|
||||
public:
|
||||
virtual status_t onTransact( uint32_t code,
|
||||
const Parcel& data,
|
||||
Parcel* reply,
|
||||
uint32_t flags = 0);
|
||||
};
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
}; // namespace android
|
||||
|
||||
#endif // ANDROID_GUI_IGRAPHICBUFFERCONSUMER_H
|
||||
502
third_party/android_frameworks_native/include/gui/IGraphicBufferProducer.h
vendored
Normal file
502
third_party/android_frameworks_native/include/gui/IGraphicBufferProducer.h
vendored
Normal file
@@ -0,0 +1,502 @@
|
||||
/*
|
||||
* Copyright (C) 2010 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#ifndef ANDROID_GUI_IGRAPHICBUFFERPRODUCER_H
|
||||
#define ANDROID_GUI_IGRAPHICBUFFERPRODUCER_H
|
||||
|
||||
#include <stdint.h>
|
||||
#include <sys/types.h>
|
||||
|
||||
#include <utils/Errors.h>
|
||||
#include <utils/RefBase.h>
|
||||
|
||||
#include <binder/IInterface.h>
|
||||
|
||||
#include <ui/Fence.h>
|
||||
#include <ui/GraphicBuffer.h>
|
||||
#include <ui/Rect.h>
|
||||
#include <ui/Region.h>
|
||||
|
||||
namespace android {
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
class IProducerListener;
|
||||
class NativeHandle;
|
||||
class Surface;
|
||||
|
||||
/*
|
||||
* This class defines the Binder IPC interface for the producer side of
|
||||
* a queue of graphics buffers. It's used to send graphics data from one
|
||||
* component to another. For example, a class that decodes video for
|
||||
* playback might use this to provide frames. This is typically done
|
||||
* indirectly, through Surface.
|
||||
*
|
||||
* The underlying mechanism is a BufferQueue, which implements
|
||||
* BnGraphicBufferProducer. In normal operation, the producer calls
|
||||
* dequeueBuffer() to get an empty buffer, fills it with data, then
|
||||
* calls queueBuffer() to make it available to the consumer.
|
||||
*
|
||||
* This class was previously called ISurfaceTexture.
|
||||
*/
|
||||
class IGraphicBufferProducer : public IInterface
|
||||
{
|
||||
public:
|
||||
DECLARE_META_INTERFACE(GraphicBufferProducer);
|
||||
|
||||
enum {
|
||||
// A flag returned by dequeueBuffer when the client needs to call
|
||||
// requestBuffer immediately thereafter.
|
||||
BUFFER_NEEDS_REALLOCATION = 0x1,
|
||||
// A flag returned by dequeueBuffer when all mirrored slots should be
|
||||
// released by the client. This flag should always be processed first.
|
||||
RELEASE_ALL_BUFFERS = 0x2,
|
||||
};
|
||||
|
||||
// requestBuffer requests a new buffer for the given index. The server (i.e.
|
||||
// the IGraphicBufferProducer implementation) assigns the newly created
|
||||
// buffer to the given slot index, and the client is expected to mirror the
|
||||
// slot->buffer mapping so that it's not necessary to transfer a
|
||||
// GraphicBuffer for every dequeue operation.
|
||||
//
|
||||
// The slot must be in the range of [0, NUM_BUFFER_SLOTS).
|
||||
//
|
||||
// Return of a value other than NO_ERROR means an error has occurred:
|
||||
// * NO_INIT - the buffer queue has been abandoned.
|
||||
// * BAD_VALUE - one of the two conditions occurred:
|
||||
// * slot was out of range (see above)
|
||||
// * buffer specified by the slot is not dequeued
|
||||
virtual status_t requestBuffer(int slot, sp<GraphicBuffer>* buf) = 0;
|
||||
|
||||
// setBufferCount sets the number of buffer slots available. Calling this
|
||||
// will also cause all buffer slots to be emptied. The caller should empty
|
||||
// its mirrored copy of the buffer slots when calling this method.
|
||||
//
|
||||
// This function should not be called when there are any dequeued buffer
|
||||
// slots, doing so will result in a BAD_VALUE error returned.
|
||||
//
|
||||
// The buffer count should be at most NUM_BUFFER_SLOTS (inclusive), but at least
|
||||
// the minimum undequeued buffer count (exclusive). The minimum value
|
||||
// can be obtained by calling query(NATIVE_WINDOW_MIN_UNDEQUEUED_BUFFERS).
|
||||
// In particular the range is (minUndequeudBuffers, NUM_BUFFER_SLOTS].
|
||||
//
|
||||
// The buffer count may also be set to 0 (the default), to indicate that
|
||||
// the producer does not wish to set a value.
|
||||
//
|
||||
// Return of a value other than NO_ERROR means an error has occurred:
|
||||
// * NO_INIT - the buffer queue has been abandoned.
|
||||
// * BAD_VALUE - one of the below conditions occurred:
|
||||
// * bufferCount was out of range (see above)
|
||||
// * client has one or more buffers dequeued
|
||||
virtual status_t setBufferCount(int bufferCount) = 0;
|
||||
|
||||
// dequeueBuffer requests a new buffer slot for the client to use. Ownership
|
||||
// of the slot is transfered to the client, meaning that the server will not
|
||||
// use the contents of the buffer associated with that slot.
|
||||
//
|
||||
// The slot index returned may or may not contain a buffer (client-side).
|
||||
// If the slot is empty the client should call requestBuffer to assign a new
|
||||
// buffer to that slot.
|
||||
//
|
||||
// Once the client is done filling this buffer, it is expected to transfer
|
||||
// buffer ownership back to the server with either cancelBuffer on
|
||||
// the dequeued slot or to fill in the contents of its associated buffer
|
||||
// contents and call queueBuffer.
|
||||
//
|
||||
// If dequeueBuffer returns the BUFFER_NEEDS_REALLOCATION flag, the client is
|
||||
// expected to call requestBuffer immediately.
|
||||
//
|
||||
// If dequeueBuffer returns the RELEASE_ALL_BUFFERS flag, the client is
|
||||
// expected to release all of the mirrored slot->buffer mappings.
|
||||
//
|
||||
// The fence parameter will be updated to hold the fence associated with
|
||||
// the buffer. The contents of the buffer must not be overwritten until the
|
||||
// fence signals. If the fence is Fence::NO_FENCE, the buffer may be written
|
||||
// immediately.
|
||||
//
|
||||
// The async parameter sets whether we're in asynchronous mode for this
|
||||
// dequeueBuffer() call.
|
||||
//
|
||||
// The width and height parameters must be no greater than the minimum of
|
||||
// GL_MAX_VIEWPORT_DIMS and GL_MAX_TEXTURE_SIZE (see: glGetIntegerv).
|
||||
// An error due to invalid dimensions might not be reported until
|
||||
// updateTexImage() is called. If width and height are both zero, the
|
||||
// default values specified by setDefaultBufferSize() are used instead.
|
||||
//
|
||||
// If the format is 0, the default format will be used.
|
||||
//
|
||||
// The usage argument specifies gralloc buffer usage flags. The values
|
||||
// are enumerated in <gralloc.h>, e.g. GRALLOC_USAGE_HW_RENDER. These
|
||||
// will be merged with the usage flags specified by
|
||||
// IGraphicBufferConsumer::setConsumerUsageBits.
|
||||
//
|
||||
// This call will block until a buffer is available to be dequeued. If
|
||||
// both the producer and consumer are controlled by the app, then this call
|
||||
// can never block and will return WOULD_BLOCK if no buffer is available.
|
||||
//
|
||||
// A non-negative value with flags set (see above) will be returned upon
|
||||
// success.
|
||||
//
|
||||
// Return of a negative means an error has occurred:
|
||||
// * NO_INIT - the buffer queue has been abandoned.
|
||||
// * BAD_VALUE - both in async mode and buffer count was less than the
|
||||
// max numbers of buffers that can be allocated at once.
|
||||
// * INVALID_OPERATION - cannot attach the buffer because it would cause
|
||||
// too many buffers to be dequeued, either because
|
||||
// the producer already has a single buffer dequeued
|
||||
// and did not set a buffer count, or because a
|
||||
// buffer count was set and this call would cause
|
||||
// it to be exceeded.
|
||||
// * WOULD_BLOCK - no buffer is currently available, and blocking is disabled
|
||||
// since both the producer/consumer are controlled by app
|
||||
// * NO_MEMORY - out of memory, cannot allocate the graphics buffer.
|
||||
//
|
||||
// All other negative values are an unknown error returned downstream
|
||||
// from the graphics allocator (typically errno).
|
||||
virtual status_t dequeueBuffer(int* slot, sp<Fence>* fence, bool async,
|
||||
uint32_t w, uint32_t h, PixelFormat format, uint32_t usage) = 0;
|
||||
|
||||
// detachBuffer attempts to remove all ownership of the buffer in the given
|
||||
// slot from the buffer queue. If this call succeeds, the slot will be
|
||||
// freed, and there will be no way to obtain the buffer from this interface.
|
||||
// The freed slot will remain unallocated until either it is selected to
|
||||
// hold a freshly allocated buffer in dequeueBuffer or a buffer is attached
|
||||
// to the slot. The buffer must have already been dequeued, and the caller
|
||||
// must already possesses the sp<GraphicBuffer> (i.e., must have called
|
||||
// requestBuffer).
|
||||
//
|
||||
// Return of a value other than NO_ERROR means an error has occurred:
|
||||
// * NO_INIT - the buffer queue has been abandoned.
|
||||
// * BAD_VALUE - the given slot number is invalid, either because it is
|
||||
// out of the range [0, NUM_BUFFER_SLOTS), or because the slot
|
||||
// it refers to is not currently dequeued and requested.
|
||||
virtual status_t detachBuffer(int slot) = 0;
|
||||
|
||||
// detachNextBuffer is equivalent to calling dequeueBuffer, requestBuffer,
|
||||
// and detachBuffer in sequence, except for two things:
|
||||
//
|
||||
// 1) It is unnecessary to know the dimensions, format, or usage of the
|
||||
// next buffer.
|
||||
// 2) It will not block, since if it cannot find an appropriate buffer to
|
||||
// return, it will return an error instead.
|
||||
//
|
||||
// Only slots that are free but still contain a GraphicBuffer will be
|
||||
// considered, and the oldest of those will be returned. outBuffer is
|
||||
// equivalent to outBuffer from the requestBuffer call, and outFence is
|
||||
// equivalent to fence from the dequeueBuffer call.
|
||||
//
|
||||
// Return of a value other than NO_ERROR means an error has occurred:
|
||||
// * NO_INIT - the buffer queue has been abandoned.
|
||||
// * BAD_VALUE - either outBuffer or outFence were NULL.
|
||||
// * NO_MEMORY - no slots were found that were both free and contained a
|
||||
// GraphicBuffer.
|
||||
virtual status_t detachNextBuffer(sp<GraphicBuffer>* outBuffer,
|
||||
sp<Fence>* outFence) = 0;
|
||||
|
||||
// attachBuffer attempts to transfer ownership of a buffer to the buffer
|
||||
// queue. If this call succeeds, it will be as if this buffer was dequeued
|
||||
// from the returned slot number. As such, this call will fail if attaching
|
||||
// this buffer would cause too many buffers to be simultaneously dequeued.
|
||||
//
|
||||
// If attachBuffer returns the RELEASE_ALL_BUFFERS flag, the caller is
|
||||
// expected to release all of the mirrored slot->buffer mappings.
|
||||
//
|
||||
// A non-negative value with flags set (see above) will be returned upon
|
||||
// success.
|
||||
//
|
||||
// Return of a negative value means an error has occurred:
|
||||
// * NO_INIT - the buffer queue has been abandoned.
|
||||
// * BAD_VALUE - outSlot or buffer were NULL, invalid combination of
|
||||
// async mode and buffer count override, or the generation
|
||||
// number of the buffer did not match the buffer queue.
|
||||
// * INVALID_OPERATION - cannot attach the buffer because it would cause
|
||||
// too many buffers to be dequeued, either because
|
||||
// the producer already has a single buffer dequeued
|
||||
// and did not set a buffer count, or because a
|
||||
// buffer count was set and this call would cause
|
||||
// it to be exceeded.
|
||||
// * WOULD_BLOCK - no buffer slot is currently available, and blocking is
|
||||
// disabled since both the producer/consumer are
|
||||
// controlled by the app.
|
||||
virtual status_t attachBuffer(int* outSlot,
|
||||
const sp<GraphicBuffer>& buffer) = 0;
|
||||
|
||||
// queueBuffer indicates that the client has finished filling in the
|
||||
// contents of the buffer associated with slot and transfers ownership of
|
||||
// that slot back to the server.
|
||||
//
|
||||
// It is not valid to call queueBuffer on a slot that is not owned
|
||||
// by the client or one for which a buffer associated via requestBuffer
|
||||
// (an attempt to do so will fail with a return value of BAD_VALUE).
|
||||
//
|
||||
// In addition, the input must be described by the client (as documented
|
||||
// below). Any other properties (zero point, etc)
|
||||
// are client-dependent, and should be documented by the client.
|
||||
//
|
||||
// The slot must be in the range of [0, NUM_BUFFER_SLOTS).
|
||||
//
|
||||
// Upon success, the output will be filled with meaningful values
|
||||
// (refer to the documentation below).
|
||||
//
|
||||
// Return of a value other than NO_ERROR means an error has occurred:
|
||||
// * NO_INIT - the buffer queue has been abandoned.
|
||||
// * BAD_VALUE - one of the below conditions occurred:
|
||||
// * fence was NULL
|
||||
// * scaling mode was unknown
|
||||
// * both in async mode and buffer count was less than the
|
||||
// max numbers of buffers that can be allocated at once
|
||||
// * slot index was out of range (see above).
|
||||
// * the slot was not in the dequeued state
|
||||
// * the slot was enqueued without requesting a buffer
|
||||
// * crop rect is out of bounds of the buffer dimensions
|
||||
|
||||
struct QueueBufferInput : public Flattenable<QueueBufferInput> {
|
||||
friend class Flattenable<QueueBufferInput>;
|
||||
inline QueueBufferInput(const Parcel& parcel);
|
||||
// timestamp - a monotonically increasing value in nanoseconds
|
||||
// isAutoTimestamp - if the timestamp was synthesized at queue time
|
||||
// dataSpace - description of the contents, interpretation depends on format
|
||||
// crop - a crop rectangle that's used as a hint to the consumer
|
||||
// scalingMode - a set of flags from NATIVE_WINDOW_SCALING_* in <window.h>
|
||||
// transform - a set of flags from NATIVE_WINDOW_TRANSFORM_* in <window.h>
|
||||
// async - if the buffer is queued in asynchronous mode
|
||||
// fence - a fence that the consumer must wait on before reading the buffer,
|
||||
// set this to Fence::NO_FENCE if the buffer is ready immediately
|
||||
// sticky - the sticky transform set in Surface (only used by the LEGACY
|
||||
// camera mode).
|
||||
inline QueueBufferInput(int64_t timestamp, bool isAutoTimestamp,
|
||||
android_dataspace dataSpace, const Rect& crop, int scalingMode,
|
||||
uint32_t transform, bool async, const sp<Fence>& fence,
|
||||
uint32_t sticky = 0)
|
||||
: timestamp(timestamp), isAutoTimestamp(isAutoTimestamp),
|
||||
dataSpace(dataSpace), crop(crop), scalingMode(scalingMode),
|
||||
transform(transform), stickyTransform(sticky),
|
||||
async(async), fence(fence), surfaceDamage() { }
|
||||
inline void deflate(int64_t* outTimestamp, bool* outIsAutoTimestamp,
|
||||
android_dataspace* outDataSpace,
|
||||
Rect* outCrop, int* outScalingMode,
|
||||
uint32_t* outTransform, bool* outAsync, sp<Fence>* outFence,
|
||||
uint32_t* outStickyTransform = NULL) const {
|
||||
*outTimestamp = timestamp;
|
||||
*outIsAutoTimestamp = bool(isAutoTimestamp);
|
||||
*outDataSpace = dataSpace;
|
||||
*outCrop = crop;
|
||||
*outScalingMode = scalingMode;
|
||||
*outTransform = transform;
|
||||
*outAsync = bool(async);
|
||||
*outFence = fence;
|
||||
if (outStickyTransform != NULL) {
|
||||
*outStickyTransform = stickyTransform;
|
||||
}
|
||||
}
|
||||
|
||||
// Flattenable protocol
|
||||
size_t getFlattenedSize() const;
|
||||
size_t getFdCount() const;
|
||||
status_t flatten(void*& buffer, size_t& size, int*& fds, size_t& count) const;
|
||||
status_t unflatten(void const*& buffer, size_t& size, int const*& fds, size_t& count);
|
||||
|
||||
const Region& getSurfaceDamage() const { return surfaceDamage; }
|
||||
void setSurfaceDamage(const Region& damage) { surfaceDamage = damage; }
|
||||
|
||||
private:
|
||||
int64_t timestamp;
|
||||
int isAutoTimestamp;
|
||||
android_dataspace dataSpace;
|
||||
Rect crop;
|
||||
int scalingMode;
|
||||
uint32_t transform;
|
||||
uint32_t stickyTransform;
|
||||
int async;
|
||||
sp<Fence> fence;
|
||||
Region surfaceDamage;
|
||||
};
|
||||
|
||||
// QueueBufferOutput must be a POD structure
|
||||
struct __attribute__ ((__packed__)) QueueBufferOutput {
|
||||
inline QueueBufferOutput() { }
|
||||
// outWidth - filled with default width applied to the buffer
|
||||
// outHeight - filled with default height applied to the buffer
|
||||
// outTransformHint - filled with default transform applied to the buffer
|
||||
// outNumPendingBuffers - num buffers queued that haven't yet been acquired
|
||||
// (counting the currently queued buffer)
|
||||
inline void deflate(uint32_t* outWidth,
|
||||
uint32_t* outHeight,
|
||||
uint32_t* outTransformHint,
|
||||
uint32_t* outNumPendingBuffers) const {
|
||||
*outWidth = width;
|
||||
*outHeight = height;
|
||||
*outTransformHint = transformHint;
|
||||
*outNumPendingBuffers = numPendingBuffers;
|
||||
}
|
||||
inline void inflate(uint32_t inWidth, uint32_t inHeight,
|
||||
uint32_t inTransformHint, uint32_t inNumPendingBuffers) {
|
||||
width = inWidth;
|
||||
height = inHeight;
|
||||
transformHint = inTransformHint;
|
||||
numPendingBuffers = inNumPendingBuffers;
|
||||
}
|
||||
private:
|
||||
uint32_t width;
|
||||
uint32_t height;
|
||||
uint32_t transformHint;
|
||||
uint32_t numPendingBuffers;
|
||||
};
|
||||
|
||||
virtual status_t queueBuffer(int slot,
|
||||
const QueueBufferInput& input, QueueBufferOutput* output) = 0;
|
||||
|
||||
// cancelBuffer indicates that the client does not wish to fill in the
|
||||
// buffer associated with slot and transfers ownership of the slot back to
|
||||
// the server.
|
||||
//
|
||||
// The buffer is not queued for use by the consumer.
|
||||
//
|
||||
// The buffer will not be overwritten until the fence signals. The fence
|
||||
// will usually be the one obtained from dequeueBuffer.
|
||||
virtual void cancelBuffer(int slot, const sp<Fence>& fence) = 0;
|
||||
|
||||
// query retrieves some information for this surface
|
||||
// 'what' tokens allowed are that of NATIVE_WINDOW_* in <window.h>
|
||||
//
|
||||
// Return of a value other than NO_ERROR means an error has occurred:
|
||||
// * NO_INIT - the buffer queue has been abandoned.
|
||||
// * BAD_VALUE - what was out of range
|
||||
virtual int query(int what, int* value) = 0;
|
||||
|
||||
// connect attempts to connect a client API to the IGraphicBufferProducer.
|
||||
// This must be called before any other IGraphicBufferProducer methods are
|
||||
// called except for getAllocator. A consumer must be already connected.
|
||||
//
|
||||
// This method will fail if the connect was previously called on the
|
||||
// IGraphicBufferProducer and no corresponding disconnect call was made.
|
||||
//
|
||||
// The listener is an optional binder callback object that can be used if
|
||||
// the producer wants to be notified when the consumer releases a buffer
|
||||
// back to the BufferQueue. It is also used to detect the death of the
|
||||
// producer. If only the latter functionality is desired, there is a
|
||||
// DummyProducerListener class in IProducerListener.h that can be used.
|
||||
//
|
||||
// The api should be one of the NATIVE_WINDOW_API_* values in <window.h>
|
||||
//
|
||||
// The producerControlledByApp should be set to true if the producer is hosted
|
||||
// by an untrusted process (typically app_process-forked processes). If both
|
||||
// the producer and the consumer are app-controlled then all buffer queues
|
||||
// will operate in async mode regardless of the async flag.
|
||||
//
|
||||
// Upon success, the output will be filled with meaningful data
|
||||
// (refer to QueueBufferOutput documentation above).
|
||||
//
|
||||
// Return of a value other than NO_ERROR means an error has occurred:
|
||||
// * NO_INIT - one of the following occurred:
|
||||
// * the buffer queue was abandoned
|
||||
// * no consumer has yet connected
|
||||
// * BAD_VALUE - one of the following has occurred:
|
||||
// * the producer is already connected
|
||||
// * api was out of range (see above).
|
||||
// * output was NULL.
|
||||
// * DEAD_OBJECT - the token is hosted by an already-dead process
|
||||
//
|
||||
// Additional negative errors may be returned by the internals, they
|
||||
// should be treated as opaque fatal unrecoverable errors.
|
||||
virtual status_t connect(const sp<IProducerListener>& listener,
|
||||
int api, bool producerControlledByApp, QueueBufferOutput* output) = 0;
|
||||
|
||||
// disconnect attempts to disconnect a client API from the
|
||||
// IGraphicBufferProducer. Calling this method will cause any subsequent
|
||||
// calls to other IGraphicBufferProducer methods to fail except for
|
||||
// getAllocator and connect. Successfully calling connect after this will
|
||||
// allow the other methods to succeed again.
|
||||
//
|
||||
// This method will fail if the the IGraphicBufferProducer is not currently
|
||||
// connected to the specified client API.
|
||||
//
|
||||
// The api should be one of the NATIVE_WINDOW_API_* values in <window.h>
|
||||
//
|
||||
// Disconnecting from an abandoned IGraphicBufferProducer is legal and
|
||||
// is considered a no-op.
|
||||
//
|
||||
// Return of a value other than NO_ERROR means an error has occurred:
|
||||
// * BAD_VALUE - one of the following has occurred:
|
||||
// * the api specified does not match the one that was connected
|
||||
// * api was out of range (see above).
|
||||
// * DEAD_OBJECT - the token is hosted by an already-dead process
|
||||
virtual status_t disconnect(int api) = 0;
|
||||
|
||||
// Attaches a sideband buffer stream to the IGraphicBufferProducer.
|
||||
//
|
||||
// A sideband stream is a device-specific mechanism for passing buffers
|
||||
// from the producer to the consumer without using dequeueBuffer/
|
||||
// queueBuffer. If a sideband stream is present, the consumer can choose
|
||||
// whether to acquire buffers from the sideband stream or from the queued
|
||||
// buffers.
|
||||
//
|
||||
// Passing NULL or a different stream handle will detach the previous
|
||||
// handle if any.
|
||||
virtual status_t setSidebandStream(const sp<NativeHandle>& stream) = 0;
|
||||
|
||||
// Allocates buffers based on the given dimensions/format.
|
||||
//
|
||||
// This function will allocate up to the maximum number of buffers
|
||||
// permitted by the current BufferQueue configuration. It will use the
|
||||
// given format, dimensions, and usage bits, which are interpreted in the
|
||||
// same way as for dequeueBuffer, and the async flag must be set the same
|
||||
// way as for dequeueBuffer to ensure that the correct number of buffers are
|
||||
// allocated. This is most useful to avoid an allocation delay during
|
||||
// dequeueBuffer. If there are already the maximum number of buffers
|
||||
// allocated, this function has no effect.
|
||||
virtual void allocateBuffers(bool async, uint32_t width, uint32_t height,
|
||||
PixelFormat format, uint32_t usage) = 0;
|
||||
|
||||
// Sets whether dequeueBuffer is allowed to allocate new buffers.
|
||||
//
|
||||
// Normally dequeueBuffer does not discriminate between free slots which
|
||||
// already have an allocated buffer and those which do not, and will
|
||||
// allocate a new buffer if the slot doesn't have a buffer or if the slot's
|
||||
// buffer doesn't match the requested size, format, or usage. This method
|
||||
// allows the producer to restrict the eligible slots to those which already
|
||||
// have an allocated buffer of the correct size, format, and usage. If no
|
||||
// eligible slot is available, dequeueBuffer will block or return an error
|
||||
// as usual.
|
||||
virtual status_t allowAllocation(bool allow) = 0;
|
||||
|
||||
// Sets the current generation number of the BufferQueue.
|
||||
//
|
||||
// This generation number will be inserted into any buffers allocated by the
|
||||
// BufferQueue, and any attempts to attach a buffer with a different
|
||||
// generation number will fail. Buffers already in the queue are not
|
||||
// affected and will retain their current generation number. The generation
|
||||
// number defaults to 0.
|
||||
virtual status_t setGenerationNumber(uint32_t generationNumber) = 0;
|
||||
|
||||
// Returns the name of the connected consumer.
|
||||
virtual String8 getConsumerName() const = 0;
|
||||
};
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
class BnGraphicBufferProducer : public BnInterface<IGraphicBufferProducer>
|
||||
{
|
||||
public:
|
||||
virtual status_t onTransact( uint32_t code,
|
||||
const Parcel& data,
|
||||
Parcel* reply,
|
||||
uint32_t flags = 0);
|
||||
};
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
}; // namespace android
|
||||
|
||||
#endif // ANDROID_GUI_IGRAPHICBUFFERPRODUCER_H
|
||||
67
third_party/android_frameworks_native/include/gui/IProducerListener.h
vendored
Normal file
67
third_party/android_frameworks_native/include/gui/IProducerListener.h
vendored
Normal file
@@ -0,0 +1,67 @@
|
||||
/*
|
||||
* Copyright 2014 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#ifndef ANDROID_GUI_IPRODUCERLISTENER_H
|
||||
#define ANDROID_GUI_IPRODUCERLISTENER_H
|
||||
|
||||
#include <binder/IInterface.h>
|
||||
|
||||
#include <utils/RefBase.h>
|
||||
|
||||
namespace android {
|
||||
|
||||
// ProducerListener is the interface through which the BufferQueue notifies the
|
||||
// producer of events that the producer may wish to react to. Because the
|
||||
// producer will generally have a mutex that is locked during calls from the
|
||||
// producer to the BufferQueue, these calls from the BufferQueue to the
|
||||
// producer *MUST* be called only when the BufferQueue mutex is NOT locked.
|
||||
|
||||
class ProducerListener : public virtual RefBase
|
||||
{
|
||||
public:
|
||||
ProducerListener() {}
|
||||
virtual ~ProducerListener() {}
|
||||
|
||||
// onBufferReleased is called from IGraphicBufferConsumer::releaseBuffer to
|
||||
// notify the producer that a new buffer is free and ready to be dequeued.
|
||||
//
|
||||
// This is called without any lock held and can be called concurrently by
|
||||
// multiple threads.
|
||||
virtual void onBufferReleased() = 0; // Asynchronous
|
||||
};
|
||||
|
||||
class IProducerListener : public ProducerListener, public IInterface
|
||||
{
|
||||
public:
|
||||
DECLARE_META_INTERFACE(ProducerListener)
|
||||
};
|
||||
|
||||
class BnProducerListener : public BnInterface<IProducerListener>
|
||||
{
|
||||
public:
|
||||
virtual status_t onTransact(uint32_t code, const Parcel& data,
|
||||
Parcel* reply, uint32_t flags = 0);
|
||||
};
|
||||
|
||||
class DummyProducerListener : public BnProducerListener
|
||||
{
|
||||
public:
|
||||
virtual void onBufferReleased() {}
|
||||
};
|
||||
|
||||
} // namespace android
|
||||
|
||||
#endif
|
||||
59
third_party/android_frameworks_native/include/gui/ISensorEventConnection.h
vendored
Normal file
59
third_party/android_frameworks_native/include/gui/ISensorEventConnection.h
vendored
Normal file
@@ -0,0 +1,59 @@
|
||||
/*
|
||||
* Copyright (C) 2010 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#ifndef ANDROID_GUI_ISENSOR_EVENT_CONNECTION_H
|
||||
#define ANDROID_GUI_ISENSOR_EVENT_CONNECTION_H
|
||||
|
||||
#include <stdint.h>
|
||||
#include <sys/types.h>
|
||||
|
||||
#include <utils/Errors.h>
|
||||
#include <utils/RefBase.h>
|
||||
|
||||
#include <binder/IInterface.h>
|
||||
|
||||
namespace android {
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
class BitTube;
|
||||
|
||||
class ISensorEventConnection : public IInterface
|
||||
{
|
||||
public:
|
||||
DECLARE_META_INTERFACE(SensorEventConnection);
|
||||
|
||||
virtual sp<BitTube> getSensorChannel() const = 0;
|
||||
virtual status_t enableDisable(int handle, bool enabled, nsecs_t samplingPeriodNs,
|
||||
nsecs_t maxBatchReportLatencyNs, int reservedFlags) = 0;
|
||||
virtual status_t setEventRate(int handle, nsecs_t ns) = 0;
|
||||
virtual status_t flush() = 0;
|
||||
};
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
class BnSensorEventConnection : public BnInterface<ISensorEventConnection>
|
||||
{
|
||||
public:
|
||||
virtual status_t onTransact( uint32_t code,
|
||||
const Parcel& data,
|
||||
Parcel* reply,
|
||||
uint32_t flags = 0);
|
||||
};
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
}; // namespace android
|
||||
|
||||
#endif // ANDROID_GUI_ISENSOR_EVENT_CONNECTION_H
|
||||
60
third_party/android_frameworks_native/include/gui/ISensorServer.h
vendored
Normal file
60
third_party/android_frameworks_native/include/gui/ISensorServer.h
vendored
Normal file
@@ -0,0 +1,60 @@
|
||||
/*
|
||||
* Copyright (C) 2010 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#ifndef ANDROID_GUI_ISENSORSERVER_H
|
||||
#define ANDROID_GUI_ISENSORSERVER_H
|
||||
|
||||
#include <stdint.h>
|
||||
#include <sys/types.h>
|
||||
|
||||
#include <utils/Errors.h>
|
||||
#include <utils/RefBase.h>
|
||||
|
||||
#include <binder/IInterface.h>
|
||||
|
||||
namespace android {
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
class Sensor;
|
||||
class ISensorEventConnection;
|
||||
class String8;
|
||||
|
||||
class ISensorServer : public IInterface
|
||||
{
|
||||
public:
|
||||
DECLARE_META_INTERFACE(SensorServer);
|
||||
|
||||
virtual Vector<Sensor> getSensorList(const String16& opPackageName) = 0;
|
||||
virtual sp<ISensorEventConnection> createSensorEventConnection(const String8& packageName,
|
||||
int mode, const String16& opPackageName) = 0;
|
||||
virtual int32_t isDataInjectionEnabled() = 0;
|
||||
};
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
class BnSensorServer : public BnInterface<ISensorServer>
|
||||
{
|
||||
public:
|
||||
virtual status_t onTransact( uint32_t code,
|
||||
const Parcel& data,
|
||||
Parcel* reply,
|
||||
uint32_t flags = 0);
|
||||
};
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
}; // namespace android
|
||||
|
||||
#endif // ANDROID_GUI_ISENSORSERVER_H
|
||||
201
third_party/android_frameworks_native/include/gui/ISurfaceComposer.h
vendored
Normal file
201
third_party/android_frameworks_native/include/gui/ISurfaceComposer.h
vendored
Normal file
@@ -0,0 +1,201 @@
|
||||
/*
|
||||
* Copyright (C) 2006 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#ifndef ANDROID_GUI_ISURFACE_COMPOSER_H
|
||||
#define ANDROID_GUI_ISURFACE_COMPOSER_H
|
||||
|
||||
#include <stdint.h>
|
||||
#include <sys/types.h>
|
||||
|
||||
#include <utils/RefBase.h>
|
||||
#include <utils/Errors.h>
|
||||
#include <utils/Timers.h>
|
||||
#include <utils/Vector.h>
|
||||
|
||||
#include <binder/IInterface.h>
|
||||
|
||||
#include <ui/FrameStats.h>
|
||||
|
||||
#include <gui/IGraphicBufferAlloc.h>
|
||||
#include <gui/ISurfaceComposerClient.h>
|
||||
|
||||
namespace android {
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
class ComposerState;
|
||||
class DisplayState;
|
||||
struct DisplayInfo;
|
||||
struct DisplayStatInfo;
|
||||
class IDisplayEventConnection;
|
||||
class IMemoryHeap;
|
||||
class Rect;
|
||||
|
||||
/*
|
||||
* This class defines the Binder IPC interface for accessing various
|
||||
* SurfaceFlinger features.
|
||||
*/
|
||||
class ISurfaceComposer: public IInterface {
|
||||
public:
|
||||
DECLARE_META_INTERFACE(SurfaceComposer);
|
||||
|
||||
// flags for setTransactionState()
|
||||
enum {
|
||||
eSynchronous = 0x01,
|
||||
eAnimation = 0x02,
|
||||
};
|
||||
|
||||
enum {
|
||||
eDisplayIdMain = 0,
|
||||
eDisplayIdHdmi = 1,
|
||||
#ifdef QTI_BSP
|
||||
eDisplayIdTertiary = 2
|
||||
#endif
|
||||
};
|
||||
|
||||
enum Rotation {
|
||||
eRotateNone = 0,
|
||||
eRotate90 = 1,
|
||||
eRotate180 = 2,
|
||||
eRotate270 = 3
|
||||
};
|
||||
|
||||
/* create connection with surface flinger, requires
|
||||
* ACCESS_SURFACE_FLINGER permission
|
||||
*/
|
||||
virtual sp<ISurfaceComposerClient> createConnection() = 0;
|
||||
|
||||
/* create a graphic buffer allocator
|
||||
*/
|
||||
virtual sp<IGraphicBufferAlloc> createGraphicBufferAlloc() = 0;
|
||||
|
||||
/* return an IDisplayEventConnection */
|
||||
virtual sp<IDisplayEventConnection> createDisplayEventConnection() = 0;
|
||||
|
||||
/* create a virtual display
|
||||
* requires ACCESS_SURFACE_FLINGER permission.
|
||||
*/
|
||||
virtual sp<IBinder> createDisplay(const String8& displayName,
|
||||
bool secure) = 0;
|
||||
|
||||
/* destroy a virtual display
|
||||
* requires ACCESS_SURFACE_FLINGER permission.
|
||||
*/
|
||||
virtual void destroyDisplay(const sp<IBinder>& display) = 0;
|
||||
|
||||
/* get the token for the existing default displays. possible values
|
||||
* for id are eDisplayIdMain and eDisplayIdHdmi.
|
||||
*/
|
||||
virtual sp<IBinder> getBuiltInDisplay(int32_t id) = 0;
|
||||
|
||||
/* open/close transactions. requires ACCESS_SURFACE_FLINGER permission */
|
||||
virtual void setTransactionState(const Vector<ComposerState>& state,
|
||||
const Vector<DisplayState>& displays, uint32_t flags) = 0;
|
||||
|
||||
/* signal that we're done booting.
|
||||
* Requires ACCESS_SURFACE_FLINGER permission
|
||||
*/
|
||||
virtual void bootFinished() = 0;
|
||||
|
||||
/* verify that an IGraphicBufferProducer was created by SurfaceFlinger.
|
||||
*/
|
||||
virtual bool authenticateSurfaceTexture(
|
||||
const sp<IGraphicBufferProducer>& surface) const = 0;
|
||||
|
||||
/* set display power mode. depending on the mode, it can either trigger
|
||||
* screen on, off or low power mode and wait for it to complete.
|
||||
* requires ACCESS_SURFACE_FLINGER permission.
|
||||
*/
|
||||
virtual void setPowerMode(const sp<IBinder>& display, int mode) = 0;
|
||||
|
||||
/* returns information for each configuration of the given display
|
||||
* intended to be used to get information about built-in displays */
|
||||
virtual status_t getDisplayConfigs(const sp<IBinder>& display,
|
||||
Vector<DisplayInfo>* configs) = 0;
|
||||
|
||||
/* returns display statistics for a given display
|
||||
* intended to be used by the media framework to properly schedule
|
||||
* video frames */
|
||||
virtual status_t getDisplayStats(const sp<IBinder>& display,
|
||||
DisplayStatInfo* stats) = 0;
|
||||
|
||||
/* indicates which of the configurations returned by getDisplayInfo is
|
||||
* currently active */
|
||||
virtual int getActiveConfig(const sp<IBinder>& display) = 0;
|
||||
|
||||
/* specifies which configuration (of those returned by getDisplayInfo)
|
||||
* should be used */
|
||||
virtual status_t setActiveConfig(const sp<IBinder>& display, int id) = 0;
|
||||
|
||||
/* Capture the specified screen. requires READ_FRAME_BUFFER permission
|
||||
* This function will fail if there is a secure window on screen.
|
||||
*/
|
||||
virtual status_t captureScreen(const sp<IBinder>& display,
|
||||
const sp<IGraphicBufferProducer>& producer,
|
||||
Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight,
|
||||
uint32_t minLayerZ, uint32_t maxLayerZ,
|
||||
bool useIdentityTransform,
|
||||
Rotation rotation = eRotateNone,
|
||||
bool isCpuConsumer = false) = 0;
|
||||
|
||||
/* Clears the frame statistics for animations.
|
||||
*
|
||||
* Requires the ACCESS_SURFACE_FLINGER permission.
|
||||
*/
|
||||
virtual status_t clearAnimationFrameStats() = 0;
|
||||
|
||||
/* Gets the frame statistics for animations.
|
||||
*
|
||||
* Requires the ACCESS_SURFACE_FLINGER permission.
|
||||
*/
|
||||
virtual status_t getAnimationFrameStats(FrameStats* outStats) const = 0;
|
||||
};
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
class BnSurfaceComposer: public BnInterface<ISurfaceComposer> {
|
||||
public:
|
||||
enum {
|
||||
// Note: BOOT_FINISHED must remain this value, it is called from
|
||||
// Java by ActivityManagerService.
|
||||
BOOT_FINISHED = IBinder::FIRST_CALL_TRANSACTION,
|
||||
CREATE_CONNECTION,
|
||||
CREATE_GRAPHIC_BUFFER_ALLOC,
|
||||
CREATE_DISPLAY_EVENT_CONNECTION,
|
||||
CREATE_DISPLAY,
|
||||
DESTROY_DISPLAY,
|
||||
GET_BUILT_IN_DISPLAY,
|
||||
SET_TRANSACTION_STATE,
|
||||
AUTHENTICATE_SURFACE,
|
||||
GET_DISPLAY_CONFIGS,
|
||||
GET_ACTIVE_CONFIG,
|
||||
SET_ACTIVE_CONFIG,
|
||||
CONNECT_DISPLAY,
|
||||
CAPTURE_SCREEN,
|
||||
CLEAR_ANIMATION_FRAME_STATS,
|
||||
GET_ANIMATION_FRAME_STATS,
|
||||
SET_POWER_MODE,
|
||||
GET_DISPLAY_STATS,
|
||||
};
|
||||
|
||||
virtual status_t onTransact(uint32_t code, const Parcel& data,
|
||||
Parcel* reply, uint32_t flags = 0);
|
||||
};
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
}; // namespace android
|
||||
|
||||
#endif // ANDROID_GUI_ISURFACE_COMPOSER_H
|
||||
95
third_party/android_frameworks_native/include/gui/ISurfaceComposerClient.h
vendored
Normal file
95
third_party/android_frameworks_native/include/gui/ISurfaceComposerClient.h
vendored
Normal file
@@ -0,0 +1,95 @@
|
||||
/*
|
||||
* Copyright (C) 2007 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#ifndef ANDROID_GUI_ISURFACE_COMPOSER_CLIENT_H
|
||||
#define ANDROID_GUI_ISURFACE_COMPOSER_CLIENT_H
|
||||
|
||||
#include <stdint.h>
|
||||
#include <sys/types.h>
|
||||
|
||||
#include <utils/Errors.h>
|
||||
#include <utils/RefBase.h>
|
||||
|
||||
#include <binder/IInterface.h>
|
||||
|
||||
#include <ui/FrameStats.h>
|
||||
#include <ui/PixelFormat.h>
|
||||
|
||||
namespace android {
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
class IGraphicBufferProducer;
|
||||
|
||||
class ISurfaceComposerClient : public IInterface
|
||||
{
|
||||
public:
|
||||
DECLARE_META_INTERFACE(SurfaceComposerClient);
|
||||
|
||||
// flags for createSurface()
|
||||
enum { // (keep in sync with Surface.java)
|
||||
eHidden = 0x00000004,
|
||||
eDestroyBackbuffer = 0x00000020,
|
||||
eSecure = 0x00000080,
|
||||
eNonPremultiplied = 0x00000100,
|
||||
eOpaque = 0x00000400,
|
||||
eProtectedByApp = 0x00000800,
|
||||
eProtectedByDRM = 0x00001000,
|
||||
eCursorWindow = 0x00002000,
|
||||
|
||||
eFXSurfaceNormal = 0x00000000,
|
||||
eFXSurfaceBlur = 0x00010000,
|
||||
eFXSurfaceDim = 0x00020000,
|
||||
eFXSurfaceMask = 0x000F0000,
|
||||
};
|
||||
|
||||
/*
|
||||
* Requires ACCESS_SURFACE_FLINGER permission
|
||||
*/
|
||||
virtual status_t createSurface(
|
||||
const String8& name, uint32_t w, uint32_t h,
|
||||
PixelFormat format, uint32_t flags,
|
||||
sp<IBinder>* handle,
|
||||
sp<IGraphicBufferProducer>* gbp) = 0;
|
||||
|
||||
/*
|
||||
* Requires ACCESS_SURFACE_FLINGER permission
|
||||
*/
|
||||
virtual status_t destroySurface(const sp<IBinder>& handle) = 0;
|
||||
|
||||
/*
|
||||
* Requires ACCESS_SURFACE_FLINGER permission
|
||||
*/
|
||||
virtual status_t clearLayerFrameStats(const sp<IBinder>& handle) const = 0;
|
||||
|
||||
/*
|
||||
* Requires ACCESS_SURFACE_FLINGER permission
|
||||
*/
|
||||
virtual status_t getLayerFrameStats(const sp<IBinder>& handle, FrameStats* outStats) const = 0;
|
||||
};
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
class BnSurfaceComposerClient: public BnInterface<ISurfaceComposerClient> {
|
||||
public:
|
||||
virtual status_t onTransact(uint32_t code, const Parcel& data,
|
||||
Parcel* reply, uint32_t flags = 0);
|
||||
};
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
}; // namespace android
|
||||
|
||||
#endif // ANDROID_GUI_ISURFACE_COMPOSER_CLIENT_H
|
||||
113
third_party/android_frameworks_native/include/gui/Sensor.h
vendored
Normal file
113
third_party/android_frameworks_native/include/gui/Sensor.h
vendored
Normal file
@@ -0,0 +1,113 @@
|
||||
/*
|
||||
* Copyright (C) 2010 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#ifndef ANDROID_GUI_SENSOR_H
|
||||
#define ANDROID_GUI_SENSOR_H
|
||||
|
||||
#include <stdint.h>
|
||||
#include <sys/types.h>
|
||||
|
||||
#include <utils/Errors.h>
|
||||
#include <utils/Flattenable.h>
|
||||
#include <utils/String8.h>
|
||||
#include <utils/Timers.h>
|
||||
|
||||
#include <hardware/sensors.h>
|
||||
|
||||
#include <android/sensor.h>
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// Concrete types for the NDK
|
||||
struct ASensor { };
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
namespace android {
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
class Parcel;
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
class Sensor : public ASensor, public LightFlattenable<Sensor>
|
||||
{
|
||||
public:
|
||||
enum {
|
||||
TYPE_ACCELEROMETER = ASENSOR_TYPE_ACCELEROMETER,
|
||||
TYPE_MAGNETIC_FIELD = ASENSOR_TYPE_MAGNETIC_FIELD,
|
||||
TYPE_GYROSCOPE = ASENSOR_TYPE_GYROSCOPE,
|
||||
TYPE_LIGHT = ASENSOR_TYPE_LIGHT,
|
||||
TYPE_PROXIMITY = ASENSOR_TYPE_PROXIMITY
|
||||
};
|
||||
|
||||
Sensor();
|
||||
Sensor(struct sensor_t const* hwSensor, int halVersion = 0);
|
||||
~Sensor();
|
||||
|
||||
const String8& getName() const;
|
||||
const String8& getVendor() const;
|
||||
int32_t getHandle() const;
|
||||
int32_t getType() const;
|
||||
float getMinValue() const;
|
||||
float getMaxValue() const;
|
||||
float getResolution() const;
|
||||
float getPowerUsage() const;
|
||||
int32_t getMinDelay() const;
|
||||
nsecs_t getMinDelayNs() const;
|
||||
int32_t getVersion() const;
|
||||
uint32_t getFifoReservedEventCount() const;
|
||||
uint32_t getFifoMaxEventCount() const;
|
||||
const String8& getStringType() const;
|
||||
const String8& getRequiredPermission() const;
|
||||
bool isRequiredPermissionRuntime() const;
|
||||
int32_t getRequiredAppOp() const;
|
||||
int32_t getMaxDelay() const;
|
||||
uint32_t getFlags() const;
|
||||
bool isWakeUpSensor() const;
|
||||
int32_t getReportingMode() const;
|
||||
|
||||
// LightFlattenable protocol
|
||||
inline bool isFixedSize() const { return false; }
|
||||
size_t getFlattenedSize() const;
|
||||
status_t flatten(void* buffer, size_t size) const;
|
||||
status_t unflatten(void const* buffer, size_t size);
|
||||
|
||||
private:
|
||||
String8 mName;
|
||||
String8 mVendor;
|
||||
int32_t mHandle;
|
||||
int32_t mType;
|
||||
float mMinValue;
|
||||
float mMaxValue;
|
||||
float mResolution;
|
||||
float mPower;
|
||||
int32_t mMinDelay;
|
||||
int32_t mVersion;
|
||||
uint32_t mFifoReservedEventCount;
|
||||
uint32_t mFifoMaxEventCount;
|
||||
String8 mStringType;
|
||||
String8 mRequiredPermission;
|
||||
bool mRequiredPermissionRuntime = false;
|
||||
int32_t mRequiredAppOp;
|
||||
int32_t mMaxDelay;
|
||||
uint32_t mFlags;
|
||||
static void flattenString8(void*& buffer, size_t& size, const String8& string8);
|
||||
static bool unflattenString8(void const*& buffer, size_t& size, String8& outputString8);
|
||||
};
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
}; // namespace android
|
||||
|
||||
#endif // ANDROID_GUI_SENSOR_H
|
||||
98
third_party/android_frameworks_native/include/gui/SensorEventQueue.h
vendored
Normal file
98
third_party/android_frameworks_native/include/gui/SensorEventQueue.h
vendored
Normal file
@@ -0,0 +1,98 @@
|
||||
/*
|
||||
* Copyright (C) 2010 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#ifndef ANDROID_SENSOR_EVENT_QUEUE_H
|
||||
#define ANDROID_SENSOR_EVENT_QUEUE_H
|
||||
|
||||
#include <stdint.h>
|
||||
#include <sys/types.h>
|
||||
|
||||
#include <utils/Errors.h>
|
||||
#include <utils/RefBase.h>
|
||||
#include <utils/Timers.h>
|
||||
#include <utils/String16.h>
|
||||
|
||||
#include <gui/BitTube.h>
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
#define WAKE_UP_SENSOR_EVENT_NEEDS_ACK (1U << 31)
|
||||
struct ALooper;
|
||||
struct ASensorEvent;
|
||||
|
||||
// Concrete types for the NDK
|
||||
struct ASensorEventQueue {
|
||||
ALooper* looper;
|
||||
};
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
namespace android {
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
class ISensorEventConnection;
|
||||
class Sensor;
|
||||
class Looper;
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
class SensorEventQueue : public ASensorEventQueue, public RefBase
|
||||
{
|
||||
public:
|
||||
|
||||
enum { MAX_RECEIVE_BUFFER_EVENT_COUNT = 256 };
|
||||
|
||||
SensorEventQueue(const sp<ISensorEventConnection>& connection);
|
||||
virtual ~SensorEventQueue();
|
||||
virtual void onFirstRef();
|
||||
|
||||
int getFd() const;
|
||||
|
||||
static ssize_t write(const sp<BitTube>& tube,
|
||||
ASensorEvent const* events, size_t numEvents);
|
||||
|
||||
ssize_t read(ASensorEvent* events, size_t numEvents);
|
||||
|
||||
status_t waitForEvent() const;
|
||||
status_t wake() const;
|
||||
|
||||
status_t enableSensor(Sensor const* sensor) const;
|
||||
status_t disableSensor(Sensor const* sensor) const;
|
||||
status_t setEventRate(Sensor const* sensor, nsecs_t ns) const;
|
||||
|
||||
// these are here only to support SensorManager.java
|
||||
status_t enableSensor(int32_t handle, int32_t samplingPeriodUs, int maxBatchReportLatencyUs,
|
||||
int reservedFlags) const;
|
||||
status_t disableSensor(int32_t handle) const;
|
||||
status_t flush() const;
|
||||
// Send an ack for every wake_up sensor event that is set to WAKE_UP_SENSOR_EVENT_NEEDS_ACK.
|
||||
void sendAck(const ASensorEvent* events, int count);
|
||||
|
||||
status_t injectSensorEvent(const ASensorEvent& event);
|
||||
private:
|
||||
sp<Looper> getLooper() const;
|
||||
sp<ISensorEventConnection> mSensorEventConnection;
|
||||
sp<BitTube> mSensorChannel;
|
||||
mutable Mutex mLock;
|
||||
mutable sp<Looper> mLooper;
|
||||
ASensorEvent* mRecBuffer;
|
||||
size_t mAvailable;
|
||||
size_t mConsumed;
|
||||
uint32_t mNumAcksToSend;
|
||||
};
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
}; // namespace android
|
||||
|
||||
#endif // ANDROID_SENSOR_EVENT_QUEUE_H
|
||||
84
third_party/android_frameworks_native/include/gui/SensorManager.h
vendored
Normal file
84
third_party/android_frameworks_native/include/gui/SensorManager.h
vendored
Normal file
@@ -0,0 +1,84 @@
|
||||
/*
|
||||
* Copyright (C) 2010 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#ifndef ANDROID_GUI_SENSOR_MANAGER_H
|
||||
#define ANDROID_GUI_SENSOR_MANAGER_H
|
||||
|
||||
#include <map>
|
||||
|
||||
#include <stdint.h>
|
||||
#include <sys/types.h>
|
||||
|
||||
#include <binder/IBinder.h>
|
||||
#include <binder/IPCThreadState.h>
|
||||
#include <binder/IServiceManager.h>
|
||||
|
||||
#include <utils/Errors.h>
|
||||
#include <utils/RefBase.h>
|
||||
#include <utils/Singleton.h>
|
||||
#include <utils/Vector.h>
|
||||
#include <utils/String8.h>
|
||||
|
||||
#include <gui/SensorEventQueue.h>
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// Concrete types for the NDK
|
||||
struct ASensorManager { };
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
namespace android {
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
class ISensorServer;
|
||||
class Sensor;
|
||||
class SensorEventQueue;
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
class SensorManager :
|
||||
public ASensorManager
|
||||
{
|
||||
public:
|
||||
static SensorManager& getInstanceForPackage(const String16& packageName);
|
||||
~SensorManager();
|
||||
|
||||
ssize_t getSensorList(Sensor const* const** list) const;
|
||||
Sensor const* getDefaultSensor(int type);
|
||||
sp<SensorEventQueue> createEventQueue(String8 packageName = String8(""), int mode = 0);
|
||||
bool isDataInjectionEnabled();
|
||||
|
||||
private:
|
||||
// DeathRecipient interface
|
||||
void sensorManagerDied();
|
||||
|
||||
SensorManager(const String16& opPackageName);
|
||||
status_t assertStateLocked() const;
|
||||
|
||||
private:
|
||||
static Mutex sLock;
|
||||
static std::map<String16, SensorManager*> sPackageInstances;
|
||||
|
||||
mutable Mutex mLock;
|
||||
mutable sp<ISensorServer> mSensorServer;
|
||||
mutable Sensor const** mSensorList;
|
||||
mutable Vector<Sensor> mSensors;
|
||||
mutable sp<IBinder::DeathRecipient> mDeathObserver;
|
||||
const String16 mOpPackageName;
|
||||
};
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
}; // namespace android
|
||||
|
||||
#endif // ANDROID_GUI_SENSOR_MANAGER_H
|
||||
184
third_party/android_frameworks_native/include/gui/StreamSplitter.h
vendored
Normal file
184
third_party/android_frameworks_native/include/gui/StreamSplitter.h
vendored
Normal file
@@ -0,0 +1,184 @@
|
||||
/*
|
||||
* Copyright 2014 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#ifndef ANDROID_GUI_STREAMSPLITTER_H
|
||||
#define ANDROID_GUI_STREAMSPLITTER_H
|
||||
|
||||
#include <gui/IConsumerListener.h>
|
||||
#include <gui/IProducerListener.h>
|
||||
|
||||
#include <utils/Condition.h>
|
||||
#include <utils/KeyedVector.h>
|
||||
#include <utils/Mutex.h>
|
||||
#include <utils/StrongPointer.h>
|
||||
|
||||
namespace android {
|
||||
|
||||
class GraphicBuffer;
|
||||
class IGraphicBufferConsumer;
|
||||
class IGraphicBufferProducer;
|
||||
|
||||
// StreamSplitter is an autonomous class that manages one input BufferQueue
|
||||
// and multiple output BufferQueues. By using the buffer attach and detach logic
|
||||
// in BufferQueue, it is able to present the illusion of a single split
|
||||
// BufferQueue, where each buffer queued to the input is available to be
|
||||
// acquired by each of the outputs, and is able to be dequeued by the input
|
||||
// again only once all of the outputs have released it.
|
||||
class StreamSplitter : public BnConsumerListener {
|
||||
public:
|
||||
// createSplitter creates a new splitter, outSplitter, using inputQueue as
|
||||
// the input BufferQueue. Output BufferQueues must be added using addOutput
|
||||
// before queueing any buffers to the input.
|
||||
//
|
||||
// A return value other than NO_ERROR means that an error has occurred and
|
||||
// outSplitter has not been modified. BAD_VALUE is returned if inputQueue or
|
||||
// outSplitter is NULL. See IGraphicBufferConsumer::consumerConnect for
|
||||
// explanations of other error codes.
|
||||
static status_t createSplitter(const sp<IGraphicBufferConsumer>& inputQueue,
|
||||
sp<StreamSplitter>* outSplitter);
|
||||
|
||||
// addOutput adds an output BufferQueue to the splitter. The splitter
|
||||
// connects to outputQueue as a CPU producer, and any buffers queued
|
||||
// to the input will be queued to each output. It is assumed that all of the
|
||||
// outputs are added before any buffers are queued on the input. If any
|
||||
// output is abandoned by its consumer, the splitter will abandon its input
|
||||
// queue (see onAbandoned).
|
||||
//
|
||||
// A return value other than NO_ERROR means that an error has occurred and
|
||||
// outputQueue has not been added to the splitter. BAD_VALUE is returned if
|
||||
// outputQueue is NULL. See IGraphicBufferProducer::connect for explanations
|
||||
// of other error codes.
|
||||
status_t addOutput(const sp<IGraphicBufferProducer>& outputQueue);
|
||||
|
||||
// setName sets the consumer name of the input queue
|
||||
void setName(const String8& name);
|
||||
|
||||
private:
|
||||
// From IConsumerListener
|
||||
//
|
||||
// During this callback, we store some tracking information, detach the
|
||||
// buffer from the input, and attach it to each of the outputs. This call
|
||||
// can block if there are too many outstanding buffers. If it blocks, it
|
||||
// will resume when onBufferReleasedByOutput releases a buffer back to the
|
||||
// input.
|
||||
virtual void onFrameAvailable(const BufferItem& item);
|
||||
|
||||
// From IConsumerListener
|
||||
// We don't care about released buffers because we detach each buffer as
|
||||
// soon as we acquire it. See the comment for onBufferReleased below for
|
||||
// some clarifying notes about the name.
|
||||
virtual void onBuffersReleased() {}
|
||||
|
||||
// From IConsumerListener
|
||||
// We don't care about sideband streams, since we won't be splitting them
|
||||
virtual void onSidebandStreamChanged() {}
|
||||
|
||||
// This is the implementation of the onBufferReleased callback from
|
||||
// IProducerListener. It gets called from an OutputListener (see below), and
|
||||
// 'from' is which producer interface from which the callback was received.
|
||||
//
|
||||
// During this callback, we detach the buffer from the output queue that
|
||||
// generated the callback, update our state tracking to see if this is the
|
||||
// last output releasing the buffer, and if so, release it to the input.
|
||||
// If we release the buffer to the input, we allow a blocked
|
||||
// onFrameAvailable call to proceed.
|
||||
void onBufferReleasedByOutput(const sp<IGraphicBufferProducer>& from);
|
||||
|
||||
// When this is called, the splitter disconnects from (i.e., abandons) its
|
||||
// input queue and signals any waiting onFrameAvailable calls to wake up.
|
||||
// It still processes callbacks from other outputs, but only detaches their
|
||||
// buffers so they can continue operating until they run out of buffers to
|
||||
// acquire. This must be called with mMutex locked.
|
||||
void onAbandonedLocked();
|
||||
|
||||
// This is a thin wrapper class that lets us determine which BufferQueue
|
||||
// the IProducerListener::onBufferReleased callback is associated with. We
|
||||
// create one of these per output BufferQueue, and then pass the producer
|
||||
// into onBufferReleasedByOutput above.
|
||||
class OutputListener : public BnProducerListener,
|
||||
public IBinder::DeathRecipient {
|
||||
public:
|
||||
OutputListener(const sp<StreamSplitter>& splitter,
|
||||
const sp<IGraphicBufferProducer>& output);
|
||||
virtual ~OutputListener();
|
||||
|
||||
// From IProducerListener
|
||||
virtual void onBufferReleased();
|
||||
|
||||
// From IBinder::DeathRecipient
|
||||
virtual void binderDied(const wp<IBinder>& who);
|
||||
|
||||
private:
|
||||
sp<StreamSplitter> mSplitter;
|
||||
sp<IGraphicBufferProducer> mOutput;
|
||||
};
|
||||
|
||||
class BufferTracker : public LightRefBase<BufferTracker> {
|
||||
public:
|
||||
BufferTracker(const sp<GraphicBuffer>& buffer);
|
||||
|
||||
const sp<GraphicBuffer>& getBuffer() const { return mBuffer; }
|
||||
const sp<Fence>& getMergedFence() const { return mMergedFence; }
|
||||
|
||||
void mergeFence(const sp<Fence>& with);
|
||||
|
||||
// Returns the new value
|
||||
// Only called while mMutex is held
|
||||
size_t incrementReleaseCountLocked() { return ++mReleaseCount; }
|
||||
|
||||
private:
|
||||
// Only destroy through LightRefBase
|
||||
friend LightRefBase<BufferTracker>;
|
||||
~BufferTracker();
|
||||
|
||||
// Disallow copying
|
||||
BufferTracker(const BufferTracker& other);
|
||||
BufferTracker& operator=(const BufferTracker& other);
|
||||
|
||||
sp<GraphicBuffer> mBuffer; // One instance that holds this native handle
|
||||
sp<Fence> mMergedFence;
|
||||
size_t mReleaseCount;
|
||||
};
|
||||
|
||||
// Only called from createSplitter
|
||||
StreamSplitter(const sp<IGraphicBufferConsumer>& inputQueue);
|
||||
|
||||
// Must be accessed through RefBase
|
||||
virtual ~StreamSplitter();
|
||||
|
||||
static const int MAX_OUTSTANDING_BUFFERS = 2;
|
||||
|
||||
// mIsAbandoned is set to true when an output dies. Once the StreamSplitter
|
||||
// has been abandoned, it will continue to detach buffers from other
|
||||
// outputs, but it will disconnect from the input and not attempt to
|
||||
// communicate with it further.
|
||||
bool mIsAbandoned;
|
||||
|
||||
Mutex mMutex;
|
||||
Condition mReleaseCondition;
|
||||
int mOutstandingBuffers;
|
||||
sp<IGraphicBufferConsumer> mInput;
|
||||
Vector<sp<IGraphicBufferProducer> > mOutputs;
|
||||
|
||||
// Map of GraphicBuffer IDs (GraphicBuffer::getId()) to buffer tracking
|
||||
// objects (which are mostly for counting how many outputs have released the
|
||||
// buffer, but also contain merged release fences).
|
||||
KeyedVector<uint64_t, sp<BufferTracker> > mBuffers;
|
||||
};
|
||||
|
||||
} // namespace android
|
||||
|
||||
#endif
|
||||
324
third_party/android_frameworks_native/include/gui/Surface.h
vendored
Normal file
324
third_party/android_frameworks_native/include/gui/Surface.h
vendored
Normal file
@@ -0,0 +1,324 @@
|
||||
/*
|
||||
* Copyright (C) 2010 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#ifndef ANDROID_GUI_SURFACE_H
|
||||
#define ANDROID_GUI_SURFACE_H
|
||||
|
||||
#include <gui/IGraphicBufferProducer.h>
|
||||
#include <gui/BufferQueue.h>
|
||||
|
||||
#include <ui/ANativeObjectBase.h>
|
||||
#include <ui/Region.h>
|
||||
|
||||
#include <utils/RefBase.h>
|
||||
#include <utils/threads.h>
|
||||
#include <utils/KeyedVector.h>
|
||||
|
||||
struct ANativeWindow_Buffer;
|
||||
|
||||
namespace android {
|
||||
|
||||
/*
|
||||
* An implementation of ANativeWindow that feeds graphics buffers into a
|
||||
* BufferQueue.
|
||||
*
|
||||
* This is typically used by programs that want to render frames through
|
||||
* some means (maybe OpenGL, a software renderer, or a hardware decoder)
|
||||
* and have the frames they create forwarded to SurfaceFlinger for
|
||||
* compositing. For example, a video decoder could render a frame and call
|
||||
* eglSwapBuffers(), which invokes ANativeWindow callbacks defined by
|
||||
* Surface. Surface then forwards the buffers through Binder IPC
|
||||
* to the BufferQueue's producer interface, providing the new frame to a
|
||||
* consumer such as GLConsumer.
|
||||
*/
|
||||
class Surface
|
||||
: public ANativeObjectBase<ANativeWindow, Surface, RefBase>
|
||||
{
|
||||
public:
|
||||
|
||||
/*
|
||||
* creates a Surface from the given IGraphicBufferProducer (which concrete
|
||||
* implementation is a BufferQueue).
|
||||
*
|
||||
* Surface is mainly state-less while it's disconnected, it can be
|
||||
* viewed as a glorified IGraphicBufferProducer holder. It's therefore
|
||||
* safe to create other Surfaces from the same IGraphicBufferProducer.
|
||||
*
|
||||
* However, once a Surface is connected, it'll prevent other Surfaces
|
||||
* referring to the same IGraphicBufferProducer to become connected and
|
||||
* therefore prevent them to be used as actual producers of buffers.
|
||||
*
|
||||
* the controlledByApp flag indicates that this Surface (producer) is
|
||||
* controlled by the application. This flag is used at connect time.
|
||||
*/
|
||||
Surface(const sp<IGraphicBufferProducer>& bufferProducer, bool controlledByApp = false);
|
||||
|
||||
/* getIGraphicBufferProducer() returns the IGraphicBufferProducer this
|
||||
* Surface was created with. Usually it's an error to use the
|
||||
* IGraphicBufferProducer while the Surface is connected.
|
||||
*/
|
||||
sp<IGraphicBufferProducer> getIGraphicBufferProducer() const;
|
||||
|
||||
/* convenience function to check that the given surface is non NULL as
|
||||
* well as its IGraphicBufferProducer */
|
||||
static bool isValid(const sp<Surface>& surface) {
|
||||
return surface != NULL && surface->getIGraphicBufferProducer() != NULL;
|
||||
}
|
||||
|
||||
/* Attaches a sideband buffer stream to the Surface's IGraphicBufferProducer.
|
||||
*
|
||||
* A sideband stream is a device-specific mechanism for passing buffers
|
||||
* from the producer to the consumer without using dequeueBuffer/
|
||||
* queueBuffer. If a sideband stream is present, the consumer can choose
|
||||
* whether to acquire buffers from the sideband stream or from the queued
|
||||
* buffers.
|
||||
*
|
||||
* Passing NULL or a different stream handle will detach the previous
|
||||
* handle if any.
|
||||
*/
|
||||
void setSidebandStream(const sp<NativeHandle>& stream);
|
||||
|
||||
/* Allocates buffers based on the current dimensions/format.
|
||||
*
|
||||
* This function will allocate up to the maximum number of buffers
|
||||
* permitted by the current BufferQueue configuration. It will use the
|
||||
* default format and dimensions. This is most useful to avoid an allocation
|
||||
* delay during dequeueBuffer. If there are already the maximum number of
|
||||
* buffers allocated, this function has no effect.
|
||||
*/
|
||||
void allocateBuffers();
|
||||
|
||||
/* Sets the generation number on the IGraphicBufferProducer and updates the
|
||||
* generation number on any buffers attached to the Surface after this call.
|
||||
* See IGBP::setGenerationNumber for more information. */
|
||||
status_t setGenerationNumber(uint32_t generationNumber);
|
||||
|
||||
// See IGraphicBufferProducer::getConsumerName
|
||||
String8 getConsumerName() const;
|
||||
|
||||
protected:
|
||||
virtual ~Surface();
|
||||
|
||||
private:
|
||||
// can't be copied
|
||||
Surface& operator = (const Surface& rhs);
|
||||
Surface(const Surface& rhs);
|
||||
|
||||
// ANativeWindow hooks
|
||||
static int hook_cancelBuffer(ANativeWindow* window,
|
||||
ANativeWindowBuffer* buffer, int fenceFd);
|
||||
static int hook_dequeueBuffer(ANativeWindow* window,
|
||||
ANativeWindowBuffer** buffer, int* fenceFd);
|
||||
static int hook_perform(ANativeWindow* window, int operation, ...);
|
||||
static int hook_query(const ANativeWindow* window, int what, int* value);
|
||||
static int hook_queueBuffer(ANativeWindow* window,
|
||||
ANativeWindowBuffer* buffer, int fenceFd);
|
||||
static int hook_setSwapInterval(ANativeWindow* window, int interval);
|
||||
|
||||
static int hook_cancelBuffer_DEPRECATED(ANativeWindow* window,
|
||||
ANativeWindowBuffer* buffer);
|
||||
static int hook_dequeueBuffer_DEPRECATED(ANativeWindow* window,
|
||||
ANativeWindowBuffer** buffer);
|
||||
static int hook_lockBuffer_DEPRECATED(ANativeWindow* window,
|
||||
ANativeWindowBuffer* buffer);
|
||||
static int hook_queueBuffer_DEPRECATED(ANativeWindow* window,
|
||||
ANativeWindowBuffer* buffer);
|
||||
|
||||
int dispatchConnect(va_list args);
|
||||
int dispatchDisconnect(va_list args);
|
||||
int dispatchSetBufferCount(va_list args);
|
||||
int dispatchSetBuffersGeometry(va_list args);
|
||||
int dispatchSetBuffersDimensions(va_list args);
|
||||
int dispatchSetBuffersUserDimensions(va_list args);
|
||||
int dispatchSetBuffersFormat(va_list args);
|
||||
int dispatchSetScalingMode(va_list args);
|
||||
int dispatchSetBuffersTransform(va_list args);
|
||||
int dispatchSetBuffersStickyTransform(va_list args);
|
||||
int dispatchSetBuffersTimestamp(va_list args);
|
||||
int dispatchSetCrop(va_list args);
|
||||
int dispatchSetPostTransformCrop(va_list args);
|
||||
int dispatchSetUsage(va_list args);
|
||||
int dispatchLock(va_list args);
|
||||
int dispatchUnlockAndPost(va_list args);
|
||||
int dispatchSetSidebandStream(va_list args);
|
||||
int dispatchSetBuffersDataSpace(va_list args);
|
||||
int dispatchSetSurfaceDamage(va_list args);
|
||||
|
||||
protected:
|
||||
virtual int dequeueBuffer(ANativeWindowBuffer** buffer, int* fenceFd);
|
||||
virtual int cancelBuffer(ANativeWindowBuffer* buffer, int fenceFd);
|
||||
virtual int queueBuffer(ANativeWindowBuffer* buffer, int fenceFd);
|
||||
virtual int perform(int operation, va_list args);
|
||||
virtual int query(int what, int* value) const;
|
||||
virtual int setSwapInterval(int interval);
|
||||
|
||||
virtual int lockBuffer_DEPRECATED(ANativeWindowBuffer* buffer);
|
||||
|
||||
virtual int connect(int api);
|
||||
virtual int disconnect(int api);
|
||||
virtual int setBufferCount(int bufferCount);
|
||||
virtual int setBuffersDimensions(uint32_t width, uint32_t height);
|
||||
virtual int setBuffersUserDimensions(uint32_t width, uint32_t height);
|
||||
virtual int setBuffersFormat(PixelFormat format);
|
||||
virtual int setScalingMode(int mode);
|
||||
virtual int setBuffersTransform(uint32_t transform);
|
||||
virtual int setBuffersStickyTransform(uint32_t transform);
|
||||
virtual int setBuffersTimestamp(int64_t timestamp);
|
||||
virtual int setBuffersDataSpace(android_dataspace dataSpace);
|
||||
virtual int setCrop(Rect const* rect);
|
||||
virtual int setUsage(uint32_t reqUsage);
|
||||
virtual void setSurfaceDamage(android_native_rect_t* rects, size_t numRects);
|
||||
|
||||
public:
|
||||
virtual int lock(ANativeWindow_Buffer* outBuffer, ARect* inOutDirtyBounds);
|
||||
virtual int unlockAndPost();
|
||||
|
||||
virtual int connect(int api, const sp<IProducerListener>& listener);
|
||||
virtual int detachNextBuffer(sp<GraphicBuffer>* outBuffer,
|
||||
sp<Fence>* outFence);
|
||||
virtual int attachBuffer(ANativeWindowBuffer*);
|
||||
|
||||
protected:
|
||||
enum { NUM_BUFFER_SLOTS = BufferQueue::NUM_BUFFER_SLOTS };
|
||||
enum { DEFAULT_FORMAT = PIXEL_FORMAT_RGBA_8888 };
|
||||
|
||||
private:
|
||||
void freeAllBuffers();
|
||||
int getSlotFromBufferLocked(android_native_buffer_t* buffer) const;
|
||||
|
||||
struct BufferSlot {
|
||||
sp<GraphicBuffer> buffer;
|
||||
Region dirtyRegion;
|
||||
};
|
||||
|
||||
// mSurfaceTexture is the interface to the surface texture server. All
|
||||
// operations on the surface texture client ultimately translate into
|
||||
// interactions with the server using this interface.
|
||||
// TODO: rename to mBufferProducer
|
||||
sp<IGraphicBufferProducer> mGraphicBufferProducer;
|
||||
|
||||
// mSlots stores the buffers that have been allocated for each buffer slot.
|
||||
// It is initialized to null pointers, and gets filled in with the result of
|
||||
// IGraphicBufferProducer::requestBuffer when the client dequeues a buffer from a
|
||||
// slot that has not yet been used. The buffer allocated to a slot will also
|
||||
// be replaced if the requested buffer usage or geometry differs from that
|
||||
// of the buffer allocated to a slot.
|
||||
BufferSlot mSlots[NUM_BUFFER_SLOTS];
|
||||
|
||||
// mReqWidth is the buffer width that will be requested at the next dequeue
|
||||
// operation. It is initialized to 1.
|
||||
uint32_t mReqWidth;
|
||||
|
||||
// mReqHeight is the buffer height that will be requested at the next
|
||||
// dequeue operation. It is initialized to 1.
|
||||
uint32_t mReqHeight;
|
||||
|
||||
// mReqFormat is the buffer pixel format that will be requested at the next
|
||||
// deuque operation. It is initialized to PIXEL_FORMAT_RGBA_8888.
|
||||
PixelFormat mReqFormat;
|
||||
|
||||
// mReqUsage is the set of buffer usage flags that will be requested
|
||||
// at the next deuque operation. It is initialized to 0.
|
||||
uint32_t mReqUsage;
|
||||
|
||||
// mTimestamp is the timestamp that will be used for the next buffer queue
|
||||
// operation. It defaults to NATIVE_WINDOW_TIMESTAMP_AUTO, which means that
|
||||
// a timestamp is auto-generated when queueBuffer is called.
|
||||
int64_t mTimestamp;
|
||||
|
||||
// mDataSpace is the buffer dataSpace that will be used for the next buffer
|
||||
// queue operation. It defaults to HAL_DATASPACE_UNKNOWN, which
|
||||
// means that the buffer contains some type of color data.
|
||||
android_dataspace mDataSpace;
|
||||
|
||||
// mCrop is the crop rectangle that will be used for the next buffer
|
||||
// that gets queued. It is set by calling setCrop.
|
||||
Rect mCrop;
|
||||
|
||||
// mScalingMode is the scaling mode that will be used for the next
|
||||
// buffers that get queued. It is set by calling setScalingMode.
|
||||
int mScalingMode;
|
||||
|
||||
// mTransform is the transform identifier that will be used for the next
|
||||
// buffer that gets queued. It is set by calling setTransform.
|
||||
uint32_t mTransform;
|
||||
|
||||
// mStickyTransform is a transform that is applied on top of mTransform
|
||||
// in each buffer that is queued. This is typically used to force the
|
||||
// compositor to apply a transform, and will prevent the transform hint
|
||||
// from being set by the compositor.
|
||||
uint32_t mStickyTransform;
|
||||
|
||||
// mDefaultWidth is default width of the buffers, regardless of the
|
||||
// native_window_set_buffers_dimensions call.
|
||||
uint32_t mDefaultWidth;
|
||||
|
||||
// mDefaultHeight is default height of the buffers, regardless of the
|
||||
// native_window_set_buffers_dimensions call.
|
||||
uint32_t mDefaultHeight;
|
||||
|
||||
// mUserWidth, if non-zero, is an application-specified override
|
||||
// of mDefaultWidth. This is lower priority than the width set by
|
||||
// native_window_set_buffers_dimensions.
|
||||
uint32_t mUserWidth;
|
||||
|
||||
// mUserHeight, if non-zero, is an application-specified override
|
||||
// of mDefaultHeight. This is lower priority than the height set
|
||||
// by native_window_set_buffers_dimensions.
|
||||
uint32_t mUserHeight;
|
||||
|
||||
// mTransformHint is the transform probably applied to buffers of this
|
||||
// window. this is only a hint, actual transform may differ.
|
||||
uint32_t mTransformHint;
|
||||
|
||||
// mProducerControlledByApp whether this buffer producer is controlled
|
||||
// by the application
|
||||
bool mProducerControlledByApp;
|
||||
|
||||
// mSwapIntervalZero set if we should drop buffers at queue() time to
|
||||
// achieve an asynchronous swap interval
|
||||
bool mSwapIntervalZero;
|
||||
|
||||
// mConsumerRunningBehind whether the consumer is running more than
|
||||
// one buffer behind the producer.
|
||||
mutable bool mConsumerRunningBehind;
|
||||
|
||||
// mMutex is the mutex used to prevent concurrent access to the member
|
||||
// variables of Surface objects. It must be locked whenever the
|
||||
// member variables are accessed.
|
||||
mutable Mutex mMutex;
|
||||
|
||||
// must be used from the lock/unlock thread
|
||||
sp<GraphicBuffer> mLockedBuffer;
|
||||
sp<GraphicBuffer> mPostedBuffer;
|
||||
bool mConnectedToCpu;
|
||||
|
||||
// When a CPU producer is attached, this reflects the region that the
|
||||
// producer wished to update as well as whether the Surface was able to copy
|
||||
// the previous buffer back to allow a partial update.
|
||||
//
|
||||
// When a non-CPU producer is attached, this reflects the surface damage
|
||||
// (the change since the previous frame) passed in by the producer.
|
||||
Region mDirtyRegion;
|
||||
|
||||
// Stores the current generation number. See setGenerationNumber and
|
||||
// IGraphicBufferProducer::setGenerationNumber for more information.
|
||||
uint32_t mGenerationNumber;
|
||||
};
|
||||
|
||||
}; // namespace android
|
||||
|
||||
#endif // ANDROID_GUI_SURFACE_H
|
||||
242
third_party/android_frameworks_native/include/gui/SurfaceComposerClient.h
vendored
Normal file
242
third_party/android_frameworks_native/include/gui/SurfaceComposerClient.h
vendored
Normal file
@@ -0,0 +1,242 @@
|
||||
/*
|
||||
* Copyright (C) 2007 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#ifndef ANDROID_GUI_SURFACE_COMPOSER_CLIENT_H
|
||||
#define ANDROID_GUI_SURFACE_COMPOSER_CLIENT_H
|
||||
|
||||
#include <stdint.h>
|
||||
#include <sys/types.h>
|
||||
|
||||
#include <binder/IBinder.h>
|
||||
#include <binder/IMemory.h>
|
||||
|
||||
#include <utils/RefBase.h>
|
||||
#include <utils/Singleton.h>
|
||||
#include <utils/SortedVector.h>
|
||||
#include <utils/threads.h>
|
||||
|
||||
#include <ui/FrameStats.h>
|
||||
#include <ui/PixelFormat.h>
|
||||
|
||||
#include <gui/CpuConsumer.h>
|
||||
#include <gui/SurfaceControl.h>
|
||||
|
||||
namespace android {
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
class DisplayInfo;
|
||||
class Composer;
|
||||
class ISurfaceComposerClient;
|
||||
class IGraphicBufferProducer;
|
||||
class Region;
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
class SurfaceComposerClient : public RefBase
|
||||
{
|
||||
friend class Composer;
|
||||
public:
|
||||
SurfaceComposerClient();
|
||||
virtual ~SurfaceComposerClient();
|
||||
|
||||
// Always make sure we could initialize
|
||||
status_t initCheck() const;
|
||||
|
||||
// Return the connection of this client
|
||||
sp<IBinder> connection() const;
|
||||
|
||||
// Forcibly remove connection before all references have gone away.
|
||||
void dispose();
|
||||
|
||||
// callback when the composer is dies
|
||||
status_t linkToComposerDeath(const sp<IBinder::DeathRecipient>& recipient,
|
||||
void* cookie = NULL, uint32_t flags = 0);
|
||||
|
||||
// Get a list of supported configurations for a given display
|
||||
static status_t getDisplayConfigs(const sp<IBinder>& display,
|
||||
Vector<DisplayInfo>* configs);
|
||||
|
||||
// Get the DisplayInfo for the currently-active configuration
|
||||
static status_t getDisplayInfo(const sp<IBinder>& display,
|
||||
DisplayInfo* info);
|
||||
|
||||
// Get the index of the current active configuration (relative to the list
|
||||
// returned by getDisplayInfo)
|
||||
static int getActiveConfig(const sp<IBinder>& display);
|
||||
|
||||
// Set a new active configuration using an index relative to the list
|
||||
// returned by getDisplayInfo
|
||||
static status_t setActiveConfig(const sp<IBinder>& display, int id);
|
||||
|
||||
/* Triggers screen on/off or low power mode and waits for it to complete */
|
||||
static void setDisplayPowerMode(const sp<IBinder>& display, int mode);
|
||||
|
||||
// ------------------------------------------------------------------------
|
||||
// surface creation / destruction
|
||||
|
||||
//! Create a surface
|
||||
sp<SurfaceControl> createSurface(
|
||||
const String8& name,// name of the surface
|
||||
uint32_t w, // width in pixel
|
||||
uint32_t h, // height in pixel
|
||||
PixelFormat format, // pixel-format desired
|
||||
uint32_t flags = 0 // usage flags
|
||||
);
|
||||
|
||||
//! Create a virtual display
|
||||
static sp<IBinder> createDisplay(const String8& displayName, bool secure);
|
||||
|
||||
//! Destroy a virtual display
|
||||
static void destroyDisplay(const sp<IBinder>& display);
|
||||
|
||||
//! Get the token for the existing default displays.
|
||||
//! Possible values for id are eDisplayIdMain and eDisplayIdHdmi.
|
||||
static sp<IBinder> getBuiltInDisplay(int32_t id);
|
||||
|
||||
// ------------------------------------------------------------------------
|
||||
// Composer parameters
|
||||
// All composer parameters must be changed within a transaction
|
||||
// several surfaces can be updated in one transaction, all changes are
|
||||
// committed at once when the transaction is closed.
|
||||
// closeGlobalTransaction() requires an IPC with the server.
|
||||
|
||||
//! Open a composer transaction on all active SurfaceComposerClients.
|
||||
static void openGlobalTransaction();
|
||||
|
||||
//! Close a composer transaction on all active SurfaceComposerClients.
|
||||
static void closeGlobalTransaction(bool synchronous = false);
|
||||
|
||||
//! Flag the currently open transaction as an animation transaction.
|
||||
static void setAnimationTransaction();
|
||||
|
||||
status_t hide(const sp<IBinder>& id);
|
||||
status_t show(const sp<IBinder>& id);
|
||||
status_t setFlags(const sp<IBinder>& id, uint32_t flags, uint32_t mask);
|
||||
status_t setTransparentRegionHint(const sp<IBinder>& id, const Region& transparent);
|
||||
status_t setLayer(const sp<IBinder>& id, uint32_t layer);
|
||||
status_t setAlpha(const sp<IBinder>& id, float alpha=1.0f);
|
||||
status_t setMatrix(const sp<IBinder>& id, float dsdx, float dtdx, float dsdy, float dtdy);
|
||||
status_t setPosition(const sp<IBinder>& id, float x, float y);
|
||||
status_t setSize(const sp<IBinder>& id, uint32_t w, uint32_t h);
|
||||
status_t setCrop(const sp<IBinder>& id, const Rect& crop);
|
||||
status_t setLayerStack(const sp<IBinder>& id, uint32_t layerStack);
|
||||
status_t destroySurface(const sp<IBinder>& id);
|
||||
|
||||
status_t clearLayerFrameStats(const sp<IBinder>& token) const;
|
||||
status_t getLayerFrameStats(const sp<IBinder>& token, FrameStats* outStats) const;
|
||||
|
||||
static status_t clearAnimationFrameStats();
|
||||
static status_t getAnimationFrameStats(FrameStats* outStats);
|
||||
|
||||
static void setDisplaySurface(const sp<IBinder>& token,
|
||||
const sp<IGraphicBufferProducer>& bufferProducer);
|
||||
static void setDisplayLayerStack(const sp<IBinder>& token,
|
||||
uint32_t layerStack);
|
||||
static void setDisplaySize(const sp<IBinder>& token, uint32_t width, uint32_t height);
|
||||
|
||||
/* setDisplayProjection() defines the projection of layer stacks
|
||||
* to a given display.
|
||||
*
|
||||
* - orientation defines the display's orientation.
|
||||
* - layerStackRect defines which area of the window manager coordinate
|
||||
* space will be used.
|
||||
* - displayRect defines where on the display will layerStackRect be
|
||||
* mapped to. displayRect is specified post-orientation, that is
|
||||
* it uses the orientation seen by the end-user.
|
||||
*/
|
||||
static void setDisplayProjection(const sp<IBinder>& token,
|
||||
uint32_t orientation,
|
||||
const Rect& layerStackRect,
|
||||
const Rect& displayRect);
|
||||
|
||||
status_t setBlur(const sp<IBinder>& id, float blur);
|
||||
status_t setBlurMaskSurface(const sp<IBinder>& id, const sp<IBinder>& maskSurfaceId);
|
||||
status_t setBlurMaskSampling(const sp<IBinder>& id, uint32_t blurMaskSampling);
|
||||
status_t setBlurMaskAlphaThreshold(const sp<IBinder>& id, float alpha);
|
||||
|
||||
private:
|
||||
virtual void onFirstRef();
|
||||
Composer& getComposer();
|
||||
|
||||
mutable Mutex mLock;
|
||||
status_t mStatus;
|
||||
sp<ISurfaceComposerClient> mClient;
|
||||
Composer& mComposer;
|
||||
};
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
class ScreenshotClient
|
||||
{
|
||||
public:
|
||||
// if cropping isn't required, callers may pass in a default Rect, e.g.:
|
||||
// capture(display, producer, Rect(), reqWidth, ...);
|
||||
static status_t capture(
|
||||
const sp<IBinder>& display,
|
||||
const sp<IGraphicBufferProducer>& producer,
|
||||
Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight,
|
||||
uint32_t minLayerZ, uint32_t maxLayerZ,
|
||||
bool useIdentityTransform);
|
||||
|
||||
private:
|
||||
mutable sp<CpuConsumer> mCpuConsumer;
|
||||
mutable sp<IGraphicBufferProducer> mProducer;
|
||||
CpuConsumer::LockedBuffer mBuffer;
|
||||
bool mHaveBuffer;
|
||||
|
||||
public:
|
||||
ScreenshotClient();
|
||||
~ScreenshotClient();
|
||||
|
||||
// frees the previous screenshot and captures a new one
|
||||
// if cropping isn't required, callers may pass in a default Rect, e.g.:
|
||||
// update(display, Rect(), useIdentityTransform);
|
||||
status_t update(const sp<IBinder>& display,
|
||||
Rect sourceCrop, bool useIdentityTransform);
|
||||
status_t update(const sp<IBinder>& display,
|
||||
Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight,
|
||||
bool useIdentityTransform);
|
||||
status_t update(const sp<IBinder>& display,
|
||||
Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight,
|
||||
uint32_t minLayerZ, uint32_t maxLayerZ,
|
||||
bool useIdentityTransform);
|
||||
status_t update(const sp<IBinder>& display,
|
||||
Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight,
|
||||
uint32_t minLayerZ, uint32_t maxLayerZ,
|
||||
bool useIdentityTransform, uint32_t rotation);
|
||||
|
||||
sp<CpuConsumer> getCpuConsumer() const;
|
||||
|
||||
// release memory occupied by the screenshot
|
||||
void release();
|
||||
|
||||
// pixels are valid until this object is freed or
|
||||
// release() or update() is called
|
||||
void const* getPixels() const;
|
||||
|
||||
uint32_t getWidth() const;
|
||||
uint32_t getHeight() const;
|
||||
PixelFormat getFormat() const;
|
||||
uint32_t getStride() const;
|
||||
// size of allocated memory in bytes
|
||||
size_t getSize() const;
|
||||
};
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
}; // namespace android
|
||||
|
||||
#endif // ANDROID_GUI_SURFACE_COMPOSER_CLIENT_H
|
||||
112
third_party/android_frameworks_native/include/gui/SurfaceControl.h
vendored
Normal file
112
third_party/android_frameworks_native/include/gui/SurfaceControl.h
vendored
Normal file
@@ -0,0 +1,112 @@
|
||||
/*
|
||||
* Copyright (C) 2007 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#ifndef ANDROID_GUI_SURFACE_CONTROL_H
|
||||
#define ANDROID_GUI_SURFACE_CONTROL_H
|
||||
|
||||
#include <stdint.h>
|
||||
#include <sys/types.h>
|
||||
|
||||
#include <utils/KeyedVector.h>
|
||||
#include <utils/RefBase.h>
|
||||
#include <utils/threads.h>
|
||||
|
||||
#include <ui/FrameStats.h>
|
||||
#include <ui/PixelFormat.h>
|
||||
#include <ui/Region.h>
|
||||
|
||||
#include <gui/ISurfaceComposerClient.h>
|
||||
|
||||
namespace android {
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
class IGraphicBufferProducer;
|
||||
class Surface;
|
||||
class SurfaceComposerClient;
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
class SurfaceControl : public RefBase
|
||||
{
|
||||
public:
|
||||
static bool isValid(const sp<SurfaceControl>& surface) {
|
||||
return (surface != 0) && surface->isValid();
|
||||
}
|
||||
|
||||
bool isValid() {
|
||||
return mHandle!=0 && mClient!=0;
|
||||
}
|
||||
|
||||
static bool isSameSurface(
|
||||
const sp<SurfaceControl>& lhs, const sp<SurfaceControl>& rhs);
|
||||
|
||||
// release surface data from java
|
||||
void clear();
|
||||
|
||||
status_t setLayerStack(uint32_t layerStack);
|
||||
status_t setLayer(uint32_t layer);
|
||||
status_t setPosition(float x, float y);
|
||||
status_t setSize(uint32_t w, uint32_t h);
|
||||
status_t hide();
|
||||
status_t show();
|
||||
status_t setFlags(uint32_t flags, uint32_t mask);
|
||||
status_t setTransparentRegionHint(const Region& transparent);
|
||||
status_t setAlpha(float alpha=1.0f);
|
||||
status_t setMatrix(float dsdx, float dtdx, float dsdy, float dtdy);
|
||||
status_t setCrop(const Rect& crop);
|
||||
|
||||
static status_t writeSurfaceToParcel(
|
||||
const sp<SurfaceControl>& control, Parcel* parcel);
|
||||
|
||||
sp<Surface> getSurface() const;
|
||||
|
||||
status_t clearLayerFrameStats() const;
|
||||
status_t getLayerFrameStats(FrameStats* outStats) const;
|
||||
|
||||
status_t setBlur(float blur = 0);
|
||||
status_t setBlurMaskSurface(const sp<SurfaceControl>& maskSurface);
|
||||
status_t setBlurMaskSampling(uint32_t blurMaskSampling);
|
||||
status_t setBlurMaskAlphaThreshold(float alpha);
|
||||
|
||||
private:
|
||||
// can't be copied
|
||||
SurfaceControl& operator = (SurfaceControl& rhs);
|
||||
SurfaceControl(const SurfaceControl& rhs);
|
||||
|
||||
friend class SurfaceComposerClient;
|
||||
friend class Surface;
|
||||
|
||||
SurfaceControl(
|
||||
const sp<SurfaceComposerClient>& client,
|
||||
const sp<IBinder>& handle,
|
||||
const sp<IGraphicBufferProducer>& gbp);
|
||||
|
||||
~SurfaceControl();
|
||||
|
||||
status_t validate() const;
|
||||
void destroy();
|
||||
|
||||
sp<SurfaceComposerClient> mClient;
|
||||
sp<IBinder> mHandle;
|
||||
sp<IGraphicBufferProducer> mGraphicBufferProducer;
|
||||
mutable Mutex mLock;
|
||||
mutable sp<Surface> mSurfaceData;
|
||||
};
|
||||
|
||||
}; // namespace android
|
||||
|
||||
#endif // ANDROID_GUI_SURFACE_CONTROL_H
|
||||
Reference in New Issue
Block a user