Skip to content

Commit

Permalink
Cherry-pick from gles3-dev: Add and implement ANGLE_device_mtl extens…
Browse files Browse the repository at this point in the history
…ion.

Allow user to query internal MTLDevice used by MetalANGLE.

Change-Id: If310917c091b80ad605084403b94ffee5e803553

# Conflicts:
#	include/EGL/eglext_angle.h
#	src/libANGLE/Caps.h
#	src/libANGLE/renderer/metal/DisplayMtl.mm
#	src/libGLESv2/entry_points_egl_ext.cpp
  • Loading branch information
kakashidinho committed Jul 31, 2020
1 parent a457b90 commit f2ae5d3
Show file tree
Hide file tree
Showing 6 changed files with 142 additions and 2 deletions.
90 changes: 90 additions & 0 deletions extensions/EGL_ANGLE_device_mtl.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
Name

ANGLE_device_mtl

Name Strings

EGL_ANGLE_device_mtl

Contributors

Le Hoang Quyen

Contact

Le Hoang Quyen (lehoangq 'at' gmail.com)

Status

Draft

Version

Version 1, Jul 19, 2020

Number

EGL Extension #XXX

Extension Type

EGL device extension

Dependencies

This extension is written against the language of EGL 1.5 as
modified by EGL_EXT_device_query.

EGL_EXT_device_query is required.

Overview

ANGLE has the ability to run GPU commands on a metal device.
This extension defines a mapping from an EGL device to a metal
device, after it's queried from an EGL display.

IP Status

No known claims.

New Types

None.

New Procedures and Functions

None.

New Tokens

Accepted as a queried <attribute> in eglQueryDeviceAttribEXT:

EGL_MTL_DEVICE_ANGLE 0x33A2

Add a new section 2.1.3 (Metal Devices) after 2.1.2 (Devices)

Somewhat analogous to an EGL device, a Metal device establishes a
namespace for Metal operations. In the Metal APIs, such devices are
represented by pointers. For more details, see the Metal
documentation.

Changes to section 3.2 (Devices)

Replace the paragraph immediately following the prototype for
eglQueryDeviceAttribEXT:

<attribute> may be EGL_MTL_DEVICE_ANGLE.
On success, EGL_TRUE is returned, and a valid MTLDevice pointer
corresponding to the EGL device is returned in <value>. This handle
is compatible with Metal API functions. If the EGL device is not currently
associated with a Metal device and <attribute> is EGL_MTL_DEVICE_ANGLE,
EGL_BAD_ATTRIBUTE is returned, and <value> is left unchanged.

Issues

None

Revision History

Version 1, Jul 19, 2020 (Le Hoang Quyen)
- Initial Draft
5 changes: 5 additions & 0 deletions include/EGL/eglext_angle.h
Original file line number Diff line number Diff line change
Expand Up @@ -254,6 +254,11 @@ EGLAPI EGLBoolean EGLAPIENTRY eglQueryDisplayAttribANGLE(EGLDisplay dpy, EGLint
#define EGL_CGL_PIXEL_FORMAT_ANGLE 0x3486
#endif

#ifndef EGL_ANGLE_device_mtl
#define EGL_ANGLE_device_mtl 1
#define EGL_MTL_DEVICE_ANGLE 0x33A2
#endif /* EGL_ANGLE_device_mtl */

// clang-format on

#endif // INCLUDE_EGL_EGLEXT_ANGLE_
1 change: 1 addition & 0 deletions src/libANGLE/Caps.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1274,6 +1274,7 @@ std::vector<std::string> DeviceExtensions::getStrings() const
// | Extension name | Supported flag | Output vector |
InsertExtensionString("EGL_ANGLE_device_d3d", deviceD3D, &extensionStrings);
InsertExtensionString("EGL_ANGLE_device_cgl", deviceCGL, &extensionStrings);
InsertExtensionString("EGL_ANGLE_device_mtl", deviceMTL, &extensionStrings);
// clang-format on

return extensionStrings;
Expand Down
3 changes: 3 additions & 0 deletions src/libANGLE/Caps.h
Original file line number Diff line number Diff line change
Expand Up @@ -975,6 +975,9 @@ struct DeviceExtensions

// EGL_ANGLE_device_cgl
bool deviceCGL = false;

// EGL_ANGLE_device_mtl
bool deviceMTL = false;
};

struct ClientExtensions
Expand Down
36 changes: 34 additions & 2 deletions src/libANGLE/renderer/metal/DisplayMtl.mm
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
#include "libANGLE/Context.h"
#include "libANGLE/Display.h"
#include "libANGLE/Surface.h"
#include "libANGLE/renderer/DeviceImpl.h"
#include "libANGLE/renderer/glslang_wrapper_utils.h"
#include "libANGLE/renderer/metal/ContextMtl.h"
#include "libANGLE/renderer/metal/SurfaceMtl.h"
Expand Down Expand Up @@ -43,6 +44,37 @@ bool IsMetalDisplayAvailable()
return new DisplayMtl(state);
}

// DeviceMTL implementation, implements DeviceImpl
class DeviceMTL : public DeviceImpl
{
public:
DeviceMTL() {}
~DeviceMTL() override {}

egl::Error initialize() override { return egl::NoError(); }
egl::Error getAttribute(const egl::Display *display, EGLint attribute, void **outValue) override
{
DisplayMtl *displayImpl = mtl::GetImpl(display);

switch (attribute)
{
case EGL_MTL_DEVICE_ANGLE:
*outValue = displayImpl->getMetalDevice();
break;
default:
return egl::EglBadAttribute();
}

return egl::NoError();
}
EGLint getType() override { return 0; }
void generateExtensions(egl::DeviceExtensions *outExtensions) const override
{
outExtensions->deviceMTL = true;
}
};

// DisplayMtl implementation
DisplayMtl::DisplayMtl(const egl::DisplayState &state)
: DisplayImpl(state), mStateCache(mFeatures), mUtils(this)
{}
Expand Down Expand Up @@ -125,8 +157,7 @@ bool IsMetalDisplayAvailable()

DeviceImpl *DisplayMtl::createDevice()
{
UNIMPLEMENTED();
return nullptr;
return new DeviceMTL();
}

egl::Error DisplayMtl::waitClient(const gl::Context *context)
Expand Down Expand Up @@ -237,6 +268,7 @@ bool IsMetalDisplayAvailable()
outExtensions->fenceSync = true;
outExtensions->waitSync = true;
outExtensions->glColorspace = true;
outExtensions->deviceQuery = true;
}

void DisplayMtl::generateCaps(egl::Caps *outCaps) const {}
Expand Down
9 changes: 9 additions & 0 deletions src/libGLESv2/entry_points_egl_ext.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -301,6 +301,15 @@ EGLBoolean EGLAPIENTRY EGL_QueryDeviceAttribEXT(EGLDeviceEXT device,
}
error = dev->getAttribute(attribute, value);
break;
case EGL_MTL_DEVICE_ANGLE:
if (!dev->getExtensions().deviceMTL)
{
thread->setError(EglBadAttribute(), GetDebug(), "eglQueryDeviceAttribEXT",
GetDeviceIfValid(dev));
return EGL_FALSE;
}
error = dev->getAttribute(attribute, value);
break;
case EGL_CGL_CONTEXT_ANGLE:
case EGL_CGL_PIXEL_FORMAT_ANGLE:
if (!dev->getExtensions().deviceCGL)
Expand Down

0 comments on commit f2ae5d3

Please sign in to comment.