Commit 86803677 by Geoff Lang

Update Display to allow for changing implementation objects.

Previously it was possible to change from a D3D9 to D3D11 display because both were implemented with a DisplayD3D. Now that there is a DisplayGL, the DisplayImpl must be updated while maintaining the same EGLDisplay value. Allow the value of Display::mImplementation to be updated when the display is not already initialized. BUG=angle:890 Change-Id: Ic18a8a120218cd130a71b9aa044b6ec00006d6a0 Reviewed-on: https://chromium-review.googlesource.com/252250Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarNicolas Capens <capn@chromium.org> Tested-by: 's avatarGeoff Lang <geofflang@chromium.org>
parent 99a3a9b2
...@@ -86,25 +86,9 @@ static DisplayMap *GetDisplayMap() ...@@ -86,25 +86,9 @@ static DisplayMap *GetDisplayMap()
return &displays; return &displays;
} }
} rx::DisplayImpl *CreateDisplayImpl(const AttributeMap &attribMap)
Display *Display::getDisplay(EGLNativeDisplayType displayId, const AttributeMap &attribMap)
{ {
// Initialize the global platform if not already
InitDefaultPlatformImpl();
Display *display = NULL;
DisplayMap *displays = GetDisplayMap();
DisplayMap::const_iterator iter = displays->find(displayId);
if (iter != displays->end())
{
display = iter->second;
}
else
{
rx::DisplayImpl *impl = nullptr; rx::DisplayImpl *impl = nullptr;
EGLint displayType = attribMap.get(EGL_PLATFORM_ANGLE_TYPE_ANGLE, EGL_PLATFORM_ANGLE_TYPE_DEFAULT_ANGLE); EGLint displayType = attribMap.get(EGL_PLATFORM_ANGLE_TYPE_ANGLE, EGL_PLATFORM_ANGLE_TYPE_DEFAULT_ANGLE);
switch (displayType) switch (displayType)
{ {
...@@ -146,36 +130,59 @@ Display *Display::getDisplay(EGLNativeDisplayType displayId, const AttributeMap ...@@ -146,36 +130,59 @@ Display *Display::getDisplay(EGLNativeDisplayType displayId, const AttributeMap
} }
ASSERT(impl != nullptr); ASSERT(impl != nullptr);
return impl;
}
}
Display *Display::getDisplay(EGLNativeDisplayType displayId, const AttributeMap &attribMap)
{
// Initialize the global platform if not already
InitDefaultPlatformImpl();
Display *display = NULL;
display = new Display(impl, displayId); DisplayMap *displays = GetDisplayMap();
DisplayMap::const_iterator iter = displays->find(displayId);
if (iter != displays->end())
{
display = iter->second;
}
if (display == nullptr)
{
// Validate the native display // Validate the native display
if (!display->isValidNativeDisplay(displayId)) if (!Display::isValidNativeDisplay(displayId))
{ {
// Still returns success
SafeDelete(display);
return NULL; return NULL;
} }
display = new Display(displayId);
displays->insert(std::make_pair(displayId, display)); displays->insert(std::make_pair(displayId, display));
} }
// Apply new attributes if the display is not initialized yet. // Apply new attributes if the display is not initialized yet.
if (!display->isInitialized()) if (!display->isInitialized())
{ {
display->setAttributes(attribMap); rx::DisplayImpl* impl = CreateDisplayImpl(attribMap);
display->setAttributes(impl, attribMap);
} }
return display; return display;
} }
Display::Display(rx::DisplayImpl *impl, EGLNativeDisplayType displayId) Display::Display(EGLNativeDisplayType displayId)
: mImplementation(impl), : mImplementation(nullptr),
mDisplayId(displayId), mDisplayId(displayId),
mAttributeMap(), mAttributeMap(),
mInitialized(false) mConfigSet(),
mContextSet(),
mInitialized(false),
mCaps(),
mDisplayExtensions(),
mDisplayExtensionString(),
mVendorString()
{ {
ASSERT(mImplementation != nullptr);
} }
Display::~Display() Display::~Display()
...@@ -192,13 +199,21 @@ Display::~Display() ...@@ -192,13 +199,21 @@ Display::~Display()
SafeDelete(mImplementation); SafeDelete(mImplementation);
} }
void Display::setAttributes(const AttributeMap &attribMap) void Display::setAttributes(rx::DisplayImpl *impl, const AttributeMap &attribMap)
{ {
ASSERT(!mInitialized);
ASSERT(impl != nullptr);
SafeDelete(mImplementation);
mImplementation = impl;
mAttributeMap = attribMap; mAttributeMap = attribMap;
} }
Error Display::initialize() Error Display::initialize()
{ {
ASSERT(mImplementation != nullptr);
if (isInitialized()) if (isInitialized())
{ {
return Error(EGL_SUCCESS); return Error(EGL_SUCCESS);
...@@ -559,7 +574,7 @@ bool Display::isValidNativeWindow(EGLNativeWindowType window) const ...@@ -559,7 +574,7 @@ bool Display::isValidNativeWindow(EGLNativeWindowType window) const
return mImplementation->isValidNativeWindow(window); return mImplementation->isValidNativeWindow(window);
} }
bool Display::isValidNativeDisplay(EGLNativeDisplayType display) const bool Display::isValidNativeDisplay(EGLNativeDisplayType display)
{ {
// TODO(jmadill): handle this properly // TODO(jmadill): handle this properly
if (display == EGL_DEFAULT_DISPLAY) if (display == EGL_DEFAULT_DISPLAY)
......
...@@ -69,7 +69,8 @@ class Display final ...@@ -69,7 +69,8 @@ class Display final
bool isValidSurface(egl::Surface *surface) const; bool isValidSurface(egl::Surface *surface) const;
bool hasExistingWindowSurface(EGLNativeWindowType window) const; bool hasExistingWindowSurface(EGLNativeWindowType window) const;
bool isValidNativeWindow(EGLNativeWindowType window) const; bool isValidNativeWindow(EGLNativeWindowType window) const;
bool isValidNativeDisplay(EGLNativeDisplayType display) const;
static bool isValidNativeDisplay(EGLNativeDisplayType display);
bool isDeviceLost() const; bool isDeviceLost() const;
bool testDeviceLost(); bool testDeviceLost();
...@@ -89,9 +90,9 @@ class Display final ...@@ -89,9 +90,9 @@ class Display final
private: private:
DISALLOW_COPY_AND_ASSIGN(Display); DISALLOW_COPY_AND_ASSIGN(Display);
Display(rx::DisplayImpl *impl, EGLNativeDisplayType displayId); Display(EGLNativeDisplayType displayId);
void setAttributes(const AttributeMap &attribMap); void setAttributes(rx::DisplayImpl *impl, const AttributeMap &attribMap);
Error restoreLostDevice(); Error restoreLostDevice();
......
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