blob: 3eff0e9d6d397ec2bb78eeda5257fa2bf553d812 [file] [log] [blame]
//
// Copyright 2022 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// DeviceEGL.cpp:
// Implements the class methods for DeviceEGL.
//
#include "libANGLE/renderer/gl/egl/DeviceEGL.h"
#include <stdint.h>
#include "common/debug.h"
#include "common/string_utils.h"
#include "libANGLE/Display.h"
#include "libANGLE/renderer/gl/egl/DisplayEGL.h"
#include "libANGLE/renderer/gl/egl/FunctionsEGL.h"
namespace rx
{
DeviceEGL::DeviceEGL(DisplayEGL *display) : mDisplay(display) {}
DeviceEGL::~DeviceEGL() {}
egl::Error DeviceEGL::initialize()
{
if (mDisplay->getFunctionsEGL()->hasExtension("EGL_EXT_device_query") &&
mDisplay->getFunctionsEGL()->queryDisplayAttribEXT(EGL_DEVICE_EXT, (EGLAttrib *)&mDevice))
{
const char *extensions =
mDisplay->getFunctionsEGL()->queryDeviceStringEXT(mDevice, EGL_EXTENSIONS);
if (extensions != nullptr)
{
angle::SplitStringAlongWhitespace(extensions, &mExtensions);
}
}
return egl::NoError();
}
egl::Error DeviceEGL::getAttribute(const egl::Display *display, EGLint attribute, void **outValue)
{
UNREACHABLE();
return egl::Error(EGL_BAD_ATTRIBUTE);
}
void DeviceEGL::generateExtensions(egl::DeviceExtensions *outExtensions) const
{
if (hasExtension("EGL_EXT_device_drm"))
{
outExtensions->deviceDrmEXT = true;
}
if (hasExtension("EGL_EXT_device_drm_render_node"))
{
outExtensions->deviceDrmRenderNodeEXT = true;
}
}
const std::string DeviceEGL::getDeviceString(EGLint name)
{
switch (name)
{
case EGL_DRM_DEVICE_FILE_EXT:
case EGL_DRM_RENDER_NODE_FILE_EXT:
{
// eglQueryDeviceStringEXT can return nullptr if there is no render
// node attached to egl device.
const char *str = mDisplay->getFunctionsEGL()->queryDeviceStringEXT(mDevice, name);
return str ? std::string(str) : std::string();
}
default:
UNREACHABLE();
return std::string();
}
}
bool DeviceEGL::hasExtension(const char *extension) const
{
return std::find(mExtensions.begin(), mExtensions.end(), extension) != mExtensions.end();
}
} // namespace rx