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
}
}
rx::SurfaceImpl *surfaceImpl = nullptr;
Error error = mImplementation->createWindowSurface(configuration, window, attribs, &surfaceImpl);
rx::SurfaceImpl *surfaceImpl = mImplementation->createWindowSurface(configuration, window, attribs);
ASSERT(surfaceImpl != nullptr);
Error error = surfaceImpl->initialize();
if (error.isError())
{
SafeDelete(surfaceImpl);
return error;
}
ASSERT(surfaceImpl != nullptr);
Surface *surface = new Surface(surfaceImpl, EGL_WINDOW_BIT, configuration, attribs);
mImplementation->getSurfaceSet().insert(surface);
......@@ -383,14 +385,16 @@ Error Display::createPbufferSurface(const Config *configuration, const Attribute
}
}
rx::SurfaceImpl *surfaceImpl = nullptr;
Error error = mImplementation->createPbufferSurface(configuration, attribs, &surfaceImpl);
rx::SurfaceImpl *surfaceImpl = mImplementation->createPbufferSurface(configuration, attribs);
ASSERT(surfaceImpl != nullptr);
Error error = surfaceImpl->initialize();
if (error.isError())
{
SafeDelete(surfaceImpl);
return error;
}
ASSERT(surfaceImpl != nullptr);
Surface *surface = new Surface(surfaceImpl, EGL_PBUFFER_BIT, configuration, attribs);
mImplementation->getSurfaceSet().insert(surface);
......@@ -413,14 +417,16 @@ Error Display::createPbufferFromClientBuffer(const Config *configuration, EGLCli
}
}
rx::SurfaceImpl *surfaceImpl = nullptr;
Error error = mImplementation->createPbufferFromClientBuffer(configuration, shareHandle, attribs, &surfaceImpl);
rx::SurfaceImpl *surfaceImpl = mImplementation->createPbufferFromClientBuffer(configuration, shareHandle, attribs);
ASSERT(surfaceImpl != nullptr);
Error error = surfaceImpl->initialize();
if (error.isError())
{
SafeDelete(surfaceImpl);
return error;
}
ASSERT(surfaceImpl != nullptr);
Surface *surface = new Surface(surfaceImpl, EGL_PBUFFER_BIT, configuration, attribs);
mImplementation->getSurfaceSet().insert(surface);
......@@ -443,14 +449,16 @@ Error Display::createPixmapSurface(const Config *configuration, NativePixmapType
}
}
rx::SurfaceImpl *surfaceImpl = nullptr;
Error error = mImplementation->createPixmapSurface(configuration, nativePixmap, attribs, &surfaceImpl);
rx::SurfaceImpl *surfaceImpl = mImplementation->createPixmapSurface(configuration, nativePixmap, attribs);
ASSERT(surfaceImpl != nullptr);
Error error = surfaceImpl->initialize();
if (error.isError())
{
SafeDelete(surfaceImpl);
return error;
}
ASSERT(surfaceImpl != nullptr);
Surface *surface = new Surface(surfaceImpl, EGL_PIXMAP_BIT, configuration, attribs);
mImplementation->getSurfaceSet().insert(surface);
......
......@@ -121,7 +121,7 @@ class Display final : angle::NonCopyable
std::string mVendorString;
Device* mDevice;
Device *mDevice;
};
}
......
......@@ -46,14 +46,17 @@ class DisplayImpl : angle::NonCopyable
virtual egl::Error initialize(egl::Display *display) = 0;
virtual void terminate() = 0;
virtual egl::Error createWindowSurface(const egl::Config *configuration, EGLNativeWindowType window, const egl::AttributeMap &attribs,
SurfaceImpl **outSurface) = 0;
virtual egl::Error createPbufferSurface(const egl::Config *configuration, const egl::AttributeMap &attribs,
SurfaceImpl **outSurface) = 0;
virtual egl::Error createPbufferFromClientBuffer(const egl::Config *configuration, EGLClientBuffer shareHandle,
const egl::AttributeMap &attribs, SurfaceImpl **outSurface) = 0;
virtual egl::Error createPixmapSurface(const egl::Config *configuration, NativePixmapType nativePixmap,
const egl::AttributeMap &attribs, SurfaceImpl **outSurface) = 0;
virtual SurfaceImpl *createWindowSurface(const egl::Config *configuration,
EGLNativeWindowType window,
const egl::AttributeMap &attribs) = 0;
virtual SurfaceImpl *createPbufferSurface(const egl::Config *configuration,
const egl::AttributeMap &attribs) = 0;
virtual SurfaceImpl *createPbufferFromClientBuffer(const egl::Config *configuration,
EGLClientBuffer shareHandle,
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,
gl::Context **outContext) = 0;
......
......@@ -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);
......@@ -190,68 +192,40 @@ egl::Error DisplayD3D::createWindowSurface(const egl::Config *configuration, EGL
height = -1;
}
SurfaceD3D *surface = SurfaceD3D::createFromWindow(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);
return SurfaceD3D::createFromWindow(
mRenderer, mDisplay, configuration, window, fixedSize, width, height);
}
egl::Error DisplayD3D::createPbufferSurface(const egl::Config *configuration, const egl::AttributeMap &attribs,
SurfaceImpl **outSurface)
SurfaceImpl *DisplayD3D::createPbufferSurface(const egl::Config *configuration,
const egl::AttributeMap &attribs)
{
ASSERT(mRenderer != nullptr);
EGLint width = attribs.get(EGL_WIDTH, 0);
EGLint height = attribs.get(EGL_HEIGHT, 0);
SurfaceD3D *surface = SurfaceD3D::createOffscreen(mRenderer, mDisplay, configuration, NULL, width, height);
egl::Error error = surface->initialize();
if (error.isError())
{
SafeDelete(surface);
return error;
}
*outSurface = surface;
return egl::Error(EGL_SUCCESS);
return SurfaceD3D::createOffscreen(mRenderer, mDisplay, configuration, nullptr, width, height);
}
egl::Error DisplayD3D::createPbufferFromClientBuffer(const egl::Config *configuration, EGLClientBuffer shareHandle,
const egl::AttributeMap &attribs, SurfaceImpl **outSurface)
SurfaceImpl *DisplayD3D::createPbufferFromClientBuffer(const egl::Config *configuration,
EGLClientBuffer shareHandle,
const egl::AttributeMap &attribs)
{
ASSERT(mRenderer != nullptr);
EGLint width = attribs.get(EGL_WIDTH, 0);
EGLint height = attribs.get(EGL_HEIGHT, 0);
SurfaceD3D *surface = SurfaceD3D::createOffscreen(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);
return SurfaceD3D::createOffscreen(
mRenderer, mDisplay, configuration, shareHandle, width, height);
}
egl::Error DisplayD3D::createPixmapSurface(const egl::Config *configuration, NativePixmapType nativePixmap,
const egl::AttributeMap &attribs, SurfaceImpl **outSurface)
SurfaceImpl *DisplayD3D::createPixmapSurface(const egl::Config *configuration,
NativePixmapType nativePixmap,
const egl::AttributeMap &attribs)
{
ASSERT(mRenderer != nullptr);
UNIMPLEMENTED();
*outSurface = nullptr;
return egl::Error(EGL_BAD_DISPLAY);
return nullptr;
}
egl::Error DisplayD3D::getDevice(DeviceImpl **device)
......
......@@ -24,14 +24,18 @@ class DisplayD3D : public DisplayImpl
egl::Error initialize(egl::Display *display) override;
virtual void terminate() override;
egl::Error createWindowSurface(const egl::Config *configuration, EGLNativeWindowType window, const egl::AttributeMap &attribs,
SurfaceImpl **outSurface) override;
egl::Error createPbufferSurface(const egl::Config *configuration, const egl::AttributeMap &attribs,
SurfaceImpl **outSurface) override;
egl::Error createPbufferFromClientBuffer(const egl::Config *configuration, EGLClientBuffer shareHandle,
const egl::AttributeMap &attribs, SurfaceImpl **outSurface) override;
egl::Error createPixmapSurface(const egl::Config *configuration, NativePixmapType nativePixmap,
const egl::AttributeMap &attribs, SurfaceImpl **outSurface) override;
// Surface creation
SurfaceImpl *createWindowSurface(const egl::Config *configuration,
EGLNativeWindowType window,
const egl::AttributeMap &attribs) override;
SurfaceImpl *createPbufferSurface(const egl::Config *configuration,
const egl::AttributeMap &attribs) override;
SurfaceImpl *createPbufferFromClientBuffer(const egl::Config *configuration,
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,
gl::Context **outContext) override;
......
......@@ -318,23 +318,15 @@ void DisplayWGL::terminate()
mOpenGLModule = nullptr;
}
egl::Error DisplayWGL::createWindowSurface(const egl::Config *configuration, EGLNativeWindowType window,
const egl::AttributeMap &attribs, SurfaceImpl **outSurface)
SurfaceImpl *DisplayWGL::createWindowSurface(const egl::Config *configuration,
EGLNativeWindowType window,
const egl::AttributeMap &attribs)
{
WindowSurfaceWGL *surface = 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);
return new WindowSurfaceWGL(window, mWindowClass, mPixelFormat, mWGLContext, mFunctionsWGL);
}
egl::Error DisplayWGL::createPbufferSurface(const egl::Config *configuration, const egl::AttributeMap &attribs,
SurfaceImpl **outSurface)
SurfaceImpl *DisplayWGL::createPbufferSurface(const egl::Config *configuration,
const egl::AttributeMap &attribs)
{
EGLint width = attribs.get(EGL_WIDTH, 0);
EGLint height = attribs.get(EGL_HEIGHT, 0);
......@@ -342,31 +334,24 @@ egl::Error DisplayWGL::createPbufferSurface(const egl::Config *configuration, co
EGLenum textureFormat = attribs.get(EGL_TEXTURE_FORMAT, 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);
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,
const egl::AttributeMap &attribs, SurfaceImpl **outSurface)
SurfaceImpl *DisplayWGL::createPbufferFromClientBuffer(const egl::Config *configuration,
EGLClientBuffer shareHandle,
const egl::AttributeMap &attribs)
{
UNIMPLEMENTED();
return egl::Error(EGL_BAD_DISPLAY);
return nullptr;
}
egl::Error DisplayWGL::createPixmapSurface(const egl::Config *configuration, NativePixmapType nativePixmap,
const egl::AttributeMap &attribs, SurfaceImpl **outSurface)
SurfaceImpl *DisplayWGL::createPixmapSurface(const egl::Config *configuration,
NativePixmapType nativePixmap,
const egl::AttributeMap &attribs)
{
UNIMPLEMENTED();
return egl::Error(EGL_BAD_DISPLAY);
return nullptr;
}
static int QueryWGLFormatAttrib(HDC dc, int format, int attribName, const FunctionsWGL *functions)
......
......@@ -27,14 +27,18 @@ class DisplayWGL : public DisplayGL
egl::Error initialize(egl::Display *display) override;
void terminate() override;
egl::Error createWindowSurface(const egl::Config *configuration, EGLNativeWindowType window, const egl::AttributeMap &attribs,
SurfaceImpl **outSurface) override;
egl::Error createPbufferSurface(const egl::Config *configuration, const egl::AttributeMap &attribs,
SurfaceImpl **outSurface) override;
egl::Error createPbufferFromClientBuffer(const egl::Config *configuration, EGLClientBuffer shareHandle,
const egl::AttributeMap &attribs, SurfaceImpl **outSurface) override;
egl::Error createPixmapSurface(const egl::Config *configuration, NativePixmapType nativePixmap,
const egl::AttributeMap &attribs, SurfaceImpl **outSurface) override;
// Surface creation
SurfaceImpl *createWindowSurface(const egl::Config *configuration,
EGLNativeWindowType window,
const egl::AttributeMap &attribs) override;
SurfaceImpl *createPbufferSurface(const egl::Config *configuration,
const egl::AttributeMap &attribs) override;
SurfaceImpl *createPbufferFromClientBuffer(const egl::Config *configuration,
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;
......
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