Fence.h revision f25e183a70bd631f75dce51e85b7d568472a0cdb
1f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis/* 2f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis * Copyright (C) 2012 The Android Open Source Project 3f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis * 4f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis * Licensed under the Apache License, Version 2.0 (the "License"); 5f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis * you may not use this file except in compliance with the License. 6f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis * You may obtain a copy of the License at 7f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis * 8f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis * http://www.apache.org/licenses/LICENSE-2.0 9f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis * 10f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis * Unless required by applicable law or agreed to in writing, software 11f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis * distributed under the License is distributed on an "AS IS" BASIS, 12f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis * See the License for the specific language governing permissions and 14f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis * limitations under the License. 15f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis */ 16f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis 17f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis#ifndef ANDROID_FENCE_H 18f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis#define ANDROID_FENCE_H 19f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis 20f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis#include <stdint.h> 21f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis#include <limits.h> 22f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis#include <sys/types.h> 23f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis 24f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis#include <ui/ANativeObjectBase.h> 25f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis#include <ui/PixelFormat.h> 26f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis#include <ui/Rect.h> 27f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis#include <utils/Flattenable.h> 28f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis#include <utils/String8.h> 29f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis 30f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennisstruct ANativeWindowBuffer; 31f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis 32f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennisnamespace android { 33f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis 34f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis// =========================================================================== 35f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis// Fence 36f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis// =========================================================================== 37f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis 38f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennisclass Fence 39f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis : public LightRefBase<Fence>, public Flattenable 40f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis{ 41f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennispublic: 42f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis 43f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis // Construct a new Fence object with an invalid file descriptor. This 44f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis // should be done when the Fence object will be set up by unflattening 45f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis // serialized data. 46f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis Fence(); 47f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis 48f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis // Construct a new Fence object to manage a given fence file descriptor. 49f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis // When the new Fence object is destructed the file descriptor will be 50f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis // closed. 51f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis Fence(int fenceFd); 52f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis 53f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis // wait waits for up to timeout milliseconds for the fence to signal. If 54f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis // the fence signals then NO_ERROR is returned. If the timeout expires 55f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis // before the fence signals then -ETIME is returned. A timeout of 56f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis // TIMEOUT_NEVER may be used to indicate that the call should wait 57f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis // indefinitely for the fence to signal. 58f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis int wait(unsigned int timeout); 59f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis 60f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis // TIMEOUT_NEVER may be passed to the wait method to indicate that it 61f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis // should wait indefinitely for the fence to signal. 62f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis enum { TIMEOUT_NEVER = UINT_MAX }; 63f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis 64f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis // merge combines two Fence objects, creating a new Fence object that 65f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis // becomes signaled when both f1 and f2 are signaled (even if f1 or f2 is 66f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis // destroyed before it becomes signaled). The name argument specifies the 67f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis // human-readable name to associated with the new Fence object. 68f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis static sp<Fence> merge(const String8& name, const sp<Fence>& f1, 69f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis const sp<Fence>& f2); 70f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis 71f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis // Flattenable interface 72f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis size_t getFlattenedSize() const; 73f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis size_t getFdCount() const; 74f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis status_t flatten(void* buffer, size_t size, 75f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis int fds[], size_t count) const; 76f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis status_t unflatten(void const* buffer, size_t size, 77f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis int fds[], size_t count); 78f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis 79f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennisprivate: 80f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis // Only allow instantiation using ref counting. 81f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis friend class LightRefBase<Fence>; 82f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis virtual ~Fence(); 83f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis 84f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis // Disallow copying 85f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis Fence(const Fence& rhs); 86f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis Fence& operator = (const Fence& rhs); 87f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis const Fence& operator = (const Fence& rhs) const; 88f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis 89f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis int mFenceFd; 90f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis}; 91f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis 92f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis}; // namespace android 93f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis 94f25e183a70bd631f75dce51e85b7d568472a0cdbJamie Gennis#endif // ANDROID_FENCE_H 95