Hash :
c408926f
Author :
Date :
2021-07-22T12:00:59
Revert "EGL: GLES: Implement GL_EXT_protected_textures" This reverts commit 6210a9b34a721df2c84cf69170ad9bf7ba40e4aa. Reason for revert: Suspected for breaking ANGLE->Chrome roller. Bug: angleproject:6204 Original change's description: > EGL: GLES: Implement GL_EXT_protected_textures > > Implement EGL_EXT_protected_content Images > Add protected member to Images and Textures > Add error when creating objects if not supported or > does't match native buffer > When creating siblings pass protected state > Add extension caps > Add Validation > Add GetTexParameter and SetTextparameter > Add protected to Texture and state > Expand tests for images and textures > > Test: angle_end2end_test --gtest_filter=EGLProtectedContentTest > > Bug: angleproject:3965 > Change-Id: I35a89b4e80bba6d9b6831c68e71630eef304dacb > Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2802852 > Commit-Queue: Mohan Maiya <m.maiya@samsung.com> > Reviewed-by: Geoff Lang <geofflang@chromium.org> > Reviewed-by: Jamie Madill <jmadill@chromium.org> > Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org> Bug: angleproject:3965 Change-Id: Ia3ef260a17097b474189ccad5b235a9db99ee00b Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/3043889 Reviewed-by: Jamie Madill <jmadill@chromium.org> Commit-Queue: Jamie Madill <jmadill@chromium.org> Bot-Commit: Rubber Stamper <rubber-stamper@appspot.gserviceaccount.com>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325
//
// Copyright 2002 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.
//
// Surface.h: Defines the egl::Surface class, representing a drawing surface
// such as the client area of a window, including any back buffers.
// Implements EGLSurface and related functionality. [EGL 1.4] section 2.2 page 3.
#ifndef LIBANGLE_SURFACE_H_
#define LIBANGLE_SURFACE_H_
#include <EGL/egl.h>
#include "common/PackedEnums.h"
#include "common/angleutils.h"
#include "libANGLE/AttributeMap.h"
#include "libANGLE/Debug.h"
#include "libANGLE/Error.h"
#include "libANGLE/FramebufferAttachment.h"
#include "libANGLE/RefCountObject.h"
#include "libANGLE/formatutils.h"
#include "libANGLE/renderer/SurfaceImpl.h"
namespace gl
{
class Context;
class Framebuffer;
class Texture;
} // namespace gl
namespace rx
{
class EGLImplFactory;
}
namespace egl
{
class Display;
struct Config;
using SupportedCompositorTiming = angle::PackedEnumBitSet<CompositorTiming>;
using SupportedTimestamps = angle::PackedEnumBitSet<Timestamp>;
struct SurfaceState final : private angle::NonCopyable
{
SurfaceState(const egl::Config *configIn, const AttributeMap &attributesIn);
~SurfaceState();
bool isRobustResourceInitEnabled() const;
bool hasProtectedContent() const;
EGLLabelKHR label;
const egl::Config *config;
AttributeMap attributes;
bool timestampsEnabled;
SupportedCompositorTiming supportedCompositorTimings;
SupportedTimestamps supportedTimestamps;
bool directComposition;
};
class Surface : public LabeledObject, public gl::FramebufferAttachmentObject
{
public:
rx::SurfaceImpl *getImplementation() const { return mImplementation; }
void setLabel(EGLLabelKHR label) override;
EGLLabelKHR getLabel() const override;
EGLint getType() const;
Error initialize(const Display *display);
Error makeCurrent(const gl::Context *context);
Error unMakeCurrent(const gl::Context *context);
Error swap(const gl::Context *context);
Error swapWithDamage(const gl::Context *context, const EGLint *rects, EGLint n_rects);
Error swapWithFrameToken(const gl::Context *context, EGLFrameTokenANGLE frameToken);
Error postSubBuffer(const gl::Context *context,
EGLint x,
EGLint y,
EGLint width,
EGLint height);
Error setPresentationTime(EGLnsecsANDROID time);
Error querySurfacePointerANGLE(EGLint attribute, void **value);
Error bindTexImage(gl::Context *context, gl::Texture *texture, EGLint buffer);
Error releaseTexImage(const gl::Context *context, EGLint buffer);
Error getSyncValues(EGLuint64KHR *ust, EGLuint64KHR *msc, EGLuint64KHR *sbc);
Error getMscRate(EGLint *numerator, EGLint *denominator);
EGLint isPostSubBufferSupported() const;
void setSwapInterval(EGLint interval);
Error onDestroy(const Display *display);
void setMipmapLevel(EGLint level);
void setMultisampleResolve(EGLenum resolve);
void setSwapBehavior(EGLenum behavior);
void setFixedWidth(EGLint width);
void setFixedHeight(EGLint height);
gl::Framebuffer *createDefaultFramebuffer(const gl::Context *context,
egl::Surface *readSurface);
const Config *getConfig() const;
// width and height can change with client window resizing
EGLint getWidth() const;
EGLint getHeight() const;
// Note: windows cannot be resized on Android. The approach requires
// calling vkGetPhysicalDeviceSurfaceCapabilitiesKHR. However, that is
// expensive; and there are troublesome timing issues for other parts of
// ANGLE (which cause test failures and crashes). Therefore, a
// special-Android-only path is created just for the querying of EGL_WIDTH
// and EGL_HEIGHT.
// https://issuetracker.google.com/issues/153329980
egl::Error getUserWidth(const egl::Display *display, EGLint *value) const;
egl::Error getUserHeight(const egl::Display *display, EGLint *value) const;
EGLint getPixelAspectRatio() const;
EGLenum getRenderBuffer() const;
EGLenum getSwapBehavior() const;
TextureFormat getTextureFormat() const;
EGLenum getTextureTarget() const;
bool getLargestPbuffer() const;
EGLenum getGLColorspace() const;
EGLenum getVGAlphaFormat() const;
EGLenum getVGColorspace() const;
bool getMipmapTexture() const;
EGLint getMipmapLevel() const;
EGLint getHorizontalResolution() const;
EGLint getVerticalResolution() const;
EGLenum getMultisampleResolve() const;
bool hasProtectedContent() const;
gl::Texture *getBoundTexture() const { return mTexture; }
EGLint isFixedSize() const;
// FramebufferAttachmentObject implementation
gl::Extents getAttachmentSize(const gl::ImageIndex &imageIndex) const override;
gl::Format getAttachmentFormat(GLenum binding, const gl::ImageIndex &imageIndex) const override;
GLsizei getAttachmentSamples(const gl::ImageIndex &imageIndex) const override;
bool isRenderable(const gl::Context *context,
GLenum binding,
const gl::ImageIndex &imageIndex) const override;
bool isYUV() const override;
void onAttach(const gl::Context *context, rx::Serial framebufferSerial) override {}
void onDetach(const gl::Context *context, rx::Serial framebufferSerial) override {}
GLuint getId() const override;
bool flexibleSurfaceCompatibilityRequested() const
{
return mFlexibleSurfaceCompatibilityRequested;
}
EGLint getOrientation() const { return mOrientation; }
bool directComposition() const { return mState.directComposition; }
gl::InitState initState(const gl::ImageIndex &imageIndex) const override;
void setInitState(const gl::ImageIndex &imageIndex, gl::InitState initState) override;
bool isRobustResourceInitEnabled() const { return mRobustResourceInitialization; }
const gl::Format &getBindTexImageFormat() const { return mColorFormat; }
// EGL_ANDROID_get_frame_timestamps entry points
void setTimestampsEnabled(bool enabled);
bool isTimestampsEnabled() const;
const SupportedCompositorTiming &getSupportedCompositorTimings() const;
Error getCompositorTiming(EGLint numTimestamps,
const EGLint *names,
EGLnsecsANDROID *values) const;
Error getNextFrameId(EGLuint64KHR *frameId) const;
const SupportedTimestamps &getSupportedTimestamps() const;
Error getFrameTimestamps(EGLuint64KHR frameId,
EGLint numTimestamps,
const EGLint *timestamps,
EGLnsecsANDROID *values) const;
// Returns the offset into the texture backing the surface if specified via texture offset
// attributes (see EGL_ANGLE_d3d_texture_client_buffer extension). Returns zero offset
// otherwise.
const gl::Offset &getTextureOffset() const { return mTextureOffset; }
Error getBufferAge(const gl::Context *context, EGLint *age) const;
void setRenderBuffer(EGLint value);
protected:
Surface(EGLint surfaceType,
const egl::Config *config,
const AttributeMap &attributes,
bool forceRobustResourceInit,
EGLenum buftype = EGL_NONE);
~Surface() override;
rx::FramebufferAttachmentObjectImpl *getAttachmentImpl() const override;
gl::Framebuffer *createDefaultFramebuffer(const Display *display);
// ANGLE-only method, used internally
friend class gl::Texture;
Error releaseTexImageFromTexture(const gl::Context *context);
SurfaceState mState;
rx::SurfaceImpl *mImplementation;
int mRefCount;
bool mDestroyed;
EGLint mType;
EGLenum mBuftype;
bool mPostSubBufferRequested;
bool mFlexibleSurfaceCompatibilityRequested;
bool mLargestPbuffer;
EGLenum mGLColorspace;
EGLenum mVGAlphaFormat;
EGLenum mVGColorspace;
bool mMipmapTexture;
EGLint mMipmapLevel;
EGLint mHorizontalResolution;
EGLint mVerticalResolution;
EGLenum mMultisampleResolve;
bool mFixedSize;
size_t mFixedWidth;
size_t mFixedHeight;
bool mRobustResourceInitialization;
TextureFormat mTextureFormat;
EGLenum mTextureTarget;
EGLint mPixelAspectRatio; // Display aspect ratio
EGLenum mRenderBuffer; // Render buffer
EGLenum mSwapBehavior; // Buffer swap behavior
EGLint mOrientation;
// We don't use a binding pointer here. We don't ever want to own an orphaned texture. If a
// Texture is deleted the Surface is unbound in onDestroy.
gl::Texture *mTexture;
gl::Format mColorFormat;
gl::Format mDSFormat;
gl::Offset mTextureOffset;
private:
Error destroyImpl(const Display *display);
void postSwap(const gl::Context *context);
Error releaseRef(const Display *display);
// ObserverInterface implementation.
void onSubjectStateChange(angle::SubjectIndex index, angle::SubjectMessage message) override;
gl::InitState mInitState;
angle::ObserverBinding mImplObserverBinding;
};
class WindowSurface final : public Surface
{
public:
WindowSurface(rx::EGLImplFactory *implFactory,
const Config *config,
EGLNativeWindowType window,
const AttributeMap &attribs,
bool robustResourceInit);
~WindowSurface() override;
};
class PbufferSurface final : public Surface
{
public:
PbufferSurface(rx::EGLImplFactory *implFactory,
const Config *config,
const AttributeMap &attribs,
bool robustResourceInit);
PbufferSurface(rx::EGLImplFactory *implFactory,
const Config *config,
EGLenum buftype,
EGLClientBuffer clientBuffer,
const AttributeMap &attribs,
bool robustResourceInit);
protected:
~PbufferSurface() override;
};
class PixmapSurface final : public Surface
{
public:
PixmapSurface(rx::EGLImplFactory *implFactory,
const Config *config,
NativePixmapType nativePixmap,
const AttributeMap &attribs,
bool robustResourceInit);
protected:
~PixmapSurface() override;
};
class SurfaceDeleter final
{
public:
SurfaceDeleter(const Display *display);
~SurfaceDeleter();
void operator()(Surface *surface);
private:
const Display *mDisplay;
};
using SurfacePointer = angle::UniqueObjectPointerBase<Surface, SurfaceDeleter>;
} // namespace egl
#endif // LIBANGLE_SURFACE_H_