xref: /aosp_15_r20/external/angle/src/libANGLE/Stream.h (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
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