Commit a0b00e97 by Michael Spang Committed by Commit Bot

Vulkan: Expose GL_EXT_memory_object_fd & GL_EXT_semaphore_fd

If the vulkan driver has support for VK_KHR_external_memory_fd or VK_KHR_external_semaphore_fd, add the GL versions of these to the vulkan renderer's extensions. Bug: angleproject:3289 Change-Id: I7f04b5cf883f93f6ccd579c2b75d6831b854bfd0 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/1552027 Commit-Queue: Michael Spang <spang@chromium.org> Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org>
parent a131a151
......@@ -69,6 +69,14 @@ struct FeaturesVk
// extension, on which the EGL_ANDROID_image_native_buffer extension can be layered.
bool supportsAndroidHardwareBuffer = false;
// Whether the VkDevice supports the VK_KHR_external_memory_fd
// extension, on which the GL_EXT_memory_object_fd extension can be layered.
bool supportsExternalMemoryFd = false;
// Whether the VkDevice supports the VK_KHR_external_semaphore_fd
// extension, on which the GL_EXT_semaphore_fd extension can be layered.
bool supportsExternalSemaphoreFd = false;
// VK_PRESENT_MODE_FIFO_KHR causes random timeouts on Linux Intel. http://anglebug.com/3153
bool disableFifoPresentMode = false;
......
......@@ -498,7 +498,9 @@ void MemoryObjectManager::reset(const Context *context)
GLuint MemoryObjectManager::createMemoryObject(rx::GLImplFactory *factory)
{
GLuint handle = mHandleAllocator.allocate();
mMemoryObjects.assign(handle, new MemoryObject(factory, handle));
MemoryObject *memoryObject = new MemoryObject(factory, handle);
memoryObject->addRef();
mMemoryObjects.assign(handle, memoryObject);
return handle;
}
......
......@@ -20,6 +20,7 @@
#include "libANGLE/renderer/vulkan/CompilerVk.h"
#include "libANGLE/renderer/vulkan/FenceNVVk.h"
#include "libANGLE/renderer/vulkan/FramebufferVk.h"
#include "libANGLE/renderer/vulkan/MemoryObjectVk.h"
#include "libANGLE/renderer/vulkan/ProgramPipelineVk.h"
#include "libANGLE/renderer/vulkan/ProgramVk.h"
#include "libANGLE/renderer/vulkan/QueryVk.h"
......@@ -1114,8 +1115,7 @@ std::vector<PathImpl *> ContextVk::createPaths(GLsizei)
MemoryObjectImpl *ContextVk::createMemoryObject()
{
UNIMPLEMENTED();
return nullptr;
return new MemoryObjectVk();
}
void ContextVk::invalidateCurrentTextures()
......
// Copyright 2019 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.
//
// MemoryObjectVk.cpp: Defines the class interface for MemoryObjectVk, implementing
// MemoryObjectImpl.
#include "libANGLE/renderer/vulkan/MemoryObjectVk.h"
namespace rx
{
MemoryObjectVk::MemoryObjectVk() {}
MemoryObjectVk::~MemoryObjectVk() = default;
void MemoryObjectVk::onDestroy(const gl::Context *context) {}
} // namespace rx
// Copyright 2019 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.
//
// MemoryObjectVk.h: Defines the class interface for MemoryObjectVk,
// implementing MemoryObjectImpl.
#ifndef LIBANGLE_RENDERER_VULKAN_MEMORYOBJECTVK_H_
#define LIBANGLE_RENDERER_VULKAN_MEMORYOBJECTVK_H_
#include "libANGLE/renderer/MemoryObjectImpl.h"
namespace rx
{
class MemoryObjectVk : public MemoryObjectImpl
{
public:
MemoryObjectVk();
~MemoryObjectVk() override;
void onDestroy(const gl::Context *context) override;
};
} // namespace rx
#endif // LIBANGLE_RENDERER_VULKAN_MEMORYOBJECTVK_H_
......@@ -958,6 +958,11 @@ angle::Result RendererVk::initializeDevice(DisplayVk *displayVk, uint32_t queueF
enabledDeviceExtensions.push_back(VK_KHR_INCREMENTAL_PRESENT_EXTENSION_NAME);
}
if (getFeatures().supportsAndroidHardwareBuffer || getFeatures().supportsExternalMemoryFd)
{
enabledDeviceExtensions.push_back(VK_KHR_EXTERNAL_MEMORY_EXTENSION_NAME);
}
#if defined(ANGLE_PLATFORM_ANDROID)
if (getFeatures().supportsAndroidHardwareBuffer)
{
......@@ -970,6 +975,21 @@ angle::Result RendererVk::initializeDevice(DisplayVk *displayVk, uint32_t queueF
ASSERT(!getFeatures().supportsAndroidHardwareBuffer);
#endif
if (getFeatures().supportsExternalMemoryFd)
{
enabledDeviceExtensions.push_back(VK_KHR_EXTERNAL_MEMORY_FD_EXTENSION_NAME);
}
if (getFeatures().supportsExternalSemaphoreFd)
{
enabledDeviceExtensions.push_back(VK_KHR_EXTERNAL_SEMAPHORE_EXTENSION_NAME);
}
if (getFeatures().supportsExternalSemaphoreFd)
{
enabledDeviceExtensions.push_back(VK_KHR_EXTERNAL_SEMAPHORE_FD_EXTENSION_NAME);
}
std::sort(enabledDeviceExtensions.begin(), enabledDeviceExtensions.end(), StrLess);
ANGLE_VK_TRY(displayVk, VerifyExtensionsPresent(deviceExtensionNames, enabledDeviceExtensions));
......@@ -1242,6 +1262,16 @@ void RendererVk::initFeatures(const ExtensionNameList &deviceExtensionNames)
ExtensionFound(VK_EXT_QUEUE_FAMILY_FOREIGN_EXTENSION_NAME, deviceExtensionNames);
#endif
if (ExtensionFound(VK_KHR_EXTERNAL_MEMORY_FD_EXTENSION_NAME, deviceExtensionNames))
{
mFeatures.supportsExternalMemoryFd = true;
}
if (ExtensionFound(VK_KHR_EXTERNAL_SEMAPHORE_FD_EXTENSION_NAME, deviceExtensionNames))
{
mFeatures.supportsExternalSemaphoreFd = true;
}
if (IsLinux() && IsIntel(mPhysicalDeviceProperties.vendorID))
{
mFeatures.disableFifoPresentMode = true;
......
......@@ -56,6 +56,12 @@ void RendererVk::ensureCapsInitialized() const
// TODO(geofflang): Support GL_OES_EGL_image_external_essl3. http://anglebug.com/2668
mNativeExtensions.eglImageExternalEssl3 = false;
mNativeExtensions.memoryObject = true;
mNativeExtensions.memoryObjectFd = getFeatures().supportsExternalMemoryFd;
mNativeExtensions.semaphore = true;
mNativeExtensions.semaphoreFd = getFeatures().supportsExternalSemaphoreFd;
// TODO: Enable this always and emulate instanced draws if any divisor exceeds the maximum
// supported. http://anglebug.com/2672
mNativeExtensions.instancedArraysANGLE = mMaxVertexAttribDivisor > 1;
......
......@@ -780,6 +780,8 @@ libangle_vulkan_sources = [
"src/libANGLE/renderer/vulkan/GlslangWrapper.h",
"src/libANGLE/renderer/vulkan/ImageVk.cpp",
"src/libANGLE/renderer/vulkan/ImageVk.h",
"src/libANGLE/renderer/vulkan/MemoryObjectVk.cpp",
"src/libANGLE/renderer/vulkan/MemoryObjectVk.h",
"src/libANGLE/renderer/vulkan/ProgramVk.cpp",
"src/libANGLE/renderer/vulkan/ProgramVk.h",
"src/libANGLE/renderer/vulkan/ProgramPipelineVk.cpp",
......
......@@ -75,6 +75,7 @@ angle_end2end_tests_sources = [
"gl_tests/LinkAndRelinkTest.cpp",
"gl_tests/MaxTextureSizeTest.cpp",
"gl_tests/MemorySizeTest.cpp",
"gl_tests/MemoryObjectTest.cpp",
"gl_tests/MipmapTest.cpp",
"gl_tests/MultiDrawTest.cpp",
"gl_tests/MultisampleCompatibilityTest.cpp",
......
//
// Copyright 2019 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.
//
// MemoryObjectTest.cpp : Tests of the GL_EXT_memory_object extension.
#include "test_utils/ANGLETest.h"
#include "test_utils/gl_raii.h"
namespace angle
{
class MemoryObjectTest : public ANGLETest
{
protected:
MemoryObjectTest()
{
setWindowWidth(1);
setWindowHeight(1);
setConfigRedBits(8);
setConfigGreenBits(8);
setConfigBlueBits(8);
setConfigAlphaBits(8);
}
};
TEST_P(MemoryObjectTest, MemoryObjectShouldBeMemoryObject)
{
ANGLE_SKIP_TEST_IF(!ensureExtensionEnabled("GL_EXT_memory_object"));
constexpr GLsizei kMemoryObjectCount = 2;
GLuint memoryObjects[kMemoryObjectCount];
glCreateMemoryObjectsEXT(kMemoryObjectCount, memoryObjects);
EXPECT_FALSE(glIsMemoryObjectEXT(0));
for (GLsizei i = 0; i < kMemoryObjectCount; ++i)
{
EXPECT_TRUE(glIsMemoryObjectEXT(memoryObjects[i]));
}
glDeleteMemoryObjectsEXT(kMemoryObjectCount, memoryObjects);
EXPECT_GL_NO_ERROR();
}
// Use this to select which configurations (e.g. which renderer, which GLES major version) these
// tests should be run against.
ANGLE_INSTANTIATE_TEST(MemoryObjectTest,
ES2_D3D9(),
ES2_D3D11(),
ES3_D3D11(),
ES2_D3D11_FL9_3(),
ES2_OPENGL(),
ES3_OPENGL(),
ES2_OPENGLES(),
ES3_OPENGLES(),
ES2_VULKAN());
} // namespace angle
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