| // |
| // Copyright 2016 The ANGLE Project Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| // |
| |
| // Stream.h: Defines the egl::Stream class, representing the stream |
| // where frames are streamed in. Implements EGLStreanKHR. |
| |
| #ifndef LIBANGLE_STREAM_H_ |
| #define LIBANGLE_STREAM_H_ |
| |
| #include <array> |
| |
| #include <EGL/egl.h> |
| #include <EGL/eglext.h> |
| |
| #include "common/angleutils.h" |
| #include "libANGLE/AttributeMap.h" |
| #include "libANGLE/Debug.h" |
| |
| namespace rx |
| { |
| class StreamProducerImpl; |
| } |
| |
| namespace gl |
| { |
| class Context; |
| class Texture; |
| } // namespace gl |
| |
| namespace egl |
| { |
| class Display; |
| class Error; |
| class Thread; |
| |
| class Stream final : public LabeledObject, angle::NonCopyable |
| { |
| public: |
| Stream(Display *display, const AttributeMap &attribs); |
| ~Stream() override; |
| |
| void setLabel(EGLLabelKHR label) override; |
| EGLLabelKHR getLabel() const override; |
| |
| enum class ConsumerType |
| { |
| NoConsumer, |
| GLTextureRGB, |
| GLTextureYUV, |
| }; |
| |
| enum class ProducerType |
| { |
| NoProducer, |
| D3D11Texture, |
| }; |
| |
| // A GL texture interpretation of a part of a producer frame. For use with GL texture consumers |
| struct GLTextureDescription |
| { |
| unsigned int width; |
| unsigned int height; |
| unsigned int internalFormat; |
| unsigned int mipLevels; |
| }; |
| |
| EGLenum getState() const; |
| |
| void setConsumerLatency(EGLint latency); |
| EGLint getConsumerLatency() const; |
| |
| EGLuint64KHR getProducerFrame() const; |
| EGLuint64KHR getConsumerFrame() const; |
| |
| void setConsumerAcquireTimeout(EGLint timeout); |
| EGLint getConsumerAcquireTimeout() const; |
| |
| ConsumerType getConsumerType() const; |
| ProducerType getProducerType() const; |
| |
| EGLint getPlaneCount() const; |
| |
| rx::StreamProducerImpl *getImplementation(); |
| |
| // Consumer creation methods |
| Error createConsumerGLTextureExternal(const AttributeMap &attributes, gl::Context *context); |
| |
| // Producer creation methods |
| Error createProducerD3D11Texture(const AttributeMap &attributes); |
| |
| // Consumer methods |
| Error consumerAcquire(const gl::Context *context); |
| Error consumerRelease(const gl::Context *context); |
| |
| // Some consumers are bound to GL contexts. This validates that a given context is bound to the |
| // stream's consumer |
| bool isConsumerBoundToContext(const gl::Context *context) const; |
| |
| // Producer methods |
| Error validateD3D11Texture(const void *texture, const AttributeMap &attributes) const; |
| Error postD3D11Texture(void *texture, const AttributeMap &attributes); |
| |
| private: |
| EGLLabelKHR mLabel; |
| |
| // Associated display |
| Display *mDisplay; |
| |
| // Producer Implementation |
| rx::StreamProducerImpl *mProducerImplementation; |
| |
| // Associated GL context. Note that this is a weak pointer used for validation purposes only, |
| // and should never be arbitrarily dereferenced without knowing the context still exists as it |
| // can become dangling at any time. |
| gl::Context *mContext; |
| |
| // EGL defined attributes |
| EGLint mState; |
| EGLuint64KHR mProducerFrame; |
| EGLuint64KHR mConsumerFrame; |
| EGLint mConsumerLatency; |
| |
| // EGL gltexture consumer attributes |
| EGLint mConsumerAcquireTimeout; |
| |
| // EGL gltexture yuv consumer attributes |
| EGLint mPlaneCount; |
| struct PlaneTexture |
| { |
| EGLint textureUnit; |
| gl::Texture *texture; |
| }; |
| // Texture units and textures for all the planes |
| std::array<PlaneTexture, 3> mPlanes; |
| |
| // Consumer and producer types |
| ConsumerType mConsumerType; |
| ProducerType mProducerType; |
| |
| // ANGLE-only method, used internally |
| friend class gl::Texture; |
| void releaseTextures(); |
| }; |
| } // namespace egl |
| |
| #endif // LIBANGLE_STREAM_H_ |