Commit fa9b803e by Jonah Ryan-Davis Committed by Commit Bot

GLX: Expose EGL_ANGLE_window_fixed_size

Right now the GLX backend checks for resize on every SwapBuffers call. If EGL_ANGLE_window_fixed_size is used, it will only resize when signaled by Chrome. Bug: chromium:1132827 Change-Id: Ia4ddbbbf6dcf13f46ad564208eccc517de8be33c Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2572886Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarShahbaz Youssefi <syoussefi@chromium.org> Commit-Queue: Jonah Ryan-Davis <jonahr@google.com>
parent aafcb504
...@@ -34,9 +34,11 @@ SurfaceState::SurfaceState(const egl::Config *configIn, const AttributeMap &attr ...@@ -34,9 +34,11 @@ SurfaceState::SurfaceState(const egl::Config *configIn, const AttributeMap &attr
config((configIn != nullptr) ? new egl::Config(*configIn) : nullptr), config((configIn != nullptr) ? new egl::Config(*configIn) : nullptr),
attributes(attributesIn), attributes(attributesIn),
timestampsEnabled(false), timestampsEnabled(false),
directComposition(false) directComposition(false),
isFixedSize(false)
{ {
directComposition = attributes.get(EGL_DIRECT_COMPOSITION_ANGLE, EGL_FALSE) == EGL_TRUE; directComposition = attributes.get(EGL_DIRECT_COMPOSITION_ANGLE, EGL_FALSE) == EGL_TRUE;
isFixedSize = attributes.get(EGL_FIXED_SIZE_ANGLE, EGL_FALSE) == EGL_TRUE;
} }
SurfaceState::~SurfaceState() SurfaceState::~SurfaceState()
...@@ -70,7 +72,6 @@ Surface::Surface(EGLint surfaceType, ...@@ -70,7 +72,6 @@ Surface::Surface(EGLint surfaceType,
mHorizontalResolution(EGL_UNKNOWN), mHorizontalResolution(EGL_UNKNOWN),
mVerticalResolution(EGL_UNKNOWN), mVerticalResolution(EGL_UNKNOWN),
mMultisampleResolve(EGL_MULTISAMPLE_RESOLVE_DEFAULT), mMultisampleResolve(EGL_MULTISAMPLE_RESOLVE_DEFAULT),
mFixedSize(false),
mFixedWidth(0), mFixedWidth(0),
mFixedHeight(0), mFixedHeight(0),
mTextureFormat(TextureFormat::NoTexture), mTextureFormat(TextureFormat::NoTexture),
...@@ -115,8 +116,7 @@ Surface::Surface(EGLint surfaceType, ...@@ -115,8 +116,7 @@ Surface::Surface(EGLint surfaceType,
mInitState = gl::InitState::MayNeedInit; mInitState = gl::InitState::MayNeedInit;
} }
mFixedSize = (attributes.get(EGL_FIXED_SIZE_ANGLE, EGL_FALSE) == EGL_TRUE); if (mState.isFixedSize)
if (mFixedSize)
{ {
mFixedWidth = static_cast<size_t>(attributes.get(EGL_WIDTH, 0)); mFixedWidth = static_cast<size_t>(attributes.get(EGL_WIDTH, 0));
mFixedHeight = static_cast<size_t>(attributes.get(EGL_HEIGHT, 0)); mFixedHeight = static_cast<size_t>(attributes.get(EGL_HEIGHT, 0));
...@@ -469,22 +469,22 @@ EGLenum Surface::getMultisampleResolve() const ...@@ -469,22 +469,22 @@ EGLenum Surface::getMultisampleResolve() const
EGLint Surface::isFixedSize() const EGLint Surface::isFixedSize() const
{ {
return mFixedSize; return mState.isFixedSize;
} }
EGLint Surface::getWidth() const EGLint Surface::getWidth() const
{ {
return mFixedSize ? static_cast<EGLint>(mFixedWidth) : mImplementation->getWidth(); return mState.isFixedSize ? static_cast<EGLint>(mFixedWidth) : mImplementation->getWidth();
} }
EGLint Surface::getHeight() const EGLint Surface::getHeight() const
{ {
return mFixedSize ? static_cast<EGLint>(mFixedHeight) : mImplementation->getHeight(); return mState.isFixedSize ? static_cast<EGLint>(mFixedHeight) : mImplementation->getHeight();
} }
egl::Error Surface::getUserWidth(const egl::Display *display, EGLint *value) const egl::Error Surface::getUserWidth(const egl::Display *display, EGLint *value) const
{ {
if (mFixedSize) if (mState.isFixedSize)
{ {
*value = static_cast<EGLint>(mFixedWidth); *value = static_cast<EGLint>(mFixedWidth);
return NoError(); return NoError();
...@@ -497,7 +497,7 @@ egl::Error Surface::getUserWidth(const egl::Display *display, EGLint *value) con ...@@ -497,7 +497,7 @@ egl::Error Surface::getUserWidth(const egl::Display *display, EGLint *value) con
egl::Error Surface::getUserHeight(const egl::Display *display, EGLint *value) const egl::Error Surface::getUserHeight(const egl::Display *display, EGLint *value) const
{ {
if (mFixedSize) if (mState.isFixedSize)
{ {
*value = static_cast<EGLint>(mFixedHeight); *value = static_cast<EGLint>(mFixedHeight);
return NoError(); return NoError();
......
...@@ -58,6 +58,7 @@ struct SurfaceState final : private angle::NonCopyable ...@@ -58,6 +58,7 @@ struct SurfaceState final : private angle::NonCopyable
SupportedCompositorTiming supportedCompositorTimings; SupportedCompositorTiming supportedCompositorTimings;
SupportedTimestamps supportedTimestamps; SupportedTimestamps supportedTimestamps;
bool directComposition; bool directComposition;
bool isFixedSize;
}; };
class Surface : public LabeledObject, public gl::FramebufferAttachmentObject class Surface : public LabeledObject, public gl::FramebufferAttachmentObject
......
...@@ -896,6 +896,7 @@ void DisplayGLX::generateExtensions(egl::DisplayExtensions *outExtensions) const ...@@ -896,6 +896,7 @@ void DisplayGLX::generateExtensions(egl::DisplayExtensions *outExtensions) const
outExtensions->displaySemaphoreShareGroup = true; outExtensions->displaySemaphoreShareGroup = true;
outExtensions->surfacelessContext = true; outExtensions->surfacelessContext = true;
outExtensions->windowFixedSize = true;
if (!mRenderer->getFeatures().disableSyncControlSupport.enabled) if (!mRenderer->getFeatures().disableSyncControlSupport.enabled)
{ {
......
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
#include "common/debug.h" #include "common/debug.h"
#include "libANGLE/Surface.h"
#include "libANGLE/renderer/gl/glx/DisplayGLX.h" #include "libANGLE/renderer/gl/glx/DisplayGLX.h"
#include "libANGLE/renderer/gl/glx/FunctionsGLX.h" #include "libANGLE/renderer/gl/glx/FunctionsGLX.h"
...@@ -140,10 +141,13 @@ egl::Error WindowSurfaceGLX::swap(const gl::Context *context) ...@@ -140,10 +141,13 @@ egl::Error WindowSurfaceGLX::swap(const gl::Context *context)
mGLXDisplay->setSwapInterval(mGLXWindow, &mSwapControl); mGLXDisplay->setSwapInterval(mGLXWindow, &mSwapControl);
mGLX.swapBuffers(mGLXWindow); mGLX.swapBuffers(mGLXWindow);
egl::Error error = checkForResize(); if (!mState.isFixedSize)
if (error.isError())
{ {
return error; egl::Error error = checkForResize();
if (error.isError())
{
return error;
}
} }
return egl::NoError(); return egl::NoError();
...@@ -235,6 +239,24 @@ glx::Drawable WindowSurfaceGLX::getDrawable() const ...@@ -235,6 +239,24 @@ glx::Drawable WindowSurfaceGLX::getDrawable() const
return mGLXWindow; return mGLXWindow;
} }
void WindowSurfaceGLX::setFixedWidth(EGLint width)
{
mParentWidth = width;
mGLX.waitGL();
XResizeWindow(mDisplay, mWindow, mParentWidth, mParentHeight);
mGLX.waitX();
XSync(mDisplay, False);
}
void WindowSurfaceGLX::setFixedHeight(EGLint height)
{
mParentHeight = height;
mGLX.waitGL();
XResizeWindow(mDisplay, mWindow, mParentWidth, mParentHeight);
mGLX.waitX();
XSync(mDisplay, False);
}
bool WindowSurfaceGLX::getWindowDimensions(Window window, bool WindowSurfaceGLX::getWindowDimensions(Window window,
unsigned int *width, unsigned int *width,
unsigned int *height) const unsigned int *height) const
......
...@@ -56,6 +56,9 @@ class WindowSurfaceGLX : public SurfaceGLX ...@@ -56,6 +56,9 @@ class WindowSurfaceGLX : public SurfaceGLX
egl::Error checkForResize() override; egl::Error checkForResize() override;
glx::Drawable getDrawable() const override; glx::Drawable getDrawable() const override;
void setFixedWidth(EGLint width) override;
void setFixedHeight(EGLint height) override;
egl::Error getSyncValues(EGLuint64KHR *ust, EGLuint64KHR *msc, EGLuint64KHR *sbc) override; egl::Error getSyncValues(EGLuint64KHR *ust, EGLuint64KHR *msc, EGLuint64KHR *sbc) override;
egl::Error getMscRate(EGLint *numerator, EGLint *denominator) override; egl::Error getMscRate(EGLint *numerator, EGLint *denominator) override;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment