blob: 5c4190397bc47459c7933bf560385b0808dfa037 [file] [log] [blame]
Stan Iliev564ca3e2018-09-04 22:00:00 +00001/*
2 * Copyright (C) 2018 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#pragma once
18
19#include <EGL/egl.h>
20#include <EGL/eglext.h>
21
22#include <gui/BufferQueueDefs.h>
23
24#include <SkImage.h>
25#include <cutils/compiler.h>
26#include <gui/BufferItem.h>
27#include <system/graphics.h>
28
29namespace android {
30
31namespace uirenderer {
32class RenderState;
33}
34
35class SurfaceTexture;
36
37/*
38 * ImageConsumer implements the parts of SurfaceTexture that deal with
39 * images consumed by HWUI view system.
40 */
41class ImageConsumer {
42public:
43 sk_sp<SkImage> dequeueImage(bool* queueEmpty, SurfaceTexture& cb,
44 uirenderer::RenderState& renderState);
45
46 /**
47 * onAcquireBufferLocked amends the ConsumerBase method to update the
48 * mImageSlots array in addition to the ConsumerBase behavior.
49 */
50 void onAcquireBufferLocked(BufferItem* item);
51
52 /**
53 * onReleaseBufferLocked amends the ConsumerBase method to update the
54 * mImageSlots array in addition to the ConsumerBase.
55 */
56 void onReleaseBufferLocked(int slot);
57
58 /**
59 * onFreeBufferLocked frees up the given buffer slot. If the slot has been
60 * initialized this will release the reference to the GraphicBuffer in that
61 * slot and destroy the SkImage in that slot. Otherwise it has no effect.
62 */
63 void onFreeBufferLocked(int slotIndex);
64
65private:
66 /**
67 * ImageSlot contains the information and object references that
68 * ImageConsumer maintains about a BufferQueue buffer slot.
69 */
70 struct ImageSlot {
Derek Sollenbergerd01b5912018-10-19 15:55:33 -040071 ImageSlot() : mDataspace(HAL_DATASPACE_UNKNOWN), mEglFence(EGL_NO_SYNC_KHR) {}
Stan Iliev564ca3e2018-09-04 22:00:00 +000072
73 // mImage is the SkImage created from mGraphicBuffer.
74 sk_sp<SkImage> mImage;
75
Derek Sollenbergerd01b5912018-10-19 15:55:33 -040076 // the dataspace associated with the current image
77 android_dataspace mDataspace;
78
Stan Iliev564ca3e2018-09-04 22:00:00 +000079 /**
80 * mEglFence is the EGL sync object that must signal before the buffer
81 * associated with this buffer slot may be dequeued.
82 */
83 EGLSyncKHR mEglFence;
84
Stan Iliev26679ce2019-01-30 14:04:53 -050085 void createIfNeeded(sp<GraphicBuffer> graphicBuffer, android_dataspace dataspace,
86 bool forceCreate);
Stan Iliev564ca3e2018-09-04 22:00:00 +000087 };
88
89 /**
90 * ImageConsumer stores the SkImages that have been allocated by the BufferQueue
91 * for each buffer slot. It is initialized to null pointers, and gets
92 * filled in with the result of BufferQueue::acquire when the
93 * client dequeues a buffer from a
94 * slot that has not yet been used. The buffer allocated to a slot will also
95 * be replaced if the requested buffer usage or geometry differs from that
96 * of the buffer allocated to a slot.
97 */
98 ImageSlot mImageSlots[BufferQueueDefs::NUM_BUFFER_SLOTS];
99};
100
Chris Blume7b8a8082018-11-30 15:51:58 -0800101} /* namespace android */