Commit 443e1d9b by Jamie Madill

Refactor egl::Surface constructors.

We can reduce the code in these classes quite a bit by calling the common code in egl::Display. BUG=angleproject:994 Change-Id: Idf0ffa054fc6a70cf8c65a0b98fd963911715591 Reviewed-on: https://chromium-review.googlesource.com/269258Reviewed-by: 's avatarKenneth Russell <kbr@chromium.org> Tested-by: 's avatarJamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarGeoff Lang <geofflang@chromium.org>
parent 9ff785ee
...@@ -350,14 +350,16 @@ Error Display::createWindowSurface(const Config *configuration, EGLNativeWindowT ...@@ -350,14 +350,16 @@ Error Display::createWindowSurface(const Config *configuration, EGLNativeWindowT
} }
} }
rx::SurfaceImpl *surfaceImpl = nullptr; rx::SurfaceImpl *surfaceImpl = mImplementation->createWindowSurface(configuration, window, attribs);
Error error = mImplementation->createWindowSurface(configuration, window, attribs, &surfaceImpl); ASSERT(surfaceImpl != nullptr);
Error error = surfaceImpl->initialize();
if (error.isError()) if (error.isError())
{ {
SafeDelete(surfaceImpl);
return error; return error;
} }
ASSERT(surfaceImpl != nullptr);
Surface *surface = new Surface(surfaceImpl, EGL_WINDOW_BIT, configuration, attribs); Surface *surface = new Surface(surfaceImpl, EGL_WINDOW_BIT, configuration, attribs);
mImplementation->getSurfaceSet().insert(surface); mImplementation->getSurfaceSet().insert(surface);
...@@ -383,14 +385,16 @@ Error Display::createPbufferSurface(const Config *configuration, const Attribute ...@@ -383,14 +385,16 @@ Error Display::createPbufferSurface(const Config *configuration, const Attribute
} }
} }
rx::SurfaceImpl *surfaceImpl = nullptr; rx::SurfaceImpl *surfaceImpl = mImplementation->createPbufferSurface(configuration, attribs);
Error error = mImplementation->createPbufferSurface(configuration, attribs, &surfaceImpl); ASSERT(surfaceImpl != nullptr);
Error error = surfaceImpl->initialize();
if (error.isError()) if (error.isError())
{ {
SafeDelete(surfaceImpl);
return error; return error;
} }
ASSERT(surfaceImpl != nullptr);
Surface *surface = new Surface(surfaceImpl, EGL_PBUFFER_BIT, configuration, attribs); Surface *surface = new Surface(surfaceImpl, EGL_PBUFFER_BIT, configuration, attribs);
mImplementation->getSurfaceSet().insert(surface); mImplementation->getSurfaceSet().insert(surface);
...@@ -413,14 +417,16 @@ Error Display::createPbufferFromClientBuffer(const Config *configuration, EGLCli ...@@ -413,14 +417,16 @@ Error Display::createPbufferFromClientBuffer(const Config *configuration, EGLCli
} }
} }
rx::SurfaceImpl *surfaceImpl = nullptr; rx::SurfaceImpl *surfaceImpl = mImplementation->createPbufferFromClientBuffer(configuration, shareHandle, attribs);
Error error = mImplementation->createPbufferFromClientBuffer(configuration, shareHandle, attribs, &surfaceImpl); ASSERT(surfaceImpl != nullptr);
Error error = surfaceImpl->initialize();
if (error.isError()) if (error.isError())
{ {
SafeDelete(surfaceImpl);
return error; return error;
} }
ASSERT(surfaceImpl != nullptr);
Surface *surface = new Surface(surfaceImpl, EGL_PBUFFER_BIT, configuration, attribs); Surface *surface = new Surface(surfaceImpl, EGL_PBUFFER_BIT, configuration, attribs);
mImplementation->getSurfaceSet().insert(surface); mImplementation->getSurfaceSet().insert(surface);
...@@ -443,14 +449,16 @@ Error Display::createPixmapSurface(const Config *configuration, NativePixmapType ...@@ -443,14 +449,16 @@ Error Display::createPixmapSurface(const Config *configuration, NativePixmapType
} }
} }
rx::SurfaceImpl *surfaceImpl = nullptr; rx::SurfaceImpl *surfaceImpl = mImplementation->createPixmapSurface(configuration, nativePixmap, attribs);
Error error = mImplementation->createPixmapSurface(configuration, nativePixmap, attribs, &surfaceImpl); ASSERT(surfaceImpl != nullptr);
Error error = surfaceImpl->initialize();
if (error.isError()) if (error.isError())
{ {
SafeDelete(surfaceImpl);
return error; return error;
} }
ASSERT(surfaceImpl != nullptr);
Surface *surface = new Surface(surfaceImpl, EGL_PIXMAP_BIT, configuration, attribs); Surface *surface = new Surface(surfaceImpl, EGL_PIXMAP_BIT, configuration, attribs);
mImplementation->getSurfaceSet().insert(surface); mImplementation->getSurfaceSet().insert(surface);
......
...@@ -121,7 +121,7 @@ class Display final : angle::NonCopyable ...@@ -121,7 +121,7 @@ class Display final : angle::NonCopyable
std::string mVendorString; std::string mVendorString;
Device* mDevice; Device *mDevice;
}; };
} }
......
...@@ -46,14 +46,17 @@ class DisplayImpl : angle::NonCopyable ...@@ -46,14 +46,17 @@ class DisplayImpl : angle::NonCopyable
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 egl::Error createWindowSurface(const egl::Config *configuration, EGLNativeWindowType window, const egl::AttributeMap &attribs, virtual SurfaceImpl *createWindowSurface(const egl::Config *configuration,
SurfaceImpl **outSurface) = 0; EGLNativeWindowType window,
virtual egl::Error createPbufferSurface(const egl::Config *configuration, const egl::AttributeMap &attribs, const egl::AttributeMap &attribs) = 0;
SurfaceImpl **outSurface) = 0; virtual SurfaceImpl *createPbufferSurface(const egl::Config *configuration,
virtual egl::Error createPbufferFromClientBuffer(const egl::Config *configuration, EGLClientBuffer shareHandle, const egl::AttributeMap &attribs) = 0;
const egl::AttributeMap &attribs, SurfaceImpl **outSurface) = 0; virtual SurfaceImpl *createPbufferFromClientBuffer(const egl::Config *configuration,
virtual egl::Error createPixmapSurface(const egl::Config *configuration, NativePixmapType nativePixmap, EGLClientBuffer shareHandle,
const egl::AttributeMap &attribs, SurfaceImpl **outSurface) = 0; const egl::AttributeMap &attribs) = 0;
virtual SurfaceImpl *createPixmapSurface(const egl::Config *configuration,
NativePixmapType nativePixmap,
const egl::AttributeMap &attribs) = 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;
......
...@@ -175,8 +175,10 @@ DisplayD3D::DisplayD3D() ...@@ -175,8 +175,10 @@ DisplayD3D::DisplayD3D()
{ {
} }
egl::Error DisplayD3D::createWindowSurface(const egl::Config *configuration, EGLNativeWindowType window,
const egl::AttributeMap &attribs, SurfaceImpl **outSurface) SurfaceImpl *DisplayD3D::createWindowSurface(const egl::Config *configuration,
EGLNativeWindowType window,
const egl::AttributeMap &attribs)
{ {
ASSERT(mRenderer != nullptr); ASSERT(mRenderer != nullptr);
...@@ -190,68 +192,40 @@ egl::Error DisplayD3D::createWindowSurface(const egl::Config *configuration, EGL ...@@ -190,68 +192,40 @@ egl::Error DisplayD3D::createWindowSurface(const egl::Config *configuration, EGL
height = -1; height = -1;
} }
SurfaceD3D *surface = SurfaceD3D::createFromWindow(mRenderer, mDisplay, configuration, window, fixedSize, return SurfaceD3D::createFromWindow(
width, height); mRenderer, mDisplay, configuration, window, fixedSize, width, height);
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 *DisplayD3D::createPbufferSurface(const egl::Config *configuration,
SurfaceImpl **outSurface) const egl::AttributeMap &attribs)
{ {
ASSERT(mRenderer != nullptr); ASSERT(mRenderer != nullptr);
EGLint width = attribs.get(EGL_WIDTH, 0); EGLint width = attribs.get(EGL_WIDTH, 0);
EGLint height = attribs.get(EGL_HEIGHT, 0); EGLint height = attribs.get(EGL_HEIGHT, 0);
SurfaceD3D *surface = SurfaceD3D::createOffscreen(mRenderer, mDisplay, configuration, NULL, width, height); return SurfaceD3D::createOffscreen(mRenderer, mDisplay, configuration, nullptr, width, height);
egl::Error error = surface->initialize();
if (error.isError())
{
SafeDelete(surface);
return error;
}
*outSurface = surface;
return egl::Error(EGL_SUCCESS);
} }
egl::Error DisplayD3D::createPbufferFromClientBuffer(const egl::Config *configuration, EGLClientBuffer shareHandle, SurfaceImpl *DisplayD3D::createPbufferFromClientBuffer(const egl::Config *configuration,
const egl::AttributeMap &attribs, SurfaceImpl **outSurface) EGLClientBuffer shareHandle,
const egl::AttributeMap &attribs)
{ {
ASSERT(mRenderer != nullptr); ASSERT(mRenderer != nullptr);
EGLint width = attribs.get(EGL_WIDTH, 0); EGLint width = attribs.get(EGL_WIDTH, 0);
EGLint height = attribs.get(EGL_HEIGHT, 0); EGLint height = attribs.get(EGL_HEIGHT, 0);
SurfaceD3D *surface = SurfaceD3D::createOffscreen(mRenderer, mDisplay, configuration, shareHandle, return SurfaceD3D::createOffscreen(
width, height); mRenderer, mDisplay, configuration, shareHandle, width, height);
egl::Error error = surface->initialize();
if (error.isError())
{
SafeDelete(surface);
return error;
}
*outSurface = surface;
return egl::Error(EGL_SUCCESS);
} }
egl::Error DisplayD3D::createPixmapSurface(const egl::Config *configuration, NativePixmapType nativePixmap, SurfaceImpl *DisplayD3D::createPixmapSurface(const egl::Config *configuration,
const egl::AttributeMap &attribs, SurfaceImpl **outSurface) NativePixmapType nativePixmap,
const egl::AttributeMap &attribs)
{ {
ASSERT(mRenderer != nullptr);
UNIMPLEMENTED(); UNIMPLEMENTED();
*outSurface = nullptr; return nullptr;
return egl::Error(EGL_BAD_DISPLAY);
} }
egl::Error DisplayD3D::getDevice(DeviceImpl **device) egl::Error DisplayD3D::getDevice(DeviceImpl **device)
......
...@@ -24,14 +24,18 @@ class DisplayD3D : public DisplayImpl ...@@ -24,14 +24,18 @@ 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;
egl::Error createWindowSurface(const egl::Config *configuration, EGLNativeWindowType window, const egl::AttributeMap &attribs, // Surface creation
SurfaceImpl **outSurface) override; SurfaceImpl *createWindowSurface(const egl::Config *configuration,
egl::Error createPbufferSurface(const egl::Config *configuration, const egl::AttributeMap &attribs, EGLNativeWindowType window,
SurfaceImpl **outSurface) override; const egl::AttributeMap &attribs) override;
egl::Error createPbufferFromClientBuffer(const egl::Config *configuration, EGLClientBuffer shareHandle, SurfaceImpl *createPbufferSurface(const egl::Config *configuration,
const egl::AttributeMap &attribs, SurfaceImpl **outSurface) override; const egl::AttributeMap &attribs) override;
egl::Error createPixmapSurface(const egl::Config *configuration, NativePixmapType nativePixmap, SurfaceImpl *createPbufferFromClientBuffer(const egl::Config *configuration,
const egl::AttributeMap &attribs, SurfaceImpl **outSurface) override; EGLClientBuffer shareHandle,
const egl::AttributeMap &attribs) override;
SurfaceImpl *createPixmapSurface(const egl::Config *configuration,
NativePixmapType nativePixmap,
const egl::AttributeMap &attribs) 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;
......
...@@ -318,23 +318,15 @@ void DisplayWGL::terminate() ...@@ -318,23 +318,15 @@ void DisplayWGL::terminate()
mOpenGLModule = nullptr; mOpenGLModule = nullptr;
} }
egl::Error DisplayWGL::createWindowSurface(const egl::Config *configuration, EGLNativeWindowType window, SurfaceImpl *DisplayWGL::createWindowSurface(const egl::Config *configuration,
const egl::AttributeMap &attribs, SurfaceImpl **outSurface) EGLNativeWindowType window,
const egl::AttributeMap &attribs)
{ {
WindowSurfaceWGL *surface = new WindowSurfaceWGL(window, mWindowClass, mPixelFormat, mWGLContext, mFunctionsWGL); return new WindowSurfaceWGL(window, mWindowClass, mPixelFormat, mWGLContext, mFunctionsWGL);
egl::Error error = surface->initialize();
if (error.isError())
{
SafeDelete(surface);
return error;
}
*outSurface = surface;
return egl::Error(EGL_SUCCESS);
} }
egl::Error DisplayWGL::createPbufferSurface(const egl::Config *configuration, const egl::AttributeMap &attribs, SurfaceImpl *DisplayWGL::createPbufferSurface(const egl::Config *configuration,
SurfaceImpl **outSurface) const egl::AttributeMap &attribs)
{ {
EGLint width = attribs.get(EGL_WIDTH, 0); EGLint width = attribs.get(EGL_WIDTH, 0);
EGLint height = attribs.get(EGL_HEIGHT, 0); EGLint height = attribs.get(EGL_HEIGHT, 0);
...@@ -342,31 +334,24 @@ egl::Error DisplayWGL::createPbufferSurface(const egl::Config *configuration, co ...@@ -342,31 +334,24 @@ egl::Error DisplayWGL::createPbufferSurface(const egl::Config *configuration, co
EGLenum textureFormat = attribs.get(EGL_TEXTURE_FORMAT, EGL_NO_TEXTURE); EGLenum textureFormat = attribs.get(EGL_TEXTURE_FORMAT, EGL_NO_TEXTURE);
EGLenum textureTarget = attribs.get(EGL_TEXTURE_TARGET, EGL_NO_TEXTURE); EGLenum textureTarget = attribs.get(EGL_TEXTURE_TARGET, EGL_NO_TEXTURE);
PbufferSurfaceWGL *surface = new PbufferSurfaceWGL(width, height, textureFormat, textureTarget, largest, return new PbufferSurfaceWGL(width, height, textureFormat, textureTarget, largest,
mPixelFormat, mDeviceContext, mWGLContext, mFunctionsWGL); mPixelFormat, mDeviceContext, mWGLContext, mFunctionsWGL);
egl::Error error = surface->initialize();
if (error.isError())
{
SafeDelete(surface);
return error;
}
*outSurface = surface;
return egl::Error(EGL_SUCCESS);
} }
egl::Error DisplayWGL::createPbufferFromClientBuffer(const egl::Config *configuration, EGLClientBuffer shareHandle, SurfaceImpl *DisplayWGL::createPbufferFromClientBuffer(const egl::Config *configuration,
const egl::AttributeMap &attribs, SurfaceImpl **outSurface) EGLClientBuffer shareHandle,
const egl::AttributeMap &attribs)
{ {
UNIMPLEMENTED(); UNIMPLEMENTED();
return egl::Error(EGL_BAD_DISPLAY); return nullptr;
} }
egl::Error DisplayWGL::createPixmapSurface(const egl::Config *configuration, NativePixmapType nativePixmap, SurfaceImpl *DisplayWGL::createPixmapSurface(const egl::Config *configuration,
const egl::AttributeMap &attribs, SurfaceImpl **outSurface) NativePixmapType nativePixmap,
const egl::AttributeMap &attribs)
{ {
UNIMPLEMENTED(); UNIMPLEMENTED();
return egl::Error(EGL_BAD_DISPLAY); return nullptr;
} }
static int QueryWGLFormatAttrib(HDC dc, int format, int attribName, const FunctionsWGL *functions) static int QueryWGLFormatAttrib(HDC dc, int format, int attribName, const FunctionsWGL *functions)
......
...@@ -27,14 +27,18 @@ class DisplayWGL : public DisplayGL ...@@ -27,14 +27,18 @@ class DisplayWGL : public DisplayGL
egl::Error initialize(egl::Display *display) override; egl::Error initialize(egl::Display *display) override;
void terminate() override; void terminate() override;
egl::Error createWindowSurface(const egl::Config *configuration, EGLNativeWindowType window, const egl::AttributeMap &attribs, // Surface creation
SurfaceImpl **outSurface) override; SurfaceImpl *createWindowSurface(const egl::Config *configuration,
egl::Error createPbufferSurface(const egl::Config *configuration, const egl::AttributeMap &attribs, EGLNativeWindowType window,
SurfaceImpl **outSurface) override; const egl::AttributeMap &attribs) override;
egl::Error createPbufferFromClientBuffer(const egl::Config *configuration, EGLClientBuffer shareHandle, SurfaceImpl *createPbufferSurface(const egl::Config *configuration,
const egl::AttributeMap &attribs, SurfaceImpl **outSurface) override; const egl::AttributeMap &attribs) override;
egl::Error createPixmapSurface(const egl::Config *configuration, NativePixmapType nativePixmap, SurfaceImpl *createPbufferFromClientBuffer(const egl::Config *configuration,
const egl::AttributeMap &attribs, SurfaceImpl **outSurface) override; EGLClientBuffer shareHandle,
const egl::AttributeMap &attribs) override;
SurfaceImpl *createPixmapSurface(const egl::Config *configuration,
NativePixmapType nativePixmap,
const egl::AttributeMap &attribs) override;
egl::ConfigSet generateConfigs() const override; egl::ConfigSet generateConfigs() const 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