blob: 0daa9b0133816d4df906607b1653f075016d8053 [file] [log] [blame]
// 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.
#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
Stream(Display *display, const AttributeMap &attribs);
~Stream() override;
void setLabel(EGLLabelKHR label) override;
EGLLabelKHR getLabel() const override;
enum class ConsumerType
enum class ProducerType
// 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(void *texture, const AttributeMap &attributes) const;
Error postD3D11Texture(void *texture, const AttributeMap &attributes);
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