diff options
Diffstat (limited to 'include/DrmFramebuffer.h')
-rw-r--r-- | include/DrmFramebuffer.h | 105 |
1 files changed, 105 insertions, 0 deletions
diff --git a/include/DrmFramebuffer.h b/include/DrmFramebuffer.h new file mode 100644 index 0000000..33ca0db --- /dev/null +++ b/include/DrmFramebuffer.h @@ -0,0 +1,105 @@ +/* + * Copyright (C) 2015 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_DRM_FRAMEBUFFER_ +#define ANDROID_DRM_FRAMEBUFFER_ + +#include <stdint.h> +#include <sync/sync.h> +#include <ui/GraphicBuffer.h> + +namespace android { + +struct DrmFramebuffer { + DrmFramebuffer() : release_fence_fd_(-1) { + } + + ~DrmFramebuffer() { + if (release_fence_fd() >= 0) + close(release_fence_fd()); + } + + bool is_valid() { + return buffer_ != NULL; + } + + sp<GraphicBuffer> buffer() { + return buffer_; + } + + int release_fence_fd() { + return release_fence_fd_; + } + + void set_release_fence_fd(int fd) { + if (release_fence_fd_ >= 0) + close(release_fence_fd_); + release_fence_fd_ = fd; + } + + bool Allocate(uint32_t w, uint32_t h) { + if (is_valid()) { + if (buffer_->getWidth() == w && buffer_->getHeight() == h) + return true; + + if (release_fence_fd_ >= 0) { + if (sync_wait(release_fence_fd_, kReleaseWaitTimeoutMs) != 0) { + ALOGE("Wait for release fence failed\n"); + return false; + } + } + Clear(); + } + buffer_ = new GraphicBuffer(w, h, PIXEL_FORMAT_RGB_888, + GRALLOC_USAGE_HW_FB | GRALLOC_USAGE_HW_RENDER | + GRALLOC_USAGE_HW_COMPOSER); + release_fence_fd_ = -1; + return is_valid(); + } + + void Clear() { + if (!is_valid()) + return; + + if (release_fence_fd_ >= 0) { + close(release_fence_fd_); + release_fence_fd_ = -1; + } + + buffer_.clear(); + } + + int WaitReleased(int timeout_milliseconds) { + if (!is_valid()) + return 0; + if (release_fence_fd_ < 0) + return 0; + + int ret = sync_wait(release_fence_fd_, timeout_milliseconds); + return ret; + } + + // Somewhat arbitrarily chosen, but wanted to stay below 3000ms, which is the + // system timeout + static const int kReleaseWaitTimeoutMs = 1500; + + private: + sp<GraphicBuffer> buffer_; + int release_fence_fd_; +}; +} // namespace android + +#endif // ANDROID_DRM_FRAMEBUFFER_ |