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