Commit 0291066b authored by Robert Sesek's avatar Robert Sesek Committed by Commit Bot

Make GpuMemoryBufferHandle::dxgi_handle a base::win::ScopedHandle

In the process, convert the buffer_types.mojom to handle<platform>. This
also adds a legacy IPC::ParamTraits<ScopedHandle> to support sending
GpuMemoryBufferHandle over legacy IPC.

Tbr: flackr@chromium.org
Bug: 863011, 710376
Change-Id: I087d9d83edc729b512dbb79806a0b4b2db2b31bd
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2064609
Commit-Queue: Robert Sesek <rsesek@chromium.org>
Reviewed-by: default avatarKen Rockot <rockot@google.com>
Reviewed-by: default avatarDaniele Castagna <dcastagna@chromium.org>
Reviewed-by: default avatarMichael Thiessen <mthiesse@chromium.org>
Cr-Commit-Position: refs/heads/master@{#745586}
parent 96b03b94
...@@ -122,8 +122,7 @@ mojo::PlatformHandle GraphicsDelegateWin::GetTexture() { ...@@ -122,8 +122,7 @@ mojo::PlatformHandle GraphicsDelegateWin::GetTexture() {
return {}; return {};
gfx::GpuMemoryBufferHandle gpu_handle = gpu_memory_buffer_->CloneHandle(); gfx::GpuMemoryBufferHandle gpu_handle = gpu_memory_buffer_->CloneHandle();
return mojo::PlatformHandle( return mojo::PlatformHandle(std::move(gpu_handle.dxgi_handle));
base::win::ScopedHandle(gpu_handle.dxgi_handle.GetHandle()));
} }
gfx::RectF GraphicsDelegateWin::GetLeft() { gfx::RectF GraphicsDelegateWin::GetLeft() {
......
...@@ -19,16 +19,15 @@ namespace gpu { ...@@ -19,16 +19,15 @@ namespace gpu {
GpuMemoryBufferImplDXGI::~GpuMemoryBufferImplDXGI() {} GpuMemoryBufferImplDXGI::~GpuMemoryBufferImplDXGI() {}
std::unique_ptr<GpuMemoryBufferImplDXGI> std::unique_ptr<GpuMemoryBufferImplDXGI>
GpuMemoryBufferImplDXGI::CreateFromHandle( GpuMemoryBufferImplDXGI::CreateFromHandle(gfx::GpuMemoryBufferHandle handle,
const gfx::GpuMemoryBufferHandle& handle, const gfx::Size& size,
const gfx::Size& size, gfx::BufferFormat format,
gfx::BufferFormat format, gfx::BufferUsage usage,
gfx::BufferUsage usage, DestructionCallback callback) {
DestructionCallback callback) {
DCHECK(handle.dxgi_handle.IsValid()); DCHECK(handle.dxgi_handle.IsValid());
return base::WrapUnique(new GpuMemoryBufferImplDXGI( return base::WrapUnique(
handle.id, size, format, std::move(callback), new GpuMemoryBufferImplDXGI(handle.id, size, format, std::move(callback),
base::win::ScopedHandle(handle.dxgi_handle.GetHandle()))); std::move(handle.dxgi_handle)));
} }
base::OnceClosure GpuMemoryBufferImplDXGI::AllocateForTesting( base::OnceClosure GpuMemoryBufferImplDXGI::AllocateForTesting(
...@@ -78,7 +77,7 @@ base::OnceClosure GpuMemoryBufferImplDXGI::AllocateForTesting( ...@@ -78,7 +77,7 @@ base::OnceClosure GpuMemoryBufferImplDXGI::AllocateForTesting(
DCHECK(SUCCEEDED(hr)); DCHECK(SUCCEEDED(hr));
gfx::GpuMemoryBufferId kBufferId(1); gfx::GpuMemoryBufferId kBufferId(1);
handle->dxgi_handle = IPC::PlatformFileForTransit(texture_handle); handle->dxgi_handle.Set(texture_handle);
handle->type = gfx::DXGI_SHARED_HANDLE; handle->type = gfx::DXGI_SHARED_HANDLE;
handle->id = kBufferId; handle->id = kBufferId;
return base::DoNothing(); return base::DoNothing();
...@@ -115,7 +114,7 @@ gfx::GpuMemoryBufferHandle GpuMemoryBufferImplDXGI::CloneHandle() const { ...@@ -115,7 +114,7 @@ gfx::GpuMemoryBufferHandle GpuMemoryBufferImplDXGI::CloneHandle() const {
&duplicated_handle, 0, FALSE, DUPLICATE_SAME_ACCESS); &duplicated_handle, 0, FALSE, DUPLICATE_SAME_ACCESS);
if (!result) if (!result)
DPLOG(ERROR) << "Failed to duplicate DXGI resource handle."; DPLOG(ERROR) << "Failed to duplicate DXGI resource handle.";
handle.dxgi_handle = IPC::PlatformFileForTransit(duplicated_handle); handle.dxgi_handle.Set(duplicated_handle);
return handle; return handle;
} }
......
...@@ -26,7 +26,7 @@ class GPU_EXPORT GpuMemoryBufferImplDXGI : public GpuMemoryBufferImpl { ...@@ -26,7 +26,7 @@ class GPU_EXPORT GpuMemoryBufferImplDXGI : public GpuMemoryBufferImpl {
gfx::DXGI_SHARED_HANDLE; gfx::DXGI_SHARED_HANDLE;
static std::unique_ptr<GpuMemoryBufferImplDXGI> CreateFromHandle( static std::unique_ptr<GpuMemoryBufferImplDXGI> CreateFromHandle(
const gfx::GpuMemoryBufferHandle& handle, gfx::GpuMemoryBufferHandle handle,
const gfx::Size& size, const gfx::Size& size,
gfx::BufferFormat format, gfx::BufferFormat format,
gfx::BufferUsage usage, gfx::BufferUsage usage,
......
...@@ -82,7 +82,7 @@ gfx::GpuMemoryBufferHandle GpuMemoryBufferFactoryDXGI::CreateGpuMemoryBuffer( ...@@ -82,7 +82,7 @@ gfx::GpuMemoryBufferHandle GpuMemoryBufferFactoryDXGI::CreateGpuMemoryBuffer(
if (!BufferSizeForBufferFormatChecked(size, format, &buffer_size)) if (!BufferSizeForBufferFormatChecked(size, format, &buffer_size))
return handle; return handle;
handle.dxgi_handle = IPC::PlatformFileForTransit(texture_handle); handle.dxgi_handle.Set(texture_handle);
handle.type = gfx::DXGI_SHARED_HANDLE; handle.type = gfx::DXGI_SHARED_HANDLE;
handle.id = id; handle.id = id;
...@@ -107,10 +107,8 @@ GpuMemoryBufferFactoryDXGI::CreateImageForGpuMemoryBuffer( ...@@ -107,10 +107,8 @@ GpuMemoryBufferFactoryDXGI::CreateImageForGpuMemoryBuffer(
if (handle.type != gfx::DXGI_SHARED_HANDLE) if (handle.type != gfx::DXGI_SHARED_HANDLE)
return nullptr; return nullptr;
// Transfer ownership of handle to GLImageDXGI. // Transfer ownership of handle to GLImageDXGI.
base::win::ScopedHandle handle_owner;
handle_owner.Set(handle.dxgi_handle.GetHandle());
auto image = base::MakeRefCounted<gl::GLImageDXGI>(size, nullptr); auto image = base::MakeRefCounted<gl::GLImageDXGI>(size, nullptr);
if (!image->InitializeHandle(std::move(handle_owner), 0, format)) if (!image->InitializeHandle(std::move(handle.dxgi_handle), 0, format))
return nullptr; return nullptr;
return image; return image;
} }
......
...@@ -624,6 +624,43 @@ void ParamTraits<base::ScopedFD>::Log(const param_type& p, std::string* l) { ...@@ -624,6 +624,43 @@ void ParamTraits<base::ScopedFD>::Log(const param_type& p, std::string* l) {
} }
#endif // defined(OS_POSIX) || defined(OS_FUCHSIA) #endif // defined(OS_POSIX) || defined(OS_FUCHSIA)
#if defined(OS_WIN)
void ParamTraits<base::win::ScopedHandle>::Write(base::Pickle* m,
const param_type& p) {
const bool valid = p.IsValid();
WriteParam(m, valid);
if (!valid)
return;
HandleWin handle(p.Get());
WriteParam(m, handle);
}
bool ParamTraits<base::win::ScopedHandle>::Read(const base::Pickle* m,
base::PickleIterator* iter,
param_type* r) {
r->Close();
bool valid;
if (!ReadParam(m, iter, &valid))
return false;
if (!valid)
return true;
HandleWin handle;
if (!ReadParam(m, iter, &handle))
return false;
r->Set(handle.get_handle());
return true;
}
void ParamTraits<base::win::ScopedHandle>::Log(const param_type& p,
std::string* l) {
l->append(base::StringPrintf("ScopedHandle(%p)", p.Get()));
}
#endif // defined(OS_WIN)
#if defined(OS_FUCHSIA) #if defined(OS_FUCHSIA)
void ParamTraits<zx::vmo>::Write(base::Pickle* m, const param_type& p) { void ParamTraits<zx::vmo>::Write(base::Pickle* m, const param_type& p) {
// This serialization must be kept in sync with // This serialization must be kept in sync with
......
...@@ -607,6 +607,18 @@ struct COMPONENT_EXPORT(IPC) ParamTraits<base::ScopedFD> { ...@@ -607,6 +607,18 @@ struct COMPONENT_EXPORT(IPC) ParamTraits<base::ScopedFD> {
#endif // defined(OS_POSIX) || defined(OS_FUCHSIA) #endif // defined(OS_POSIX) || defined(OS_FUCHSIA)
#if defined(OS_WIN)
template <>
struct COMPONENT_EXPORT(IPC) ParamTraits<base::win::ScopedHandle> {
using param_type = base::win::ScopedHandle;
static void Write(base::Pickle* m, const param_type& p);
static bool Read(const base::Pickle* m,
base::PickleIterator* iter,
param_type* r);
static void Log(const param_type& p, std::string* l);
};
#endif
#if defined(OS_FUCHSIA) #if defined(OS_FUCHSIA)
template <> template <>
struct COMPONENT_EXPORT(IPC) ParamTraits<zx::vmo> { struct COMPONENT_EXPORT(IPC) ParamTraits<zx::vmo> {
......
...@@ -13,10 +13,15 @@ ...@@ -13,10 +13,15 @@
#include "base/memory/ptr_util.h" #include "base/memory/ptr_util.h"
#include "base/test/test_shared_memory_util.h" #include "base/test/test_shared_memory_util.h"
#include "base/unguessable_token.h" #include "base/unguessable_token.h"
#include "build/build_config.h"
#include "ipc/ipc_channel_handle.h" #include "ipc/ipc_channel_handle.h"
#include "ipc/ipc_message.h" #include "ipc/ipc_message.h"
#include "testing/gtest/include/gtest/gtest.h" #include "testing/gtest/include/gtest/gtest.h"
#if defined(OS_WIN)
#include <windows.h>
#endif
namespace IPC { namespace IPC {
namespace { namespace {
...@@ -230,5 +235,23 @@ TEST(IPCMessageUtilsTest, StrongAlias) { ...@@ -230,5 +235,23 @@ TEST(IPCMessageUtilsTest, StrongAlias) {
EXPECT_EQ(input, output); EXPECT_EQ(input, output);
} }
#if defined(OS_WIN)
TEST(IPCMessageUtilsTest, ScopedHandle) {
HANDLE raw_dupe_handle;
ASSERT_TRUE(::DuplicateHandle(::GetCurrentProcess(), ::GetCurrentProcess(),
::GetCurrentProcess(), &raw_dupe_handle, 0,
FALSE, DUPLICATE_SAME_ACCESS));
base::win::ScopedHandle dupe_handle(raw_dupe_handle);
Message message(0, 0, Message::PRIORITY_LOW);
WriteParam(&message, dupe_handle);
base::PickleIterator iter(message);
base::win::ScopedHandle read_handle;
EXPECT_TRUE(ReadParam(&message, &iter, &read_handle));
EXPECT_TRUE(read_handle.IsValid());
}
#endif // defined(OS_WIN)
} // namespace } // namespace
} // namespace IPC } // namespace IPC
...@@ -129,8 +129,7 @@ void XRFrameTransport::FrameSubmit( ...@@ -129,8 +129,7 @@ void XRFrameTransport::FrameSubmit(
// passed over IPC. // passed over IPC.
gfx::GpuMemoryBufferHandle gpu_handle = gpu_memory_buffer->CloneHandle(); gfx::GpuMemoryBufferHandle gpu_handle = gpu_memory_buffer->CloneHandle();
vr_presentation_provider->SubmitFrameWithTextureHandle( vr_presentation_provider->SubmitFrameWithTextureHandle(
vr_frame_id, mojo::PlatformHandle(base::win::ScopedHandle( vr_frame_id, mojo::PlatformHandle(std::move(gpu_handle.dxgi_handle)));
gpu_handle.dxgi_handle.GetHandle())));
#else #else
NOTIMPLEMENTED(); NOTIMPLEMENTED();
#endif #endif
......
...@@ -20,7 +20,7 @@ ...@@ -20,7 +20,7 @@
#elif defined(OS_MACOSX) && !defined(OS_IOS) #elif defined(OS_MACOSX) && !defined(OS_IOS)
#include "ui/gfx/mac/io_surface.h" #include "ui/gfx/mac/io_surface.h"
#elif defined(OS_WIN) #elif defined(OS_WIN)
#include "ipc/ipc_platform_file.h" // nogncheck #include "base/win/scoped_handle.h"
#elif defined(OS_ANDROID) #elif defined(OS_ANDROID)
#include "base/android/scoped_hardware_buffer_handle.h" #include "base/android/scoped_hardware_buffer_handle.h"
#endif #endif
...@@ -70,8 +70,7 @@ struct GFX_EXPORT GpuMemoryBufferHandle { ...@@ -70,8 +70,7 @@ struct GFX_EXPORT GpuMemoryBufferHandle {
#elif defined(OS_MACOSX) && !defined(OS_IOS) #elif defined(OS_MACOSX) && !defined(OS_IOS)
ScopedRefCountedIOSurfaceMachPort mach_port; ScopedRefCountedIOSurfaceMachPort mach_port;
#elif defined(OS_WIN) #elif defined(OS_WIN)
// TODO(crbug.com/863011): convert this to a scoped handle. base::win::ScopedHandle dxgi_handle;
IPC::PlatformFileForTransit dxgi_handle;
#elif defined(OS_ANDROID) #elif defined(OS_ANDROID)
base::android::ScopedHardwareBufferHandle android_hardware_buffer; base::android::ScopedHardwareBufferHandle android_hardware_buffer;
#endif #endif
......
...@@ -101,7 +101,7 @@ union GpuMemoryBufferPlatformHandle { ...@@ -101,7 +101,7 @@ union GpuMemoryBufferPlatformHandle {
handle<platform> mach_port; handle<platform> mach_port;
[EnableIf=is_win] [EnableIf=is_win]
handle dxgi_handle; handle<platform> dxgi_handle;
[EnableIf=is_android] [EnableIf=is_android]
AHardwareBufferHandle android_hardware_buffer_handle; AHardwareBufferHandle android_hardware_buffer_handle;
......
...@@ -6,7 +6,6 @@ ...@@ -6,7 +6,6 @@
#include "build/build_config.h" #include "build/build_config.h"
#include "mojo/public/cpp/base/shared_memory_mojom_traits.h" #include "mojo/public/cpp/base/shared_memory_mojom_traits.h"
#include "mojo/public/cpp/system/platform_handle.h"
#if defined(OS_ANDROID) #if defined(OS_ANDROID)
#include "base/android/scoped_hardware_buffer_handle.h" #include "base/android/scoped_hardware_buffer_handle.h"
...@@ -105,7 +104,7 @@ gfx::mojom::GpuMemoryBufferPlatformHandlePtr StructTraits< ...@@ -105,7 +104,7 @@ gfx::mojom::GpuMemoryBufferPlatformHandlePtr StructTraits<
#if defined(OS_WIN) #if defined(OS_WIN)
DCHECK(handle.dxgi_handle.IsValid()); DCHECK(handle.dxgi_handle.IsValid());
return gfx::mojom::GpuMemoryBufferPlatformHandle::NewDxgiHandle( return gfx::mojom::GpuMemoryBufferPlatformHandle::NewDxgiHandle(
mojo::WrapPlatformFile(handle.dxgi_handle.GetHandle())); mojo::PlatformHandle(std::move(handle.dxgi_handle)));
#else #else
break; break;
#endif #endif
...@@ -182,12 +181,7 @@ bool StructTraits<gfx::mojom::GpuMemoryBufferHandleDataView, ...@@ -182,12 +181,7 @@ bool StructTraits<gfx::mojom::GpuMemoryBufferHandleDataView,
#elif defined(OS_WIN) #elif defined(OS_WIN)
case gfx::mojom::GpuMemoryBufferPlatformHandleDataView::Tag::DXGI_HANDLE: { case gfx::mojom::GpuMemoryBufferPlatformHandleDataView::Tag::DXGI_HANDLE: {
out->type = gfx::DXGI_SHARED_HANDLE; out->type = gfx::DXGI_SHARED_HANDLE;
HANDLE handle; out->dxgi_handle = platform_handle->get_dxgi_handle().TakeHandle();
MojoResult unwrap_result = mojo::UnwrapPlatformFile(
std::move(platform_handle->get_dxgi_handle()), &handle);
if (unwrap_result != MOJO_RESULT_OK)
return false;
out->dxgi_handle = IPC::PlatformFileForTransit(handle);
return true; return true;
} }
#elif defined(OS_ANDROID) #elif defined(OS_ANDROID)
......
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