Add a shared egl::SurfaceState struct.

This structure can share GL-level properties (immutably) with the
implementation.

BUG=angleproject:1369

Change-Id: I1e9406f18b6b88bb7db2a8f87b5e6d547cc7ecb1
Reviewed-on: https://chromium-review.googlesource.com/342061
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
Commit-Queue: Jamie Madill <jmadill@chromium.org>
This commit is contained in:
Jamie Madill 2016-05-19 13:13:36 -04:00
Родитель 0f2b156093
Коммит 62baf0cf6f
38 изменённых файлов: 225 добавлений и 136 удалений

Просмотреть файл

@ -10,7 +10,6 @@
#include "libANGLE/Surface.h"
#include <EGL/eglext.h>
#include <iostream>
@ -23,13 +22,13 @@
namespace egl
{
Surface::Surface(rx::SurfaceImpl *impl,
EGLint surfaceType,
const egl::Config *config,
const AttributeMap &attributes)
SurfaceState::SurfaceState() : defaultFramebuffer(nullptr)
{
}
Surface::Surface(EGLint surfaceType, const egl::Config *config, const AttributeMap &attributes)
: FramebufferAttachmentObject(),
mImplementation(impl),
mDefaultFramebuffer(nullptr),
mImplementation(nullptr),
mCurrentCount(0),
mDestroyed(false),
mType(surfaceType),
@ -43,7 +42,7 @@ Surface::Surface(rx::SurfaceImpl *impl,
// FIXME: Determine actual pixel aspect ratio
mPixelAspectRatio(static_cast<EGLint>(1.0 * EGL_DISPLAY_SCALING)),
mRenderBuffer(EGL_BACK_BUFFER),
mSwapBehavior(impl->getSwapBehavior()),
mSwapBehavior(EGL_NONE),
mOrientation(0),
mTexture()
{
@ -81,17 +80,20 @@ Surface::~Surface()
mTexture.set(nullptr);
}
SafeDelete(mDefaultFramebuffer);
SafeDelete(mState.defaultFramebuffer);
SafeDelete(mImplementation);
}
Error Surface::initialize()
{
// Initialized here since impl is nullptr in the constructor.
mSwapBehavior = mImplementation->getSwapBehavior();
ANGLE_TRY(mImplementation->initialize());
// Must happen after implementation initialize for OSX.
mDefaultFramebuffer = createDefaultFramebuffer();
ASSERT(mDefaultFramebuffer != nullptr);
mState.defaultFramebuffer = createDefaultFramebuffer();
ASSERT(mState.defaultFramebuffer != nullptr);
return Error(EGL_SUCCESS);
}
@ -273,11 +275,9 @@ WindowSurface::WindowSurface(rx::EGLImplFactory *implFactory,
const egl::Config *config,
EGLNativeWindowType window,
const AttributeMap &attribs)
: Surface(implFactory->createWindowSurface(config, window, attribs),
EGL_WINDOW_BIT,
config,
attribs)
: Surface(EGL_WINDOW_BIT, config, attribs)
{
mImplementation = implFactory->createWindowSurface(mState, config, window, attribs);
}
WindowSurface::~WindowSurface()
@ -287,19 +287,19 @@ WindowSurface::~WindowSurface()
PbufferSurface::PbufferSurface(rx::EGLImplFactory *implFactory,
const Config *config,
const AttributeMap &attribs)
: Surface(implFactory->createPbufferSurface(config, attribs), EGL_PBUFFER_BIT, config, attribs)
: Surface(EGL_PBUFFER_BIT, config, attribs)
{
mImplementation = implFactory->createPbufferSurface(mState, config, attribs);
}
PbufferSurface::PbufferSurface(rx::EGLImplFactory *implFactory,
const Config *config,
EGLClientBuffer shareHandle,
const AttributeMap &attribs)
: Surface(implFactory->createPbufferFromClientBuffer(config, shareHandle, attribs),
EGL_PBUFFER_BIT,
config,
attribs)
: Surface(EGL_PBUFFER_BIT, config, attribs)
{
mImplementation =
implFactory->createPbufferFromClientBuffer(mState, config, shareHandle, attribs);
}
PbufferSurface::~PbufferSurface()
@ -310,11 +310,9 @@ PixmapSurface::PixmapSurface(rx::EGLImplFactory *implFactory,
const Config *config,
NativePixmapType nativePixmap,
const AttributeMap &attribs)
: Surface(implFactory->createPixmapSurface(config, nativePixmap, attribs),
EGL_PIXMAP_BIT,
config,
attribs)
: Surface(EGL_PIXMAP_BIT, config, attribs)
{
mImplementation = implFactory->createPixmapSurface(mState, config, nativePixmap, attribs);
}
PixmapSurface::~PixmapSurface()

Просмотреть файл

@ -36,6 +36,13 @@ class AttributeMap;
class Display;
struct Config;
struct SurfaceState final : angle::NonCopyable
{
SurfaceState();
gl::Framebuffer *defaultFramebuffer;
};
class Surface : public gl::FramebufferAttachmentObject
{
public:
@ -70,7 +77,7 @@ class Surface : public gl::FramebufferAttachmentObject
EGLenum getTextureTarget() const;
gl::Texture *getBoundTexture() const { return mTexture.get(); }
gl::Framebuffer *getDefaultFramebuffer() { return mDefaultFramebuffer; }
gl::Framebuffer *getDefaultFramebuffer() { return mState.defaultFramebuffer; }
EGLint isFixedSize() const;
@ -92,10 +99,7 @@ class Surface : public gl::FramebufferAttachmentObject
bool directComposition() const { return mDirectComposition; }
protected:
Surface(rx::SurfaceImpl *impl,
EGLint surfaceType,
const egl::Config *config,
const AttributeMap &attributes);
Surface(EGLint surfaceType, const egl::Config *config, const AttributeMap &attributes);
rx::FramebufferAttachmentObjectImpl *getAttachmentImpl() const override { return mImplementation; }
gl::Framebuffer *createDefaultFramebuffer();
@ -104,8 +108,8 @@ class Surface : public gl::FramebufferAttachmentObject
friend class gl::Texture;
void releaseTexImageFromTexture();
SurfaceState mState;
rx::SurfaceImpl *mImplementation;
gl::Framebuffer *mDefaultFramebuffer;
int mCurrentCount;
bool mDestroyed;

Просмотреть файл

@ -25,6 +25,7 @@ namespace
class MockSurfaceImpl : public rx::SurfaceImpl
{
public:
MockSurfaceImpl() : SurfaceImpl(mockState) {}
virtual ~MockSurfaceImpl() { destroy(); }
MOCK_METHOD0(initialize, egl::Error());
@ -42,6 +43,8 @@ class MockSurfaceImpl : public rx::SurfaceImpl
MOCK_METHOD2(getAttachmentRenderTarget, gl::Error(const gl::FramebufferAttachment::Target &, rx::FramebufferAttachmentRenderTarget **));
MOCK_METHOD0(destroy, void());
egl::SurfaceState mockState;
};
TEST(SurfaceTest, DestructionDeletesImpl)
@ -49,8 +52,7 @@ TEST(SurfaceTest, DestructionDeletesImpl)
NiceMock<MockEGLFactory> factory;
MockSurfaceImpl *impl = new MockSurfaceImpl;
EXPECT_CALL(*impl, getSwapBehavior());
EXPECT_CALL(factory, createWindowSurface(_, _, _)).WillOnce(Return(impl));
EXPECT_CALL(factory, createWindowSurface(_, _, _, _)).WillOnce(Return(impl));
egl::Config config;
egl::Surface *surface = new egl::WindowSurface(

Просмотреть файл

@ -17,6 +17,7 @@ namespace egl
class AttributeMap;
struct Config;
class ImageSibling;
struct SurfaceState;
}
namespace gl
@ -37,15 +38,19 @@ class EGLImplFactory : angle::NonCopyable
EGLImplFactory() {}
virtual ~EGLImplFactory() {}
virtual SurfaceImpl *createWindowSurface(const egl::Config *configuration,
virtual SurfaceImpl *createWindowSurface(const egl::SurfaceState &state,
const egl::Config *configuration,
EGLNativeWindowType window,
const egl::AttributeMap &attribs) = 0;
virtual SurfaceImpl *createPbufferSurface(const egl::Config *configuration,
virtual SurfaceImpl *createPbufferSurface(const egl::SurfaceState &state,
const egl::Config *configuration,
const egl::AttributeMap &attribs) = 0;
virtual SurfaceImpl *createPbufferFromClientBuffer(const egl::Config *configuration,
virtual SurfaceImpl *createPbufferFromClientBuffer(const egl::SurfaceState &state,
const egl::Config *configuration,
EGLClientBuffer shareHandle,
const egl::AttributeMap &attribs) = 0;
virtual SurfaceImpl *createPixmapSurface(const egl::Config *configuration,
virtual SurfaceImpl *createPixmapSurface(const egl::SurfaceState &state,
const egl::Config *configuration,
NativePixmapType nativePixmap,
const egl::AttributeMap &attribs) = 0;

Просмотреть файл

@ -11,7 +11,7 @@
namespace rx
{
SurfaceImpl::SurfaceImpl()
SurfaceImpl::SurfaceImpl(const egl::SurfaceState &state) : mState(state)
{
}

Просмотреть файл

@ -22,6 +22,7 @@ namespace egl
{
class Display;
struct Config;
struct SurfaceState;
}
namespace rx
@ -31,7 +32,7 @@ class FramebufferImpl;
class SurfaceImpl : public FramebufferAttachmentObjectImpl
{
public:
SurfaceImpl();
SurfaceImpl(const egl::SurfaceState &surfaceState);
virtual ~SurfaceImpl();
virtual egl::Error initialize() = 0;
@ -49,6 +50,9 @@ class SurfaceImpl : public FramebufferAttachmentObjectImpl
virtual EGLint isPostSubBufferSupported() const = 0;
virtual EGLint getSwapBehavior() const = 0;
protected:
const egl::SurfaceState &mState;
};
}

Просмотреть файл

@ -162,31 +162,34 @@ DisplayD3D::DisplayD3D() : mRenderer(nullptr)
{
}
SurfaceImpl *DisplayD3D::createWindowSurface(const egl::Config *configuration,
SurfaceImpl *DisplayD3D::createWindowSurface(const egl::SurfaceState &state,
const egl::Config *configuration,
EGLNativeWindowType window,
const egl::AttributeMap &attribs)
{
ASSERT(mRenderer != nullptr);
return new WindowSurfaceD3D(mRenderer, mDisplay, configuration, window, attribs);
return new WindowSurfaceD3D(state, mRenderer, mDisplay, configuration, window, attribs);
}
SurfaceImpl *DisplayD3D::createPbufferSurface(const egl::Config *configuration,
SurfaceImpl *DisplayD3D::createPbufferSurface(const egl::SurfaceState &state,
const egl::Config *configuration,
const egl::AttributeMap &attribs)
{
ASSERT(mRenderer != nullptr);
return new PbufferSurfaceD3D(mRenderer, mDisplay, configuration, nullptr, attribs);
return new PbufferSurfaceD3D(state, mRenderer, mDisplay, configuration, nullptr, attribs);
}
SurfaceImpl *DisplayD3D::createPbufferFromClientBuffer(const egl::Config *configuration,
SurfaceImpl *DisplayD3D::createPbufferFromClientBuffer(const egl::SurfaceState &state,
const egl::Config *configuration,
EGLClientBuffer shareHandle,
const egl::AttributeMap &attribs)
{
ASSERT(mRenderer != nullptr);
return new PbufferSurfaceD3D(mRenderer, mDisplay, configuration, shareHandle, attribs);
return new PbufferSurfaceD3D(state, mRenderer, mDisplay, configuration, shareHandle, attribs);
}
SurfaceImpl *DisplayD3D::createPixmapSurface(const egl::Config *configuration,
SurfaceImpl *DisplayD3D::createPixmapSurface(const egl::SurfaceState &state,
const egl::Config *configuration,
NativePixmapType nativePixmap,
const egl::AttributeMap &attribs)
{

Просмотреть файл

@ -25,15 +25,19 @@ class DisplayD3D : public DisplayImpl
virtual void terminate() override;
// Surface creation
SurfaceImpl *createWindowSurface(const egl::Config *configuration,
SurfaceImpl *createWindowSurface(const egl::SurfaceState &state,
const egl::Config *configuration,
EGLNativeWindowType window,
const egl::AttributeMap &attribs) override;
SurfaceImpl *createPbufferSurface(const egl::Config *configuration,
SurfaceImpl *createPbufferSurface(const egl::SurfaceState &state,
const egl::Config *configuration,
const egl::AttributeMap &attribs) override;
SurfaceImpl *createPbufferFromClientBuffer(const egl::Config *configuration,
SurfaceImpl *createPbufferFromClientBuffer(const egl::SurfaceState &state,
const egl::Config *configuration,
EGLClientBuffer shareHandle,
const egl::AttributeMap &attribs) override;
SurfaceImpl *createPixmapSurface(const egl::Config *configuration,
SurfaceImpl *createPixmapSurface(const egl::SurfaceState &state,
const egl::Config *configuration,
NativePixmapType nativePixmap,
const egl::AttributeMap &attribs) override;

Просмотреть файл

@ -21,13 +21,14 @@
namespace rx
{
SurfaceD3D::SurfaceD3D(RendererD3D *renderer,
SurfaceD3D::SurfaceD3D(const egl::SurfaceState &state,
RendererD3D *renderer,
egl::Display *display,
const egl::Config *config,
EGLNativeWindowType window,
EGLClientBuffer shareHandle,
const egl::AttributeMap &attribs)
: SurfaceImpl(),
: SurfaceImpl(state),
mRenderer(renderer),
mDisplay(display),
mFixedSize(window == nullptr || attribs.get(EGL_FIXED_SIZE_ANGLE, EGL_FALSE) == EGL_TRUE),
@ -334,12 +335,13 @@ gl::Error SurfaceD3D::getAttachmentRenderTarget(const gl::FramebufferAttachment:
return gl::Error(GL_NO_ERROR);
}
WindowSurfaceD3D::WindowSurfaceD3D(RendererD3D *renderer,
WindowSurfaceD3D::WindowSurfaceD3D(const egl::SurfaceState &state,
RendererD3D *renderer,
egl::Display *display,
const egl::Config *config,
EGLNativeWindowType window,
const egl::AttributeMap &attribs)
: SurfaceD3D(renderer, display, config, window, static_cast<EGLClientBuffer>(0), attribs)
: SurfaceD3D(state, renderer, display, config, window, static_cast<EGLClientBuffer>(0), attribs)
{
}
@ -347,12 +349,14 @@ WindowSurfaceD3D::~WindowSurfaceD3D()
{
}
PbufferSurfaceD3D::PbufferSurfaceD3D(RendererD3D *renderer,
PbufferSurfaceD3D::PbufferSurfaceD3D(const egl::SurfaceState &state,
RendererD3D *renderer,
egl::Display *display,
const egl::Config *config,
EGLClientBuffer shareHandle,
const egl::AttributeMap &attribs)
: SurfaceD3D(renderer,
: SurfaceD3D(state,
renderer,
display,
config,
static_cast<EGLNativeWindowType>(0),

Просмотреть файл

@ -56,7 +56,8 @@ class SurfaceD3D : public SurfaceImpl
FramebufferAttachmentRenderTarget **rtOut) override;
protected:
SurfaceD3D(RendererD3D *renderer,
SurfaceD3D(const egl::SurfaceState &state,
RendererD3D *renderer,
egl::Display *display,
const egl::Config *config,
EGLNativeWindowType window,
@ -91,7 +92,8 @@ class SurfaceD3D : public SurfaceImpl
class WindowSurfaceD3D : public SurfaceD3D
{
public:
WindowSurfaceD3D(RendererD3D *renderer,
WindowSurfaceD3D(const egl::SurfaceState &state,
RendererD3D *renderer,
egl::Display *display,
const egl::Config *config,
EGLNativeWindowType window,
@ -102,7 +104,8 @@ class WindowSurfaceD3D : public SurfaceD3D
class PbufferSurfaceD3D : public SurfaceD3D
{
public:
PbufferSurfaceD3D(RendererD3D *renderer,
PbufferSurfaceD3D(const egl::SurfaceState &state,
RendererD3D *renderer,
egl::Display *display,
const egl::Config *config,
EGLClientBuffer shareHandle,

Просмотреть файл

@ -14,7 +14,8 @@
namespace rx
{
SurfaceGL::SurfaceGL(RendererGL *renderer) : SurfaceImpl(), mRenderer(renderer)
SurfaceGL::SurfaceGL(const egl::SurfaceState &state, RendererGL *renderer)
: SurfaceImpl(state), mRenderer(renderer)
{
}

Просмотреть файл

@ -19,7 +19,7 @@ class RendererGL;
class SurfaceGL : public SurfaceImpl
{
public:
SurfaceGL(RendererGL *renderer);
SurfaceGL(const egl::SurfaceState &state, RendererGL *renderer);
~SurfaceGL() override;
gl::Error getAttachmentRenderTarget(const gl::FramebufferAttachment::Target &target,

Просмотреть файл

@ -26,15 +26,19 @@ class DisplayCGL : public DisplayGL
egl::Error initialize(egl::Display *display) override;
void terminate() override;
SurfaceImpl *createWindowSurface(const egl::Config *configuration,
SurfaceImpl *createWindowSurface(const egl::SurfaceState &state,
const egl::Config *configuration,
EGLNativeWindowType window,
const egl::AttributeMap &attribs) override;
SurfaceImpl *createPbufferSurface(const egl::Config *configuration,
SurfaceImpl *createPbufferSurface(const egl::SurfaceState &state,
const egl::Config *configuration,
const egl::AttributeMap &attribs) override;
SurfaceImpl *createPbufferFromClientBuffer(const egl::Config *configuration,
SurfaceImpl *createPbufferFromClientBuffer(const egl::SurfaceState &state,
const egl::Config *configuration,
EGLClientBuffer shareHandle,
const egl::AttributeMap &attribs) override;
SurfaceImpl *createPixmapSurface(const egl::Config *configuration,
SurfaceImpl *createPixmapSurface(const egl::SurfaceState &state,
const egl::Config *configuration,
NativePixmapType nativePixmap,
const egl::AttributeMap &attribs) override;

Просмотреть файл

@ -109,22 +109,25 @@ void DisplayCGL::terminate()
SafeDelete(mFunctions);
}
SurfaceImpl *DisplayCGL::createWindowSurface(const egl::Config *configuration,
SurfaceImpl *DisplayCGL::createWindowSurface(const egl::SurfaceState &state,
const egl::Config *configuration,
EGLNativeWindowType window,
const egl::AttributeMap &attribs)
{
return new WindowSurfaceCGL(this->getRenderer(), window, mFunctions, mContext);
return new WindowSurfaceCGL(state, this->getRenderer(), window, mFunctions, mContext);
}
SurfaceImpl *DisplayCGL::createPbufferSurface(const egl::Config *configuration,
SurfaceImpl *DisplayCGL::createPbufferSurface(const egl::SurfaceState &state,
const egl::Config *configuration,
const egl::AttributeMap &attribs)
{
EGLint width = static_cast<EGLint>(attribs.get(EGL_WIDTH, 0));
EGLint height = static_cast<EGLint>(attribs.get(EGL_HEIGHT, 0));
return new PbufferSurfaceCGL(this->getRenderer(), width, height, mFunctions);
return new PbufferSurfaceCGL(state, this->getRenderer(), width, height, mFunctions);
}
SurfaceImpl* DisplayCGL::createPbufferFromClientBuffer(const egl::Config *configuration,
SurfaceImpl *DisplayCGL::createPbufferFromClientBuffer(const egl::SurfaceState &state,
const egl::Config *configuration,
EGLClientBuffer shareHandle,
const egl::AttributeMap &attribs)
{
@ -132,7 +135,8 @@ SurfaceImpl* DisplayCGL::createPbufferFromClientBuffer(const egl::Config *config
return nullptr;
}
SurfaceImpl *DisplayCGL::createPixmapSurface(const egl::Config *configuration,
SurfaceImpl *DisplayCGL::createPixmapSurface(const egl::SurfaceState &state,
const egl::Config *configuration,
NativePixmapType nativePixmap,
const egl::AttributeMap &attribs)
{

Просмотреть файл

@ -22,7 +22,8 @@ struct WorkaroundsGL;
class PbufferSurfaceCGL : public SurfaceGL
{
public:
PbufferSurfaceCGL(RendererGL *renderer,
PbufferSurfaceCGL(const egl::SurfaceState &state,
RendererGL *renderer,
EGLint width,
EGLint height,
const FunctionsGL *functions);

Просмотреть файл

@ -18,11 +18,12 @@
namespace rx
{
PbufferSurfaceCGL::PbufferSurfaceCGL(RendererGL *renderer,
PbufferSurfaceCGL::PbufferSurfaceCGL(const egl::SurfaceState &state,
RendererGL *renderer,
EGLint width,
EGLint height,
const FunctionsGL *functions)
: SurfaceGL(renderer),
: SurfaceGL(state, renderer),
mWidth(width),
mHeight(height),
mFunctions(functions),

Просмотреть файл

@ -54,7 +54,8 @@ struct SharedSwapState
class WindowSurfaceCGL : public SurfaceGL
{
public:
WindowSurfaceCGL(RendererGL *renderer,
WindowSurfaceCGL(const egl::SurfaceState &state,
RendererGL *renderer,
CALayer *layer,
const FunctionsGL *functions,
CGLContextObj context);

Просмотреть файл

@ -142,11 +142,12 @@
namespace rx
{
WindowSurfaceCGL::WindowSurfaceCGL(RendererGL *renderer,
WindowSurfaceCGL::WindowSurfaceCGL(const egl::SurfaceState &state,
RendererGL *renderer,
CALayer *layer,
const FunctionsGL *functions,
CGLContextObj context)
: SurfaceGL(renderer),
: SurfaceGL(state, renderer),
mSwapLayer(nil),
mCurrentSwapId(0),
mLayer(layer),

Просмотреть файл

@ -830,7 +830,8 @@ void DisplayOzone::terminate()
close(fd);
}
SurfaceImpl *DisplayOzone::createWindowSurface(const egl::Config *configuration,
SurfaceImpl *DisplayOzone::createWindowSurface(const egl::SurfaceState &state,
const egl::Config *configuration,
EGLNativeWindowType window,
const egl::AttributeMap &attribs)
{
@ -840,10 +841,11 @@ SurfaceImpl *DisplayOzone::createWindowSurface(const egl::Config *configuration,
{
return nullptr;
}
return new SurfaceOzone(getRenderer(), buffer);
return new SurfaceOzone(state, getRenderer(), buffer);
}
SurfaceImpl *DisplayOzone::createPbufferSurface(const egl::Config *configuration,
SurfaceImpl *DisplayOzone::createPbufferSurface(const egl::SurfaceState &state,
const egl::Config *configuration,
const egl::AttributeMap &attribs)
{
EGLAttrib width = attribs.get(EGL_WIDTH, 0);
@ -854,10 +856,11 @@ SurfaceImpl *DisplayOzone::createPbufferSurface(const egl::Config *configuration
{
return nullptr;
}
return new SurfaceOzone(getRenderer(), buffer);
return new SurfaceOzone(state, getRenderer(), buffer);
}
SurfaceImpl *DisplayOzone::createPbufferFromClientBuffer(const egl::Config *configuration,
SurfaceImpl *DisplayOzone::createPbufferFromClientBuffer(const egl::SurfaceState &state,
const egl::Config *configuration,
EGLClientBuffer shareHandle,
const egl::AttributeMap &attribs)
{
@ -865,7 +868,8 @@ SurfaceImpl *DisplayOzone::createPbufferFromClientBuffer(const egl::Config *conf
return nullptr;
}
SurfaceImpl *DisplayOzone::createPixmapSurface(const egl::Config *configuration,
SurfaceImpl *DisplayOzone::createPixmapSurface(const egl::SurfaceState &state,
const egl::Config *configuration,
NativePixmapType nativePixmap,
const egl::AttributeMap &attribs)
{

Просмотреть файл

@ -109,15 +109,19 @@ class DisplayOzone final : public DisplayGL
egl::Error initialize(egl::Display *display) override;
void terminate() override;
SurfaceImpl *createWindowSurface(const egl::Config *configuration,
SurfaceImpl *createWindowSurface(const egl::SurfaceState &state,
const egl::Config *configuration,
EGLNativeWindowType window,
const egl::AttributeMap &attribs) override;
SurfaceImpl *createPbufferSurface(const egl::Config *configuration,
SurfaceImpl *createPbufferSurface(const egl::SurfaceState &state,
const egl::Config *configuration,
const egl::AttributeMap &attribs) override;
SurfaceImpl *createPbufferFromClientBuffer(const egl::Config *configuration,
SurfaceImpl *createPbufferFromClientBuffer(const egl::SurfaceState &state,
const egl::Config *configuration,
EGLClientBuffer shareHandle,
const egl::AttributeMap &attribs) override;
SurfaceImpl *createPixmapSurface(const egl::Config *configuration,
SurfaceImpl *createPixmapSurface(const egl::SurfaceState &state,
const egl::Config *configuration,
NativePixmapType nativePixmap,
const egl::AttributeMap &attribs) override;

Просмотреть файл

@ -14,8 +14,10 @@
namespace rx
{
SurfaceOzone::SurfaceOzone(RendererGL *renderer, DisplayOzone::Buffer *buffer)
: SurfaceGL(renderer), mBuffer(buffer)
SurfaceOzone::SurfaceOzone(const egl::SurfaceState &state,
RendererGL *renderer,
DisplayOzone::Buffer *buffer)
: SurfaceGL(state, renderer), mBuffer(buffer)
{
}

Просмотреть файл

@ -18,7 +18,9 @@ namespace rx
class SurfaceOzone : public SurfaceGL
{
public:
SurfaceOzone(RendererGL *renderer, DisplayOzone::Buffer *buffer);
SurfaceOzone(const egl::SurfaceState &state,
RendererGL *renderer,
DisplayOzone::Buffer *buffer);
~SurfaceOzone() override;
FramebufferImpl *createDefaultFramebuffer(const gl::FramebufferState &state) override;

Просмотреть файл

@ -382,18 +382,20 @@ void DisplayGLX::terminate()
SafeDelete(mFunctionsGL);
}
SurfaceImpl *DisplayGLX::createWindowSurface(const egl::Config *configuration,
SurfaceImpl *DisplayGLX::createWindowSurface(const egl::SurfaceState &state,
const egl::Config *configuration,
EGLNativeWindowType window,
const egl::AttributeMap &attribs)
{
ASSERT(configIdToGLXConfig.count(configuration->configID) > 0);
glx::FBConfig fbConfig = configIdToGLXConfig[configuration->configID];
return new WindowSurfaceGLX(mGLX, this, this->getRenderer(), window, mGLX.getDisplay(),
return new WindowSurfaceGLX(state, mGLX, this, this->getRenderer(), window, mGLX.getDisplay(),
mContext, fbConfig);
}
SurfaceImpl *DisplayGLX::createPbufferSurface(const egl::Config *configuration,
SurfaceImpl *DisplayGLX::createPbufferSurface(const egl::SurfaceState &state,
const egl::Config *configuration,
const egl::AttributeMap &attribs)
{
ASSERT(configIdToGLXConfig.count(configuration->configID) > 0);
@ -403,11 +405,12 @@ SurfaceImpl *DisplayGLX::createPbufferSurface(const egl::Config *configuration,
EGLint height = static_cast<EGLint>(attribs.get(EGL_HEIGHT, 0));
bool largest = (attribs.get(EGL_LARGEST_PBUFFER, EGL_FALSE) == EGL_TRUE);
return new PbufferSurfaceGLX(this->getRenderer(), width, height, largest, mGLX, mContext,
return new PbufferSurfaceGLX(state, this->getRenderer(), width, height, largest, mGLX, mContext,
fbConfig);
}
SurfaceImpl* DisplayGLX::createPbufferFromClientBuffer(const egl::Config *configuration,
SurfaceImpl *DisplayGLX::createPbufferFromClientBuffer(const egl::SurfaceState &state,
const egl::Config *configuration,
EGLClientBuffer shareHandle,
const egl::AttributeMap &attribs)
{
@ -415,7 +418,8 @@ SurfaceImpl* DisplayGLX::createPbufferFromClientBuffer(const egl::Config *config
return nullptr;
}
SurfaceImpl *DisplayGLX::createPixmapSurface(const egl::Config *configuration,
SurfaceImpl *DisplayGLX::createPixmapSurface(const egl::SurfaceState &state,
const egl::Config *configuration,
NativePixmapType nativePixmap,
const egl::AttributeMap &attribs)
{

Просмотреть файл

@ -43,15 +43,19 @@ class DisplayGLX : public DisplayGL
egl::Error initialize(egl::Display *display) override;
void terminate() override;
SurfaceImpl *createWindowSurface(const egl::Config *configuration,
SurfaceImpl *createWindowSurface(const egl::SurfaceState &state,
const egl::Config *configuration,
EGLNativeWindowType window,
const egl::AttributeMap &attribs) override;
SurfaceImpl *createPbufferSurface(const egl::Config *configuration,
SurfaceImpl *createPbufferSurface(const egl::SurfaceState &state,
const egl::Config *configuration,
const egl::AttributeMap &attribs) override;
SurfaceImpl *createPbufferFromClientBuffer(const egl::Config *configuration,
SurfaceImpl *createPbufferFromClientBuffer(const egl::SurfaceState &state,
const egl::Config *configuration,
EGLClientBuffer shareHandle,
const egl::AttributeMap &attribs) override;
SurfaceImpl *createPixmapSurface(const egl::Config *configuration,
SurfaceImpl *createPixmapSurface(const egl::SurfaceState &state,
const egl::Config *configuration,
NativePixmapType nativePixmap,
const egl::AttributeMap &attribs) override;

Просмотреть файл

@ -15,14 +15,15 @@
namespace rx
{
PbufferSurfaceGLX::PbufferSurfaceGLX(RendererGL *renderer,
PbufferSurfaceGLX::PbufferSurfaceGLX(const egl::SurfaceState &state,
RendererGL *renderer,
EGLint width,
EGLint height,
bool largest,
const FunctionsGLX &glx,
glx::Context context,
glx::FBConfig fbConfig)
: SurfaceGLX(renderer),
: SurfaceGLX(state, renderer),
mWidth(width),
mHeight(height),
mLargest(largest),

Просмотреть файл

@ -20,7 +20,8 @@ class FunctionsGLX;
class PbufferSurfaceGLX : public SurfaceGLX
{
public:
PbufferSurfaceGLX(RendererGL *renderer,
PbufferSurfaceGLX(const egl::SurfaceState &state,
RendererGL *renderer,
EGLint width,
EGLint height,
bool largest,

Просмотреть файл

@ -17,7 +17,7 @@ namespace rx
class SurfaceGLX : public SurfaceGL
{
public:
SurfaceGLX(RendererGL *renderer) : SurfaceGL(renderer) {}
SurfaceGLX(const egl::SurfaceState &state, RendererGL *renderer) : SurfaceGL(state, renderer) {}
virtual egl::Error checkForResize() = 0;
};

Просмотреть файл

@ -21,14 +21,15 @@ static int IgnoreX11Errors(Display *, XErrorEvent *)
return 0;
}
WindowSurfaceGLX::WindowSurfaceGLX(const FunctionsGLX &glx,
WindowSurfaceGLX::WindowSurfaceGLX(const egl::SurfaceState &state,
const FunctionsGLX &glx,
DisplayGLX *glxDisplay,
RendererGL *renderer,
Window window,
Display *display,
glx::Context context,
glx::FBConfig fbConfig)
: SurfaceGLX(renderer),
: SurfaceGLX(state, renderer),
mParent(window),
mWindow(0),
mDisplay(display),

Просмотреть файл

@ -22,7 +22,8 @@ class FunctionsGLX;
class WindowSurfaceGLX : public SurfaceGLX
{
public:
WindowSurfaceGLX(const FunctionsGLX &glx,
WindowSurfaceGLX(const egl::SurfaceState &state,
const FunctionsGLX &glx,
DisplayGLX *glxDisplay,
RendererGL *renderer,
Window window,

Просмотреть файл

@ -22,7 +22,8 @@
namespace rx
{
DXGISwapChainWindowSurfaceWGL::DXGISwapChainWindowSurfaceWGL(RendererGL *renderer,
DXGISwapChainWindowSurfaceWGL::DXGISwapChainWindowSurfaceWGL(const egl::SurfaceState &state,
RendererGL *renderer,
EGLNativeWindowType window,
ID3D11Device *device,
HANDLE deviceHandle,
@ -31,7 +32,7 @@ DXGISwapChainWindowSurfaceWGL::DXGISwapChainWindowSurfaceWGL(RendererGL *rendere
const FunctionsGL *functionsGL,
const FunctionsWGL *functionsWGL,
EGLint orientation)
: SurfaceGL(renderer),
: SurfaceGL(state, renderer),
mWindow(window),
mStateManager(renderer->getStateManager()),
mWorkarounds(renderer->getWorkarounds()),

Просмотреть файл

@ -26,7 +26,8 @@ struct WorkaroundsGL;
class DXGISwapChainWindowSurfaceWGL : public SurfaceGL
{
public:
DXGISwapChainWindowSurfaceWGL(RendererGL *renderer,
DXGISwapChainWindowSurfaceWGL(const egl::SurfaceState &state,
RendererGL *renderer,
EGLNativeWindowType window,
ID3D11Device *device,
HANDLE deviceHandle,

Просмотреть файл

@ -408,25 +408,27 @@ void DisplayWGL::terminate()
ASSERT(mRegisteredD3DDevices.empty());
}
SurfaceImpl *DisplayWGL::createWindowSurface(const egl::Config *configuration,
SurfaceImpl *DisplayWGL::createWindowSurface(const egl::SurfaceState &state,
const egl::Config *configuration,
EGLNativeWindowType window,
const egl::AttributeMap &attribs)
{
EGLint orientation = static_cast<EGLint>(attribs.get(EGL_SURFACE_ORIENTATION_ANGLE, 0));
if (mUseDXGISwapChains)
{
return new DXGISwapChainWindowSurfaceWGL(this->getRenderer(), window, mD3D11Device,
return new DXGISwapChainWindowSurfaceWGL(state, this->getRenderer(), window, mD3D11Device,
mD3D11DeviceHandle, mWGLContext, mDeviceContext,
mFunctionsGL, mFunctionsWGL, orientation);
}
else
{
return new WindowSurfaceWGL(this->getRenderer(), window, mPixelFormat, mWGLContext,
return new WindowSurfaceWGL(state, this->getRenderer(), window, mPixelFormat, mWGLContext,
mFunctionsWGL, orientation);
}
}
SurfaceImpl *DisplayWGL::createPbufferSurface(const egl::Config *configuration,
SurfaceImpl *DisplayWGL::createPbufferSurface(const egl::SurfaceState &state,
const egl::Config *configuration,
const egl::AttributeMap &attribs)
{
EGLint width = static_cast<EGLint>(attribs.get(EGL_WIDTH, 0));
@ -435,11 +437,13 @@ SurfaceImpl *DisplayWGL::createPbufferSurface(const egl::Config *configuration,
EGLenum textureFormat = static_cast<EGLenum>(attribs.get(EGL_TEXTURE_FORMAT, EGL_NO_TEXTURE));
EGLenum textureTarget = static_cast<EGLenum>(attribs.get(EGL_TEXTURE_TARGET, EGL_NO_TEXTURE));
return new PbufferSurfaceWGL(this->getRenderer(), width, height, textureFormat, textureTarget,
largest, mPixelFormat, mDeviceContext, mWGLContext, mFunctionsWGL);
return new PbufferSurfaceWGL(state, this->getRenderer(), width, height, textureFormat,
textureTarget, largest, mPixelFormat, mDeviceContext, mWGLContext,
mFunctionsWGL);
}
SurfaceImpl *DisplayWGL::createPbufferFromClientBuffer(const egl::Config *configuration,
SurfaceImpl *DisplayWGL::createPbufferFromClientBuffer(const egl::SurfaceState &state,
const egl::Config *configuration,
EGLClientBuffer shareHandle,
const egl::AttributeMap &attribs)
{
@ -447,7 +451,8 @@ SurfaceImpl *DisplayWGL::createPbufferFromClientBuffer(const egl::Config *config
return nullptr;
}
SurfaceImpl *DisplayWGL::createPixmapSurface(const egl::Config *configuration,
SurfaceImpl *DisplayWGL::createPixmapSurface(const egl::SurfaceState &state,
const egl::Config *configuration,
NativePixmapType nativePixmap,
const egl::AttributeMap &attribs)
{

Просмотреть файл

@ -28,15 +28,19 @@ class DisplayWGL : public DisplayGL
void terminate() override;
// Surface creation
SurfaceImpl *createWindowSurface(const egl::Config *configuration,
SurfaceImpl *createWindowSurface(const egl::SurfaceState &state,
const egl::Config *configuration,
EGLNativeWindowType window,
const egl::AttributeMap &attribs) override;
SurfaceImpl *createPbufferSurface(const egl::Config *configuration,
SurfaceImpl *createPbufferSurface(const egl::SurfaceState &state,
const egl::Config *configuration,
const egl::AttributeMap &attribs) override;
SurfaceImpl *createPbufferFromClientBuffer(const egl::Config *configuration,
SurfaceImpl *createPbufferFromClientBuffer(const egl::SurfaceState &state,
const egl::Config *configuration,
EGLClientBuffer shareHandle,
const egl::AttributeMap &attribs) override;
SurfaceImpl *createPixmapSurface(const egl::Config *configuration,
SurfaceImpl *createPixmapSurface(const egl::SurfaceState &state,
const egl::Config *configuration,
NativePixmapType nativePixmap,
const egl::AttributeMap &attribs) override;

Просмотреть файл

@ -16,7 +16,8 @@
namespace rx
{
PbufferSurfaceWGL::PbufferSurfaceWGL(RendererGL *renderer,
PbufferSurfaceWGL::PbufferSurfaceWGL(const egl::SurfaceState &state,
RendererGL *renderer,
EGLint width,
EGLint height,
EGLenum textureFormat,
@ -26,7 +27,7 @@ PbufferSurfaceWGL::PbufferSurfaceWGL(RendererGL *renderer,
HDC deviceContext,
HGLRC wglContext,
const FunctionsWGL *functions)
: SurfaceGL(renderer),
: SurfaceGL(state, renderer),
mWidth(width),
mHeight(height),
mLargest(largest),

Просмотреть файл

@ -21,7 +21,8 @@ class FunctionsWGL;
class PbufferSurfaceWGL : public SurfaceGL
{
public:
PbufferSurfaceWGL(RendererGL *renderer,
PbufferSurfaceWGL(const egl::SurfaceState &state,
RendererGL *renderer,
EGLint width,
EGLint height,
EGLenum textureFormat,

Просмотреть файл

@ -16,13 +16,14 @@
namespace rx
{
WindowSurfaceWGL::WindowSurfaceWGL(RendererGL *renderer,
WindowSurfaceWGL::WindowSurfaceWGL(const egl::SurfaceState &state,
RendererGL *renderer,
EGLNativeWindowType window,
int pixelFormat,
HGLRC wglContext,
const FunctionsWGL *functions,
EGLint orientation)
: SurfaceGL(renderer),
: SurfaceGL(state, renderer),
mPixelFormat(pixelFormat),
mWGLContext(wglContext),
mWindow(window),

Просмотреть файл

@ -21,7 +21,8 @@ class FunctionsWGL;
class WindowSurfaceWGL : public SurfaceGL
{
public:
WindowSurfaceWGL(RendererGL *renderer,
WindowSurfaceWGL(const egl::SurfaceState &state,
RendererGL *renderer,
EGLNativeWindowType window,
int pixelFormat,
HGLRC wglContext,

Просмотреть файл

@ -9,6 +9,7 @@
#ifndef TESTS_ANGLE_UNITTESTS_UTILS_H_
#define TESTS_ANGLE_UNITTESTS_UTILS_H_
#include "libANGLE/Surface.h"
#include "libANGLE/renderer/ContextImpl.h"
#include "libANGLE/renderer/EGLImplFactory.h"
#include "libANGLE/renderer/GLImplFactory.h"
@ -83,16 +84,25 @@ class MockGLFactory : public GLImplFactory
class MockEGLFactory : public EGLImplFactory
{
public:
MOCK_METHOD3(createWindowSurface,
SurfaceImpl *(const egl::Config *,
MOCK_METHOD4(createWindowSurface,
SurfaceImpl *(const egl::SurfaceState &,
const egl::Config *,
EGLNativeWindowType,
const egl::AttributeMap &));
MOCK_METHOD2(createPbufferSurface,
SurfaceImpl *(const egl::Config *, const egl::AttributeMap &));
MOCK_METHOD3(createPbufferFromClientBuffer,
SurfaceImpl *(const egl::Config *, EGLClientBuffer, const egl::AttributeMap &));
MOCK_METHOD3(createPixmapSurface,
SurfaceImpl *(const egl::Config *, NativePixmapType, const egl::AttributeMap &));
MOCK_METHOD3(createPbufferSurface,
SurfaceImpl *(const egl::SurfaceState &,
const egl::Config *,
const egl::AttributeMap &));
MOCK_METHOD4(createPbufferFromClientBuffer,
SurfaceImpl *(const egl::SurfaceState &,
const egl::Config *,
EGLClientBuffer,
const egl::AttributeMap &));
MOCK_METHOD4(createPixmapSurface,
SurfaceImpl *(const egl::SurfaceState &,
const egl::Config *,
NativePixmapType,
const egl::AttributeMap &));
MOCK_METHOD3(createImage, ImageImpl *(EGLenum, egl::ImageSibling *, const egl::AttributeMap &));
MOCK_METHOD1(createContext, ContextImpl *(const gl::ContextState &));
MOCK_METHOD2(createStreamProducerD3DTextureNV12,