Hash :
ccd9a43b
Author :
Date :
2024-05-22T11:15:39
Split EGL_ANGLE_device_d3d into D3D9 and D3D11 versions. Add EGL_ANGLE_device_d3d9 and EGL_ANGLE_device_d3d11 which make it possible to know what type of device can be queried ahead of time without generating EGL errors. Refactor the DeviceD3D class into Device9 and Device11. Remove the getType method now that it's not needed for internal validation. Keep EGL_ANGLE_device_d3d for backwards compatibility. Bug: angleproject:342096132 Change-Id: Ib950abad58e46a5be269891ea7afd0cb8534cbe8 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/5559163 Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org> Commit-Queue: Geoff Lang <geofflang@chromium.org>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85
//
// 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::EglBadAttribute();
}
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