1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker * Copyright 2024 Google LLC
3*61046927SAndroid Build Coastguard Worker * SPDX-License-Identifier: MIT
4*61046927SAndroid Build Coastguard Worker */
5*61046927SAndroid Build Coastguard Worker
6*61046927SAndroid Build Coastguard Worker #include "ANativeWindowEmulated.h"
7*61046927SAndroid Build Coastguard Worker
8*61046927SAndroid Build Coastguard Worker #include "util/log.h"
9*61046927SAndroid Build Coastguard Worker
10*61046927SAndroid Build Coastguard Worker namespace gfxstream {
11*61046927SAndroid Build Coastguard Worker
EmulatedANativeWindow(uint32_t width,uint32_t height,uint32_t format,std::vector<std::unique_ptr<EmulatedAHardwareBuffer>> buffers)12*61046927SAndroid Build Coastguard Worker EmulatedANativeWindow::EmulatedANativeWindow(
13*61046927SAndroid Build Coastguard Worker uint32_t width, uint32_t height, uint32_t format,
14*61046927SAndroid Build Coastguard Worker std::vector<std::unique_ptr<EmulatedAHardwareBuffer>> buffers)
15*61046927SAndroid Build Coastguard Worker : mRefCount(1), mWidth(width), mHeight(height), mFormat(format), mBuffers(std::move(buffers)) {
16*61046927SAndroid Build Coastguard Worker for (auto& buffer : mBuffers) {
17*61046927SAndroid Build Coastguard Worker mBufferQueue.push_back(QueuedAHB{
18*61046927SAndroid Build Coastguard Worker .ahb = buffer.get(),
19*61046927SAndroid Build Coastguard Worker .fence = -1,
20*61046927SAndroid Build Coastguard Worker });
21*61046927SAndroid Build Coastguard Worker }
22*61046927SAndroid Build Coastguard Worker }
23*61046927SAndroid Build Coastguard Worker
asEglNativeWindowType()24*61046927SAndroid Build Coastguard Worker EGLNativeWindowType EmulatedANativeWindow::asEglNativeWindowType() {
25*61046927SAndroid Build Coastguard Worker return reinterpret_cast<EGLNativeWindowType>(this);
26*61046927SAndroid Build Coastguard Worker }
27*61046927SAndroid Build Coastguard Worker
getWidth() const28*61046927SAndroid Build Coastguard Worker uint32_t EmulatedANativeWindow::getWidth() const { return mWidth; }
29*61046927SAndroid Build Coastguard Worker
getHeight() const30*61046927SAndroid Build Coastguard Worker uint32_t EmulatedANativeWindow::getHeight() const { return mHeight; }
31*61046927SAndroid Build Coastguard Worker
getFormat() const32*61046927SAndroid Build Coastguard Worker int EmulatedANativeWindow::getFormat() const { return mFormat; }
33*61046927SAndroid Build Coastguard Worker
queueBuffer(EGLClientBuffer buffer,int fence)34*61046927SAndroid Build Coastguard Worker int EmulatedANativeWindow::queueBuffer(EGLClientBuffer buffer, int fence) {
35*61046927SAndroid Build Coastguard Worker auto ahb = reinterpret_cast<EmulatedAHardwareBuffer*>(buffer);
36*61046927SAndroid Build Coastguard Worker
37*61046927SAndroid Build Coastguard Worker mBufferQueue.push_back(QueuedAHB{
38*61046927SAndroid Build Coastguard Worker .ahb = ahb,
39*61046927SAndroid Build Coastguard Worker .fence = fence,
40*61046927SAndroid Build Coastguard Worker });
41*61046927SAndroid Build Coastguard Worker
42*61046927SAndroid Build Coastguard Worker return 0;
43*61046927SAndroid Build Coastguard Worker }
44*61046927SAndroid Build Coastguard Worker
dequeueBuffer(EGLClientBuffer * buffer,int * fence)45*61046927SAndroid Build Coastguard Worker int EmulatedANativeWindow::dequeueBuffer(EGLClientBuffer* buffer, int* fence) {
46*61046927SAndroid Build Coastguard Worker auto queuedAhb = mBufferQueue.front();
47*61046927SAndroid Build Coastguard Worker mBufferQueue.pop_front();
48*61046927SAndroid Build Coastguard Worker
49*61046927SAndroid Build Coastguard Worker *buffer = queuedAhb.ahb->asEglClientBuffer();
50*61046927SAndroid Build Coastguard Worker *fence = queuedAhb.fence;
51*61046927SAndroid Build Coastguard Worker return 0;
52*61046927SAndroid Build Coastguard Worker }
53*61046927SAndroid Build Coastguard Worker
cancelBuffer(EGLClientBuffer buffer)54*61046927SAndroid Build Coastguard Worker int EmulatedANativeWindow::cancelBuffer(EGLClientBuffer buffer) {
55*61046927SAndroid Build Coastguard Worker auto ahb = reinterpret_cast<EmulatedAHardwareBuffer*>(buffer);
56*61046927SAndroid Build Coastguard Worker
57*61046927SAndroid Build Coastguard Worker mBufferQueue.push_back(QueuedAHB{
58*61046927SAndroid Build Coastguard Worker .ahb = ahb,
59*61046927SAndroid Build Coastguard Worker .fence = -1,
60*61046927SAndroid Build Coastguard Worker });
61*61046927SAndroid Build Coastguard Worker
62*61046927SAndroid Build Coastguard Worker return 0;
63*61046927SAndroid Build Coastguard Worker }
64*61046927SAndroid Build Coastguard Worker
acquire()65*61046927SAndroid Build Coastguard Worker void EmulatedANativeWindow::acquire() { ++mRefCount; }
66*61046927SAndroid Build Coastguard Worker
release()67*61046927SAndroid Build Coastguard Worker void EmulatedANativeWindow::release() {
68*61046927SAndroid Build Coastguard Worker --mRefCount;
69*61046927SAndroid Build Coastguard Worker if (mRefCount == 0) {
70*61046927SAndroid Build Coastguard Worker delete this;
71*61046927SAndroid Build Coastguard Worker }
72*61046927SAndroid Build Coastguard Worker }
73*61046927SAndroid Build Coastguard Worker
isValid(EGLNativeWindowType window)74*61046927SAndroid Build Coastguard Worker bool EmulatedANativeWindowHelper::isValid(EGLNativeWindowType window) {
75*61046927SAndroid Build Coastguard Worker // TODO: maybe a registry of valid EmulatedANativeWindow-s?
76*61046927SAndroid Build Coastguard Worker (void)window;
77*61046927SAndroid Build Coastguard Worker return true;
78*61046927SAndroid Build Coastguard Worker }
79*61046927SAndroid Build Coastguard Worker
isValid(EGLClientBuffer buffer)80*61046927SAndroid Build Coastguard Worker bool EmulatedANativeWindowHelper::isValid(EGLClientBuffer buffer) {
81*61046927SAndroid Build Coastguard Worker // TODO: maybe a registry of valid EmulatedAHardwareBuffer-s?
82*61046927SAndroid Build Coastguard Worker (void)buffer;
83*61046927SAndroid Build Coastguard Worker return true;
84*61046927SAndroid Build Coastguard Worker }
85*61046927SAndroid Build Coastguard Worker
acquire(EGLNativeWindowType window)86*61046927SAndroid Build Coastguard Worker void EmulatedANativeWindowHelper::acquire(EGLNativeWindowType window) {
87*61046927SAndroid Build Coastguard Worker auto* anw = reinterpret_cast<EmulatedANativeWindow*>(window);
88*61046927SAndroid Build Coastguard Worker anw->acquire();
89*61046927SAndroid Build Coastguard Worker }
90*61046927SAndroid Build Coastguard Worker
release(EGLNativeWindowType window)91*61046927SAndroid Build Coastguard Worker void EmulatedANativeWindowHelper::release(EGLNativeWindowType window) {
92*61046927SAndroid Build Coastguard Worker auto* anw = reinterpret_cast<EmulatedANativeWindow*>(window);
93*61046927SAndroid Build Coastguard Worker anw->release();
94*61046927SAndroid Build Coastguard Worker }
95*61046927SAndroid Build Coastguard Worker
acquire(EGLClientBuffer buffer)96*61046927SAndroid Build Coastguard Worker void EmulatedANativeWindowHelper::acquire(EGLClientBuffer buffer) {
97*61046927SAndroid Build Coastguard Worker // TODO: maybe a registry of valid EmulatedAHardwareBuffer-s?
98*61046927SAndroid Build Coastguard Worker (void)buffer;
99*61046927SAndroid Build Coastguard Worker }
100*61046927SAndroid Build Coastguard Worker
release(EGLClientBuffer buffer)101*61046927SAndroid Build Coastguard Worker void EmulatedANativeWindowHelper::release(EGLClientBuffer buffer) { (void)buffer; }
102*61046927SAndroid Build Coastguard Worker
getConsumerUsage(EGLNativeWindowType window,int * usage)103*61046927SAndroid Build Coastguard Worker int EmulatedANativeWindowHelper::getConsumerUsage(EGLNativeWindowType window, int* usage) {
104*61046927SAndroid Build Coastguard Worker (void)window;
105*61046927SAndroid Build Coastguard Worker (void)usage;
106*61046927SAndroid Build Coastguard Worker return 0;
107*61046927SAndroid Build Coastguard Worker }
setUsage(EGLNativeWindowType window,int usage)108*61046927SAndroid Build Coastguard Worker void EmulatedANativeWindowHelper::setUsage(EGLNativeWindowType window, int usage) {
109*61046927SAndroid Build Coastguard Worker (void)window;
110*61046927SAndroid Build Coastguard Worker (void)usage;
111*61046927SAndroid Build Coastguard Worker }
112*61046927SAndroid Build Coastguard Worker
getWidth(EGLNativeWindowType window)113*61046927SAndroid Build Coastguard Worker int EmulatedANativeWindowHelper::getWidth(EGLNativeWindowType window) {
114*61046927SAndroid Build Coastguard Worker auto anw = reinterpret_cast<EmulatedANativeWindow*>(window);
115*61046927SAndroid Build Coastguard Worker return anw->getWidth();
116*61046927SAndroid Build Coastguard Worker }
117*61046927SAndroid Build Coastguard Worker
getHeight(EGLNativeWindowType window)118*61046927SAndroid Build Coastguard Worker int EmulatedANativeWindowHelper::getHeight(EGLNativeWindowType window) {
119*61046927SAndroid Build Coastguard Worker auto anw = reinterpret_cast<EmulatedANativeWindow*>(window);
120*61046927SAndroid Build Coastguard Worker return anw->getHeight();
121*61046927SAndroid Build Coastguard Worker }
122*61046927SAndroid Build Coastguard Worker
getWidth(EGLClientBuffer buffer)123*61046927SAndroid Build Coastguard Worker int EmulatedANativeWindowHelper::getWidth(EGLClientBuffer buffer) {
124*61046927SAndroid Build Coastguard Worker auto ahb = reinterpret_cast<EmulatedAHardwareBuffer*>(buffer);
125*61046927SAndroid Build Coastguard Worker return ahb->getWidth();
126*61046927SAndroid Build Coastguard Worker }
127*61046927SAndroid Build Coastguard Worker
getHeight(EGLClientBuffer buffer)128*61046927SAndroid Build Coastguard Worker int EmulatedANativeWindowHelper::getHeight(EGLClientBuffer buffer) {
129*61046927SAndroid Build Coastguard Worker auto ahb = reinterpret_cast<EmulatedAHardwareBuffer*>(buffer);
130*61046927SAndroid Build Coastguard Worker return ahb->getHeight();
131*61046927SAndroid Build Coastguard Worker }
132*61046927SAndroid Build Coastguard Worker
getFormat(EGLClientBuffer buffer,Gralloc * helper)133*61046927SAndroid Build Coastguard Worker int EmulatedANativeWindowHelper::getFormat(EGLClientBuffer buffer, Gralloc* helper) {
134*61046927SAndroid Build Coastguard Worker (void)helper;
135*61046927SAndroid Build Coastguard Worker
136*61046927SAndroid Build Coastguard Worker auto ahb = reinterpret_cast<EmulatedAHardwareBuffer*>(buffer);
137*61046927SAndroid Build Coastguard Worker return ahb->getAndroidFormat();
138*61046927SAndroid Build Coastguard Worker }
139*61046927SAndroid Build Coastguard Worker
setSwapInterval(EGLNativeWindowType window,int interval)140*61046927SAndroid Build Coastguard Worker void EmulatedANativeWindowHelper::setSwapInterval(EGLNativeWindowType window, int interval) {
141*61046927SAndroid Build Coastguard Worker mesa_loge("Unimplemented");
142*61046927SAndroid Build Coastguard Worker (void)window;
143*61046927SAndroid Build Coastguard Worker (void)interval;
144*61046927SAndroid Build Coastguard Worker }
145*61046927SAndroid Build Coastguard Worker
queueBuffer(EGLNativeWindowType window,EGLClientBuffer buffer,int fence)146*61046927SAndroid Build Coastguard Worker int EmulatedANativeWindowHelper::queueBuffer(EGLNativeWindowType window, EGLClientBuffer buffer,
147*61046927SAndroid Build Coastguard Worker int fence) {
148*61046927SAndroid Build Coastguard Worker auto anw = reinterpret_cast<EmulatedANativeWindow*>(window);
149*61046927SAndroid Build Coastguard Worker return anw->queueBuffer(buffer, fence);
150*61046927SAndroid Build Coastguard Worker }
151*61046927SAndroid Build Coastguard Worker
dequeueBuffer(EGLNativeWindowType window,EGLClientBuffer * buffer,int * fence)152*61046927SAndroid Build Coastguard Worker int EmulatedANativeWindowHelper::dequeueBuffer(EGLNativeWindowType window, EGLClientBuffer* buffer,
153*61046927SAndroid Build Coastguard Worker int* fence) {
154*61046927SAndroid Build Coastguard Worker auto anw = reinterpret_cast<EmulatedANativeWindow*>(window);
155*61046927SAndroid Build Coastguard Worker return anw->dequeueBuffer(buffer, fence);
156*61046927SAndroid Build Coastguard Worker }
157*61046927SAndroid Build Coastguard Worker
cancelBuffer(EGLNativeWindowType window,EGLClientBuffer buffer)158*61046927SAndroid Build Coastguard Worker int EmulatedANativeWindowHelper::cancelBuffer(EGLNativeWindowType window, EGLClientBuffer buffer) {
159*61046927SAndroid Build Coastguard Worker auto anw = reinterpret_cast<EmulatedANativeWindow*>(window);
160*61046927SAndroid Build Coastguard Worker return anw->cancelBuffer(buffer);
161*61046927SAndroid Build Coastguard Worker }
162*61046927SAndroid Build Coastguard Worker
getHostHandle(EGLClientBuffer buffer,Gralloc *)163*61046927SAndroid Build Coastguard Worker int EmulatedANativeWindowHelper::getHostHandle(EGLClientBuffer buffer, Gralloc*) {
164*61046927SAndroid Build Coastguard Worker auto ahb = reinterpret_cast<EmulatedAHardwareBuffer*>(buffer);
165*61046927SAndroid Build Coastguard Worker return ahb->getResourceId();
166*61046927SAndroid Build Coastguard Worker }
167*61046927SAndroid Build Coastguard Worker
createNativeWindowForTesting(Gralloc * gralloc,uint32_t width,uint32_t height)168*61046927SAndroid Build Coastguard Worker EGLNativeWindowType EmulatedANativeWindowHelper::createNativeWindowForTesting(Gralloc* gralloc,
169*61046927SAndroid Build Coastguard Worker uint32_t width,
170*61046927SAndroid Build Coastguard Worker uint32_t height) {
171*61046927SAndroid Build Coastguard Worker std::vector<std::unique_ptr<EmulatedAHardwareBuffer>> buffers;
172*61046927SAndroid Build Coastguard Worker for (int i = 0; i < 3; i++) {
173*61046927SAndroid Build Coastguard Worker AHardwareBuffer* ahb = nullptr;
174*61046927SAndroid Build Coastguard Worker if (gralloc->allocate(width, height, GFXSTREAM_AHB_FORMAT_R8G8B8A8_UNORM, -1, &ahb) != 0) {
175*61046927SAndroid Build Coastguard Worker mesa_loge("Failed to allocate gralloc buffer.");
176*61046927SAndroid Build Coastguard Worker return nullptr;
177*61046927SAndroid Build Coastguard Worker }
178*61046927SAndroid Build Coastguard Worker buffers.emplace_back(reinterpret_cast<EmulatedAHardwareBuffer*>(ahb));
179*61046927SAndroid Build Coastguard Worker }
180*61046927SAndroid Build Coastguard Worker return reinterpret_cast<EGLNativeWindowType>(
181*61046927SAndroid Build Coastguard Worker new EmulatedANativeWindow(width, height, GFXSTREAM_AHB_FORMAT_R8G8B8A8_UNORM, std::move(buffers)));
182*61046927SAndroid Build Coastguard Worker }
183*61046927SAndroid Build Coastguard Worker
createPlatformANativeWindowHelper()184*61046927SAndroid Build Coastguard Worker ANativeWindowHelper* createPlatformANativeWindowHelper() {
185*61046927SAndroid Build Coastguard Worker return new EmulatedANativeWindowHelper();
186*61046927SAndroid Build Coastguard Worker }
187*61046927SAndroid Build Coastguard Worker
188*61046927SAndroid Build Coastguard Worker } // namespace gfxstream
189