1*8975f5c5SAndroid Build Coastguard Worker // 2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2016 The ANGLE Project Authors. All rights reserved. 3*8975f5c5SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 4*8975f5c5SAndroid Build Coastguard Worker // found in the LICENSE file. 5*8975f5c5SAndroid Build Coastguard Worker // 6*8975f5c5SAndroid Build Coastguard Worker 7*8975f5c5SAndroid Build Coastguard Worker // Stream.h: Defines the egl::Stream class, representing the stream 8*8975f5c5SAndroid Build Coastguard Worker // where frames are streamed in. Implements EGLStreanKHR. 9*8975f5c5SAndroid Build Coastguard Worker 10*8975f5c5SAndroid Build Coastguard Worker #ifndef LIBANGLE_STREAM_H_ 11*8975f5c5SAndroid Build Coastguard Worker #define LIBANGLE_STREAM_H_ 12*8975f5c5SAndroid Build Coastguard Worker 13*8975f5c5SAndroid Build Coastguard Worker #include <array> 14*8975f5c5SAndroid Build Coastguard Worker 15*8975f5c5SAndroid Build Coastguard Worker #include <EGL/egl.h> 16*8975f5c5SAndroid Build Coastguard Worker #include <EGL/eglext.h> 17*8975f5c5SAndroid Build Coastguard Worker 18*8975f5c5SAndroid Build Coastguard Worker #include "common/angleutils.h" 19*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/AttributeMap.h" 20*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/Debug.h" 21*8975f5c5SAndroid Build Coastguard Worker 22*8975f5c5SAndroid Build Coastguard Worker namespace rx 23*8975f5c5SAndroid Build Coastguard Worker { 24*8975f5c5SAndroid Build Coastguard Worker class StreamProducerImpl; 25*8975f5c5SAndroid Build Coastguard Worker } 26*8975f5c5SAndroid Build Coastguard Worker 27*8975f5c5SAndroid Build Coastguard Worker namespace gl 28*8975f5c5SAndroid Build Coastguard Worker { 29*8975f5c5SAndroid Build Coastguard Worker class Context; 30*8975f5c5SAndroid Build Coastguard Worker class Texture; 31*8975f5c5SAndroid Build Coastguard Worker } // namespace gl 32*8975f5c5SAndroid Build Coastguard Worker 33*8975f5c5SAndroid Build Coastguard Worker namespace egl 34*8975f5c5SAndroid Build Coastguard Worker { 35*8975f5c5SAndroid Build Coastguard Worker class Display; 36*8975f5c5SAndroid Build Coastguard Worker class Error; 37*8975f5c5SAndroid Build Coastguard Worker class Thread; 38*8975f5c5SAndroid Build Coastguard Worker 39*8975f5c5SAndroid Build Coastguard Worker class Stream final : public LabeledObject, angle::NonCopyable 40*8975f5c5SAndroid Build Coastguard Worker { 41*8975f5c5SAndroid Build Coastguard Worker public: 42*8975f5c5SAndroid Build Coastguard Worker Stream(Display *display, const AttributeMap &attribs); 43*8975f5c5SAndroid Build Coastguard Worker ~Stream() override; 44*8975f5c5SAndroid Build Coastguard Worker 45*8975f5c5SAndroid Build Coastguard Worker void setLabel(EGLLabelKHR label) override; 46*8975f5c5SAndroid Build Coastguard Worker EGLLabelKHR getLabel() const override; 47*8975f5c5SAndroid Build Coastguard Worker 48*8975f5c5SAndroid Build Coastguard Worker enum class ConsumerType 49*8975f5c5SAndroid Build Coastguard Worker { 50*8975f5c5SAndroid Build Coastguard Worker NoConsumer, 51*8975f5c5SAndroid Build Coastguard Worker GLTextureRGB, 52*8975f5c5SAndroid Build Coastguard Worker GLTextureYUV, 53*8975f5c5SAndroid Build Coastguard Worker }; 54*8975f5c5SAndroid Build Coastguard Worker 55*8975f5c5SAndroid Build Coastguard Worker enum class ProducerType 56*8975f5c5SAndroid Build Coastguard Worker { 57*8975f5c5SAndroid Build Coastguard Worker NoProducer, 58*8975f5c5SAndroid Build Coastguard Worker D3D11Texture, 59*8975f5c5SAndroid Build Coastguard Worker }; 60*8975f5c5SAndroid Build Coastguard Worker 61*8975f5c5SAndroid Build Coastguard Worker // A GL texture interpretation of a part of a producer frame. For use with GL texture consumers 62*8975f5c5SAndroid Build Coastguard Worker struct GLTextureDescription 63*8975f5c5SAndroid Build Coastguard Worker { 64*8975f5c5SAndroid Build Coastguard Worker unsigned int width; 65*8975f5c5SAndroid Build Coastguard Worker unsigned int height; 66*8975f5c5SAndroid Build Coastguard Worker unsigned int internalFormat; 67*8975f5c5SAndroid Build Coastguard Worker unsigned int mipLevels; 68*8975f5c5SAndroid Build Coastguard Worker }; 69*8975f5c5SAndroid Build Coastguard Worker 70*8975f5c5SAndroid Build Coastguard Worker EGLenum getState() const; 71*8975f5c5SAndroid Build Coastguard Worker 72*8975f5c5SAndroid Build Coastguard Worker void setConsumerLatency(EGLint latency); 73*8975f5c5SAndroid Build Coastguard Worker EGLint getConsumerLatency() const; 74*8975f5c5SAndroid Build Coastguard Worker 75*8975f5c5SAndroid Build Coastguard Worker EGLuint64KHR getProducerFrame() const; 76*8975f5c5SAndroid Build Coastguard Worker EGLuint64KHR getConsumerFrame() const; 77*8975f5c5SAndroid Build Coastguard Worker 78*8975f5c5SAndroid Build Coastguard Worker void setConsumerAcquireTimeout(EGLint timeout); 79*8975f5c5SAndroid Build Coastguard Worker EGLint getConsumerAcquireTimeout() const; 80*8975f5c5SAndroid Build Coastguard Worker 81*8975f5c5SAndroid Build Coastguard Worker ConsumerType getConsumerType() const; 82*8975f5c5SAndroid Build Coastguard Worker ProducerType getProducerType() const; 83*8975f5c5SAndroid Build Coastguard Worker 84*8975f5c5SAndroid Build Coastguard Worker EGLint getPlaneCount() const; 85*8975f5c5SAndroid Build Coastguard Worker 86*8975f5c5SAndroid Build Coastguard Worker rx::StreamProducerImpl *getImplementation(); 87*8975f5c5SAndroid Build Coastguard Worker 88*8975f5c5SAndroid Build Coastguard Worker // Consumer creation methods 89*8975f5c5SAndroid Build Coastguard Worker Error createConsumerGLTextureExternal(const AttributeMap &attributes, gl::Context *context); 90*8975f5c5SAndroid Build Coastguard Worker 91*8975f5c5SAndroid Build Coastguard Worker // Producer creation methods 92*8975f5c5SAndroid Build Coastguard Worker Error createProducerD3D11Texture(const AttributeMap &attributes); 93*8975f5c5SAndroid Build Coastguard Worker 94*8975f5c5SAndroid Build Coastguard Worker // Consumer methods 95*8975f5c5SAndroid Build Coastguard Worker Error consumerAcquire(const gl::Context *context); 96*8975f5c5SAndroid Build Coastguard Worker Error consumerRelease(const gl::Context *context); 97*8975f5c5SAndroid Build Coastguard Worker 98*8975f5c5SAndroid Build Coastguard Worker // Some consumers are bound to GL contexts. This validates that a given context is bound to the 99*8975f5c5SAndroid Build Coastguard Worker // stream's consumer 100*8975f5c5SAndroid Build Coastguard Worker bool isConsumerBoundToContext(const gl::Context *context) const; 101*8975f5c5SAndroid Build Coastguard Worker 102*8975f5c5SAndroid Build Coastguard Worker // Producer methods 103*8975f5c5SAndroid Build Coastguard Worker Error validateD3D11Texture(const void *texture, const AttributeMap &attributes) const; 104*8975f5c5SAndroid Build Coastguard Worker Error postD3D11Texture(void *texture, const AttributeMap &attributes); 105*8975f5c5SAndroid Build Coastguard Worker 106*8975f5c5SAndroid Build Coastguard Worker private: 107*8975f5c5SAndroid Build Coastguard Worker EGLLabelKHR mLabel; 108*8975f5c5SAndroid Build Coastguard Worker 109*8975f5c5SAndroid Build Coastguard Worker // Associated display 110*8975f5c5SAndroid Build Coastguard Worker Display *mDisplay; 111*8975f5c5SAndroid Build Coastguard Worker 112*8975f5c5SAndroid Build Coastguard Worker // Producer Implementation 113*8975f5c5SAndroid Build Coastguard Worker rx::StreamProducerImpl *mProducerImplementation; 114*8975f5c5SAndroid Build Coastguard Worker 115*8975f5c5SAndroid Build Coastguard Worker // Associated GL context. Note that this is a weak pointer used for validation purposes only, 116*8975f5c5SAndroid Build Coastguard Worker // and should never be arbitrarily dereferenced without knowing the context still exists as it 117*8975f5c5SAndroid Build Coastguard Worker // can become dangling at any time. 118*8975f5c5SAndroid Build Coastguard Worker gl::Context *mContext; 119*8975f5c5SAndroid Build Coastguard Worker 120*8975f5c5SAndroid Build Coastguard Worker // EGL defined attributes 121*8975f5c5SAndroid Build Coastguard Worker EGLint mState; 122*8975f5c5SAndroid Build Coastguard Worker EGLuint64KHR mProducerFrame; 123*8975f5c5SAndroid Build Coastguard Worker EGLuint64KHR mConsumerFrame; 124*8975f5c5SAndroid Build Coastguard Worker EGLint mConsumerLatency; 125*8975f5c5SAndroid Build Coastguard Worker 126*8975f5c5SAndroid Build Coastguard Worker // EGL gltexture consumer attributes 127*8975f5c5SAndroid Build Coastguard Worker EGLint mConsumerAcquireTimeout; 128*8975f5c5SAndroid Build Coastguard Worker 129*8975f5c5SAndroid Build Coastguard Worker // EGL gltexture yuv consumer attributes 130*8975f5c5SAndroid Build Coastguard Worker EGLint mPlaneCount; 131*8975f5c5SAndroid Build Coastguard Worker struct PlaneTexture 132*8975f5c5SAndroid Build Coastguard Worker { 133*8975f5c5SAndroid Build Coastguard Worker EGLint textureUnit; 134*8975f5c5SAndroid Build Coastguard Worker gl::Texture *texture; 135*8975f5c5SAndroid Build Coastguard Worker }; 136*8975f5c5SAndroid Build Coastguard Worker // Texture units and textures for all the planes 137*8975f5c5SAndroid Build Coastguard Worker std::array<PlaneTexture, 3> mPlanes; 138*8975f5c5SAndroid Build Coastguard Worker 139*8975f5c5SAndroid Build Coastguard Worker // Consumer and producer types 140*8975f5c5SAndroid Build Coastguard Worker ConsumerType mConsumerType; 141*8975f5c5SAndroid Build Coastguard Worker ProducerType mProducerType; 142*8975f5c5SAndroid Build Coastguard Worker 143*8975f5c5SAndroid Build Coastguard Worker // ANGLE-only method, used internally 144*8975f5c5SAndroid Build Coastguard Worker friend class gl::Texture; 145*8975f5c5SAndroid Build Coastguard Worker void releaseTextures(); 146*8975f5c5SAndroid Build Coastguard Worker }; 147*8975f5c5SAndroid Build Coastguard Worker } // namespace egl 148*8975f5c5SAndroid Build Coastguard Worker 149*8975f5c5SAndroid Build Coastguard Worker #endif // LIBANGLE_STREAM_H_ 150