1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2021 Google Inc. 3*c8dee2aaSAndroid Build Coastguard Worker * 4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be 5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file. 6*c8dee2aaSAndroid Build Coastguard Worker */ 7*c8dee2aaSAndroid Build Coastguard Worker #ifndef JetSki_SurfaceThread_DEFINED 8*c8dee2aaSAndroid Build Coastguard Worker #define JetSki_SurfaceThread_DEFINED 9*c8dee2aaSAndroid Build Coastguard Worker 10*c8dee2aaSAndroid Build Coastguard Worker #include <pthread.h> 11*c8dee2aaSAndroid Build Coastguard Worker #include <unistd.h> 12*c8dee2aaSAndroid Build Coastguard Worker #include <android/looper.h> 13*c8dee2aaSAndroid Build Coastguard Worker #include <android/native_window.h> 14*c8dee2aaSAndroid Build Coastguard Worker 15*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkPictureRecorder.h" 16*c8dee2aaSAndroid Build Coastguard Worker 17*c8dee2aaSAndroid Build Coastguard Worker class WindowSurface; 18*c8dee2aaSAndroid Build Coastguard Worker 19*c8dee2aaSAndroid Build Coastguard Worker #include "modules/jetski/src/Surface.h" 20*c8dee2aaSAndroid Build Coastguard Worker 21*c8dee2aaSAndroid Build Coastguard Worker enum MessageType { 22*c8dee2aaSAndroid Build Coastguard Worker kUndefined, 23*c8dee2aaSAndroid Build Coastguard Worker kInitialize, 24*c8dee2aaSAndroid Build Coastguard Worker kDestroy, 25*c8dee2aaSAndroid Build Coastguard Worker kRenderPicture, 26*c8dee2aaSAndroid Build Coastguard Worker }; 27*c8dee2aaSAndroid Build Coastguard Worker 28*c8dee2aaSAndroid Build Coastguard Worker struct Message { 29*c8dee2aaSAndroid Build Coastguard Worker MessageType fType = kUndefined; 30*c8dee2aaSAndroid Build Coastguard Worker ANativeWindow* fNativeWindow = nullptr; 31*c8dee2aaSAndroid Build Coastguard Worker SkPicture* fPicture = nullptr; 32*c8dee2aaSAndroid Build Coastguard Worker WindowSurface** fWindowSurface = nullptr; 33*c8dee2aaSAndroid Build Coastguard Worker MessageMessage34*c8dee2aaSAndroid Build Coastguard Worker Message() {} MessageMessage35*c8dee2aaSAndroid Build Coastguard Worker Message(MessageType t) : fType(t) {} 36*c8dee2aaSAndroid Build Coastguard Worker }; 37*c8dee2aaSAndroid Build Coastguard Worker 38*c8dee2aaSAndroid Build Coastguard Worker class SurfaceThread { 39*c8dee2aaSAndroid Build Coastguard Worker public: 40*c8dee2aaSAndroid Build Coastguard Worker SurfaceThread(); 41*c8dee2aaSAndroid Build Coastguard Worker 42*c8dee2aaSAndroid Build Coastguard Worker void postMessage(const Message& message) const; 43*c8dee2aaSAndroid Build Coastguard Worker void readMessage(Message* message) const; 44*c8dee2aaSAndroid Build Coastguard Worker void release(); 45*c8dee2aaSAndroid Build Coastguard Worker private: 46*c8dee2aaSAndroid Build Coastguard Worker static void* pthread_main(void* arg); 47*c8dee2aaSAndroid Build Coastguard Worker static int message_callback(int fd, int events, void* data); 48*c8dee2aaSAndroid Build Coastguard Worker // TODO: This has to be static, which is weird now, but fine in a singleton 49*c8dee2aaSAndroid Build Coastguard Worker // Switch to singleton design or find other way to break out of thread loop 50*c8dee2aaSAndroid Build Coastguard Worker bool fRunning; 51*c8dee2aaSAndroid Build Coastguard Worker 52*c8dee2aaSAndroid Build Coastguard Worker pthread_t fThread; 53*c8dee2aaSAndroid Build Coastguard Worker int fPipe[2]; // acts as a Message queue, read from [0] write to [1] 54*c8dee2aaSAndroid Build Coastguard Worker }; 55*c8dee2aaSAndroid Build Coastguard Worker 56*c8dee2aaSAndroid Build Coastguard Worker #endif 57