blob: eee0a0ac3512a86f3ba4087947e6aa61a329b1ff [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>
Stan Iliev902ce2a2019-03-07 18:13:55 -050028#include <GrBackendSurface.h>
29
30namespace GrAHardwareBufferUtils {
31typedef void* DeleteImageCtx;
32typedef void (*DeleteImageProc)(DeleteImageCtx);
33}
Stan Iliev564ca3e2018-09-04 22:00:00 +000034
35namespace android {
36
37namespace uirenderer {
38class RenderState;
39}
40
41class SurfaceTexture;
42
43/*
44 * ImageConsumer implements the parts of SurfaceTexture that deal with
45 * images consumed by HWUI view system.
46 */
47class ImageConsumer {
48public:
49 sk_sp<SkImage> dequeueImage(bool* queueEmpty, SurfaceTexture& cb,
50 uirenderer::RenderState& renderState);
51
52 /**
53 * onAcquireBufferLocked amends the ConsumerBase method to update the
54 * mImageSlots array in addition to the ConsumerBase behavior.
55 */
56 void onAcquireBufferLocked(BufferItem* item);
57
58 /**
59 * onReleaseBufferLocked amends the ConsumerBase method to update the
60 * mImageSlots array in addition to the ConsumerBase.
61 */
62 void onReleaseBufferLocked(int slot);
63
64 /**
65 * onFreeBufferLocked frees up the given buffer slot. If the slot has been
66 * initialized this will release the reference to the GraphicBuffer in that
67 * slot and destroy the SkImage in that slot. Otherwise it has no effect.
68 */
69 void onFreeBufferLocked(int slotIndex);
70
71private:
72 /**
73 * ImageSlot contains the information and object references that
74 * ImageConsumer maintains about a BufferQueue buffer slot.
75 */
Stan Iliev902ce2a2019-03-07 18:13:55 -050076 class ImageSlot {
77 public:
Derek Sollenbergerd01b5912018-10-19 15:55:33 -040078 ImageSlot() : mDataspace(HAL_DATASPACE_UNKNOWN), mEglFence(EGL_NO_SYNC_KHR) {}
Stan Iliev564ca3e2018-09-04 22:00:00 +000079
Stan Iliev902ce2a2019-03-07 18:13:55 -050080 ~ImageSlot() { clear(); }
81
82 void createIfNeeded(sp<GraphicBuffer> graphicBuffer, android_dataspace dataspace,
83 bool forceCreate, GrContext* context);
84 void clear();
85
86 inline EGLSyncKHR& eglFence() { return mEglFence; }
87
88 inline sk_sp<SkImage> getImage() { return mImage; }
89
90 private:
Stan Iliev564ca3e2018-09-04 22:00:00 +000091 // mImage is the SkImage created from mGraphicBuffer.
92 sk_sp<SkImage> mImage;
93
Derek Sollenbergerd01b5912018-10-19 15:55:33 -040094 // the dataspace associated with the current image
95 android_dataspace mDataspace;
96
Stan Iliev564ca3e2018-09-04 22:00:00 +000097 /**
98 * mEglFence is the EGL sync object that must signal before the buffer
99 * associated with this buffer slot may be dequeued.
100 */
101 EGLSyncKHR mEglFence;
102
Stan Iliev902ce2a2019-03-07 18:13:55 -0500103 GrBackendTexture mBackendTexture;
104
105 GrAHardwareBufferUtils::DeleteImageProc mDeleteProc;
106
107 GrAHardwareBufferUtils::DeleteImageCtx mDeleteCtx;
Stan Iliev564ca3e2018-09-04 22:00:00 +0000108 };
109
110 /**
111 * ImageConsumer stores the SkImages that have been allocated by the BufferQueue
112 * for each buffer slot. It is initialized to null pointers, and gets
113 * filled in with the result of BufferQueue::acquire when the
114 * client dequeues a buffer from a
115 * slot that has not yet been used. The buffer allocated to a slot will also
116 * be replaced if the requested buffer usage or geometry differs from that
117 * of the buffer allocated to a slot.
118 */
119 ImageSlot mImageSlots[BufferQueueDefs::NUM_BUFFER_SLOTS];
120};
121
Chris Blume7b8a8082018-11-30 15:51:58 -0800122} /* namespace android */