Commit f6bf23fd by Geoff Lang

Split up the Display::create*Surface and have them match the API.

BUG=angle:658 Change-Id: Id0054406a5ce6f6ffef28ce84737547c1869efde Reviewed-on: https://chromium-review.googlesource.com/242038Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarBrandon Jones <bajones@chromium.org> Tested-by: 's avatarGeoff Lang <geofflang@chromium.org>
parent 9b82084f
...@@ -227,17 +227,35 @@ bool Display::getConfigAttrib(const Config *configuration, EGLint attribute, EGL ...@@ -227,17 +227,35 @@ bool Display::getConfigAttrib(const Config *configuration, EGLint attribute, EGL
Error Display::createWindowSurface(const Config *configuration, EGLNativeWindowType window, const AttributeMap &attribs, Error Display::createWindowSurface(const Config *configuration, EGLNativeWindowType window, const AttributeMap &attribs,
Surface **outSurface) Surface **outSurface)
{ {
EGLint postSubBufferSupported = attribs.get(EGL_POST_SUB_BUFFER_SUPPORTED_NV, EGL_FALSE); if (mImplementation->testDeviceLost())
EGLint width = attribs.get(EGL_WIDTH, 0); {
EGLint height = attribs.get(EGL_HEIGHT, 0); Error error = restoreLostDevice();
EGLint fixedSize = attribs.get(EGL_FIXED_SIZE_ANGLE, EGL_FALSE); if (error.isError())
{
return error;
}
}
if (!fixedSize) rx::SurfaceImpl *surfaceImpl = nullptr;
Error error = mImplementation->createWindowSurface(configuration, window, attribs, &surfaceImpl);
if (error.isError())
{ {
width = -1; return error;
height = -1;
} }
ASSERT(surfaceImpl != nullptr);
Surface *surface = new Surface(surfaceImpl);
mImplementation->getSurfaceSet().insert(surface);
ASSERT(outSurface != nullptr);
*outSurface = surface;
return Error(EGL_SUCCESS);
}
Error Display::createPbufferSurface(const Config *configuration, const AttributeMap &attribs, Surface **outSurface)
{
ASSERT(isInitialized());
if (mImplementation->testDeviceLost()) if (mImplementation->testDeviceLost())
{ {
Error error = restoreLostDevice(); Error error = restoreLostDevice();
...@@ -247,31 +265,26 @@ Error Display::createWindowSurface(const Config *configuration, EGLNativeWindowT ...@@ -247,31 +265,26 @@ Error Display::createWindowSurface(const Config *configuration, EGLNativeWindowT
} }
} }
rx::SurfaceImpl *surfaceImpl = mImplementation->createWindowSurface(this, configuration, window, rx::SurfaceImpl *surfaceImpl = nullptr;
fixedSize, width, height, Error error = mImplementation->createPbufferSurface(configuration, attribs, &surfaceImpl);
postSubBufferSupported);
Surface *surface = new Surface(surfaceImpl);
Error error = surface->initialize();
if (error.isError()) if (error.isError())
{ {
SafeDelete(surface);
return error; return error;
} }
ASSERT(surfaceImpl != nullptr);
Surface *surface = new Surface(surfaceImpl);
mImplementation->getSurfaceSet().insert(surface); mImplementation->getSurfaceSet().insert(surface);
ASSERT(outSurface != nullptr);
*outSurface = surface; *outSurface = surface;
return Error(EGL_SUCCESS); return Error(EGL_SUCCESS);
} }
Error Display::createOffscreenSurface(const Config *configuration, EGLClientBuffer shareHandle, const AttributeMap &attribs, Error Display::createPbufferFromClientBuffer(const Config *configuration, EGLClientBuffer shareHandle,
Surface **outSurface) const AttributeMap &attribs, Surface **outSurface)
{ {
EGLint width = attribs.get(EGL_WIDTH, 0); ASSERT(isInitialized());
EGLint height = attribs.get(EGL_HEIGHT, 0);
EGLenum textureFormat = attribs.get(EGL_TEXTURE_FORMAT, EGL_NO_TEXTURE);
EGLenum textureTarget = attribs.get(EGL_TEXTURE_TARGET, EGL_NO_TEXTURE);
if (mImplementation->testDeviceLost()) if (mImplementation->testDeviceLost())
{ {
...@@ -282,19 +295,18 @@ Error Display::createOffscreenSurface(const Config *configuration, EGLClientBuff ...@@ -282,19 +295,18 @@ Error Display::createOffscreenSurface(const Config *configuration, EGLClientBuff
} }
} }
rx::SurfaceImpl *surfaceImpl = mImplementation->createOffscreenSurface(this, configuration, shareHandle, rx::SurfaceImpl *surfaceImpl = nullptr;
width, height, textureFormat, textureTarget); Error error = mImplementation->createPbufferFromClientBuffer(configuration, shareHandle, attribs, &surfaceImpl);
Surface *surface = new Surface(surfaceImpl);
Error error = surface->initialize();
if (error.isError()) if (error.isError())
{ {
SafeDelete(surface);
return error; return error;
} }
ASSERT(surfaceImpl != nullptr);
Surface *surface = new Surface(surfaceImpl);
mImplementation->getSurfaceSet().insert(surface); mImplementation->getSurfaceSet().insert(surface);
ASSERT(outSurface != nullptr);
*outSurface = surface; *outSurface = surface;
return Error(EGL_SUCCESS); return Error(EGL_SUCCESS);
} }
...@@ -323,6 +335,7 @@ Error Display::createContext(const Config *configuration, gl::Context *shareCont ...@@ -323,6 +335,7 @@ Error Display::createContext(const Config *configuration, gl::Context *shareCont
ASSERT(context != nullptr); ASSERT(context != nullptr);
mContextSet.insert(context); mContextSet.insert(context);
ASSERT(outContext != nullptr);
*outContext = context; *outContext = context;
return Error(EGL_SUCCESS); return Error(EGL_SUCCESS);
} }
......
...@@ -51,8 +51,10 @@ class Display final ...@@ -51,8 +51,10 @@ class Display final
Error createWindowSurface(const Config *configuration, EGLNativeWindowType window, const AttributeMap &attribs, Error createWindowSurface(const Config *configuration, EGLNativeWindowType window, const AttributeMap &attribs,
Surface **outSurface); Surface **outSurface);
Error createOffscreenSurface(const Config *configuration, EGLClientBuffer shareHandle, const AttributeMap &attribs, Error createPbufferSurface(const Config *configuration, const AttributeMap &attribs, Surface **outSurface);
Surface **outSurface); Error createPbufferFromClientBuffer(const Config *configuration, EGLClientBuffer shareHandle, const AttributeMap &attribs,
Surface **outSurface);
Error createContext(const Config *configuration, gl::Context *shareContext, const AttributeMap &attribs, Error createContext(const Config *configuration, gl::Context *shareContext, const AttributeMap &attribs,
gl::Context **outContext); gl::Context **outContext);
......
...@@ -25,7 +25,6 @@ Surface::Surface(rx::SurfaceImpl *impl) ...@@ -25,7 +25,6 @@ Surface::Surface(rx::SurfaceImpl *impl)
mSwapBehavior(EGL_BUFFER_PRESERVED), mSwapBehavior(EGL_BUFFER_PRESERVED),
mTexture(NULL) mTexture(NULL)
{ {
setSwapInterval(1);
} }
Surface::~Surface() Surface::~Surface()
...@@ -43,11 +42,6 @@ Surface::~Surface() ...@@ -43,11 +42,6 @@ Surface::~Surface()
SafeDelete(mImplementation); SafeDelete(mImplementation);
} }
Error Surface::initialize()
{
return mImplementation->initialize();
}
EGLNativeWindowType Surface::getWindowHandle() const EGLNativeWindowType Surface::getWindowHandle() const
{ {
return mImplementation->getWindowHandle(); return mImplementation->getWindowHandle();
......
...@@ -39,7 +39,6 @@ class Surface final ...@@ -39,7 +39,6 @@ class Surface final
rx::SurfaceImpl *getImplementation() const { return mImplementation; } rx::SurfaceImpl *getImplementation() const { return mImplementation; }
Error initialize();
Error swap(); Error swap();
Error postSubBuffer(EGLint x, EGLint y, EGLint width, EGLint height); Error postSubBuffer(EGLint x, EGLint y, EGLint width, EGLint height);
Error querySurfacePointerANGLE(EGLint attribute, void **value); Error querySurfacePointerANGLE(EGLint attribute, void **value);
......
...@@ -45,12 +45,12 @@ class DisplayImpl ...@@ -45,12 +45,12 @@ class DisplayImpl
virtual egl::Error initialize(egl::Display *display) = 0; virtual egl::Error initialize(egl::Display *display) = 0;
virtual void terminate() = 0; virtual void terminate() = 0;
virtual SurfaceImpl *createWindowSurface(egl::Display *display, const egl::Config *config, virtual egl::Error createWindowSurface(const egl::Config *configuration, EGLNativeWindowType window, const egl::AttributeMap &attribs,
EGLNativeWindowType window, EGLint fixedSize, SurfaceImpl **outSurface) = 0;
EGLint width, EGLint height, EGLint postSubBufferSupported) = 0; virtual egl::Error createPbufferSurface(const egl::Config *configuration, const egl::AttributeMap &attribs,
virtual SurfaceImpl *createOffscreenSurface(egl::Display *display, const egl::Config *config, SurfaceImpl **outSurface) = 0;
EGLClientBuffer shareHandle, EGLint width, EGLint height, virtual egl::Error createPbufferFromClientBuffer(const egl::Config *configuration, EGLClientBuffer shareHandle,
EGLenum textureFormat, EGLenum textureTarget) = 0; const egl::AttributeMap &attribs, SurfaceImpl **outSurface) = 0;
virtual egl::Error createContext(const egl::Config *config, const gl::Context *shareContext, const egl::AttributeMap &attribs, virtual egl::Error createContext(const egl::Config *config, const gl::Context *shareContext, const egl::AttributeMap &attribs,
gl::Context **outContext) = 0; gl::Context **outContext) = 0;
......
...@@ -21,7 +21,7 @@ SurfaceImpl::SurfaceImpl(egl::Display *display, const egl::Config *config, EGLin ...@@ -21,7 +21,7 @@ SurfaceImpl::SurfaceImpl(egl::Display *display, const egl::Config *config, EGLin
mWidth(width), mWidth(width),
mHeight(height), mHeight(height),
mFixedSize(fixedSize), mFixedSize(fixedSize),
mSwapInterval(-1), mSwapInterval(1),
mPostSubBufferSupported(postSubBufferSupported), mPostSubBufferSupported(postSubBufferSupported),
mTextureFormat(textureFormat), mTextureFormat(textureFormat),
mTextureTarget(textureType), mTextureTarget(textureType),
......
...@@ -122,24 +122,79 @@ DisplayD3D::DisplayD3D() ...@@ -122,24 +122,79 @@ DisplayD3D::DisplayD3D()
{ {
} }
SurfaceImpl *DisplayD3D::createWindowSurface(egl::Display *display, const egl::Config *config, egl::Error DisplayD3D::createWindowSurface(const egl::Config *configuration, EGLNativeWindowType window,
EGLNativeWindowType window, EGLint fixedSize, const egl::AttributeMap &attribs, SurfaceImpl **outSurface)
EGLint width, EGLint height, EGLint postSubBufferSupported)
{ {
ASSERT(mRenderer != nullptr); ASSERT(mRenderer != nullptr);
return SurfaceD3D::createFromWindow(mRenderer, display, config, window, fixedSize, EGLint postSubBufferSupported = attribs.get(EGL_POST_SUB_BUFFER_SUPPORTED_NV, EGL_FALSE);
width, height, postSubBufferSupported); EGLint width = attribs.get(EGL_WIDTH, 0);
EGLint height = attribs.get(EGL_HEIGHT, 0);
EGLint fixedSize = attribs.get(EGL_FIXED_SIZE_ANGLE, EGL_FALSE);
if (!fixedSize)
{
width = -1;
height = -1;
}
SurfaceD3D *surface = SurfaceD3D::createFromWindow(mRenderer, mDisplay, configuration, window, fixedSize,
width, height, postSubBufferSupported);
egl::Error error = surface->initialize();
if (error.isError())
{
SafeDelete(surface);
return error;
}
*outSurface = surface;
return egl::Error(EGL_SUCCESS);
}
egl::Error DisplayD3D::createPbufferSurface(const egl::Config *configuration, const egl::AttributeMap &attribs,
SurfaceImpl **outSurface)
{
ASSERT(mRenderer != nullptr);
EGLint width = attribs.get(EGL_WIDTH, 0);
EGLint height = attribs.get(EGL_HEIGHT, 0);
EGLenum textureFormat = attribs.get(EGL_TEXTURE_FORMAT, EGL_NO_TEXTURE);
EGLenum textureTarget = attribs.get(EGL_TEXTURE_TARGET, EGL_NO_TEXTURE);
SurfaceD3D *surface = SurfaceD3D::createOffscreen(mRenderer, mDisplay, configuration, NULL,
width, height, textureFormat, textureTarget);
egl::Error error = surface->initialize();
if (error.isError())
{
SafeDelete(surface);
return error;
}
*outSurface = surface;
return egl::Error(EGL_SUCCESS);
} }
SurfaceImpl *DisplayD3D::createOffscreenSurface(egl::Display *display, const egl::Config *config, egl::Error DisplayD3D::createPbufferFromClientBuffer(const egl::Config *configuration, EGLClientBuffer shareHandle,
EGLClientBuffer shareHandle, EGLint width, EGLint height, const egl::AttributeMap &attribs, SurfaceImpl **outSurface)
EGLenum textureFormat, EGLenum textureTarget)
{ {
ASSERT(mRenderer != nullptr); ASSERT(mRenderer != nullptr);
return SurfaceD3D::createOffscreen(mRenderer, display, config, shareHandle, EGLint width = attribs.get(EGL_WIDTH, 0);
width, height, textureFormat, textureTarget); EGLint height = attribs.get(EGL_HEIGHT, 0);
EGLenum textureFormat = attribs.get(EGL_TEXTURE_FORMAT, EGL_NO_TEXTURE);
EGLenum textureTarget = attribs.get(EGL_TEXTURE_TARGET, EGL_NO_TEXTURE);
SurfaceD3D *surface = SurfaceD3D::createOffscreen(mRenderer, mDisplay, configuration, shareHandle,
width, height, textureFormat, textureTarget);
egl::Error error = surface->initialize();
if (error.isError())
{
SafeDelete(surface);
return error;
}
*outSurface = surface;
return egl::Error(EGL_SUCCESS);
} }
egl::Error DisplayD3D::createContext(const egl::Config *config, const gl::Context *shareContext, const egl::AttributeMap &attribs, egl::Error DisplayD3D::createContext(const egl::Config *config, const gl::Context *shareContext, const egl::AttributeMap &attribs,
...@@ -163,6 +218,7 @@ egl::Error DisplayD3D::makeCurrent(egl::Surface *drawSurface, egl::Surface *read ...@@ -163,6 +218,7 @@ egl::Error DisplayD3D::makeCurrent(egl::Surface *drawSurface, egl::Surface *read
egl::Error DisplayD3D::initialize(egl::Display *display) egl::Error DisplayD3D::initialize(egl::Display *display)
{ {
ASSERT(mRenderer == nullptr && display != nullptr); ASSERT(mRenderer == nullptr && display != nullptr);
mDisplay = display;
return CreateRendererD3D(display, &mRenderer); return CreateRendererD3D(display, &mRenderer);
} }
......
...@@ -23,12 +23,12 @@ class DisplayD3D : public DisplayImpl ...@@ -23,12 +23,12 @@ class DisplayD3D : public DisplayImpl
egl::Error initialize(egl::Display *display) override; egl::Error initialize(egl::Display *display) override;
virtual void terminate() override; virtual void terminate() override;
SurfaceImpl *createWindowSurface(egl::Display *display, const egl::Config *config, egl::Error createWindowSurface(const egl::Config *configuration, EGLNativeWindowType window, const egl::AttributeMap &attribs,
EGLNativeWindowType window, EGLint fixedSize, SurfaceImpl **outSurface) override;
EGLint width, EGLint height, EGLint postSubBufferSupported) override; egl::Error createPbufferSurface(const egl::Config *configuration, const egl::AttributeMap &attribs,
SurfaceImpl *createOffscreenSurface(egl::Display *display, const egl::Config *config, SurfaceImpl **outSurface) override;
EGLClientBuffer shareHandle, EGLint width, EGLint height, egl::Error createPbufferFromClientBuffer(const egl::Config *configuration, EGLClientBuffer shareHandle,
EGLenum textureFormat, EGLenum textureTarget) override; const egl::AttributeMap &attribs, SurfaceImpl **outSurface) override;
egl::Error createContext(const egl::Config *config, const gl::Context *shareContext, const egl::AttributeMap &attribs, egl::Error createContext(const egl::Config *config, const gl::Context *shareContext, const egl::AttributeMap &attribs,
gl::Context **outContext) override; gl::Context **outContext) override;
...@@ -51,6 +51,8 @@ class DisplayD3D : public DisplayImpl ...@@ -51,6 +51,8 @@ class DisplayD3D : public DisplayImpl
void generateExtensions(egl::DisplayExtensions *outExtensions) const override; void generateExtensions(egl::DisplayExtensions *outExtensions) const override;
void generateCaps(egl::Caps *outCaps) const override; void generateCaps(egl::Caps *outCaps) const override;
egl::Display *mDisplay;
rx::RendererD3D *mRenderer; rx::RendererD3D *mRenderer;
}; };
......
...@@ -40,6 +40,7 @@ SurfaceD3D::SurfaceD3D(RendererD3D *renderer, egl::Display *display, const egl:: ...@@ -40,6 +40,7 @@ SurfaceD3D::SurfaceD3D(RendererD3D *renderer, egl::Display *display, const egl::
: SurfaceImpl(display, config, width, height, fixedSize, postSubBufferSupported, textureFormat, textureType, shareHandle), : SurfaceImpl(display, config, width, height, fixedSize, postSubBufferSupported, textureFormat, textureType, shareHandle),
mRenderer(renderer), mRenderer(renderer),
mSwapChain(NULL), mSwapChain(NULL),
mSwapIntervalDirty(true),
mWindowSubclassed(false), mWindowSubclassed(false),
mNativeWindow(window) mNativeWindow(window)
{ {
......
...@@ -35,6 +35,7 @@ class SurfaceD3D : public SurfaceImpl ...@@ -35,6 +35,7 @@ class SurfaceD3D : public SurfaceImpl
void releaseSwapChain(); void releaseSwapChain();
egl::Error initialize() override; egl::Error initialize() override;
egl::Error swap() override; egl::Error swap() override;
egl::Error postSubBuffer(EGLint x, EGLint y, EGLint width, EGLint height) override; egl::Error postSubBuffer(EGLint x, EGLint y, EGLint width, EGLint height) override;
egl::Error querySurfacePointerANGLE(EGLint attribute, void **value) override; egl::Error querySurfacePointerANGLE(EGLint attribute, void **value) override;
......
...@@ -282,7 +282,7 @@ EGLSurface EGLAPIENTRY CreatePbufferSurface(EGLDisplay dpy, EGLConfig config, co ...@@ -282,7 +282,7 @@ EGLSurface EGLAPIENTRY CreatePbufferSurface(EGLDisplay dpy, EGLConfig config, co
} }
egl::Surface *surface = nullptr; egl::Surface *surface = nullptr;
error = display->createOffscreenSurface(configuration, NULL, attributes, &surface); error = display->createPbufferSurface(configuration, attributes, &surface);
if (error.isError()) if (error.isError())
{ {
SetGlobalError(error); SetGlobalError(error);
...@@ -932,7 +932,7 @@ EGLSurface EGLAPIENTRY CreatePbufferFromClientBuffer(EGLDisplay dpy, EGLenum buf ...@@ -932,7 +932,7 @@ EGLSurface EGLAPIENTRY CreatePbufferFromClientBuffer(EGLDisplay dpy, EGLenum buf
} }
egl::Surface *surface = nullptr; egl::Surface *surface = nullptr;
error = display->createOffscreenSurface(configuration, buffer, attributes, &surface); error = display->createPbufferFromClientBuffer(configuration, buffer, attributes, &surface);
if (error.isError()) if (error.isError())
{ {
SetGlobalError(error); SetGlobalError(error);
......
...@@ -35,7 +35,6 @@ class SurfaceTest : public testing::Test ...@@ -35,7 +35,6 @@ class SurfaceTest : public testing::Test
virtual void SetUp() virtual void SetUp()
{ {
mImpl = new MockSurfaceImpl; mImpl = new MockSurfaceImpl;
EXPECT_CALL(*mImpl, setSwapInterval(1));
EXPECT_CALL(*mImpl, destroy()); EXPECT_CALL(*mImpl, destroy());
mSurface = new egl::Surface(mImpl); mSurface = new egl::Surface(mImpl);
} }
...@@ -52,7 +51,6 @@ class SurfaceTest : public testing::Test ...@@ -52,7 +51,6 @@ class SurfaceTest : public testing::Test
TEST_F(SurfaceTest, DestructionDeletesImpl) TEST_F(SurfaceTest, DestructionDeletesImpl)
{ {
MockSurfaceImpl *impl = new MockSurfaceImpl; MockSurfaceImpl *impl = new MockSurfaceImpl;
EXPECT_CALL(*impl, setSwapInterval(1)).Times(1).RetiresOnSaturation();
EXPECT_CALL(*impl, destroy()).Times(1).RetiresOnSaturation(); EXPECT_CALL(*impl, destroy()).Times(1).RetiresOnSaturation();
egl::Surface *surface = new egl::Surface(impl); egl::Surface *surface = new egl::Surface(impl);
......
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