blob: ad32c87e2ee6a32e4c1a343ffc6dda2caf4d9917 [file] [log] [blame]
// Copyright 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "ui/gfx/gpu_memory_buffer.h"
#include "base/process/process_handle.h"
#include "ui/gfx/generic_shared_memory_id.h"
#if defined(OS_WIN)
#include <windows.h>
#elif defined(OS_ANDROID)
#include "base/android/android_hardware_buffer_compat.h"
#endif
namespace gfx {
GpuMemoryBufferHandle::GpuMemoryBufferHandle() : type(EMPTY_BUFFER), id(0) {}
GpuMemoryBufferHandle::GpuMemoryBufferHandle(GpuMemoryBufferHandle&& other) =
default;
GpuMemoryBufferHandle& GpuMemoryBufferHandle::operator=(
GpuMemoryBufferHandle&& other) = default;
GpuMemoryBufferHandle::~GpuMemoryBufferHandle() = default;
void GpuMemoryBuffer::SetColorSpace(const gfx::ColorSpace& color_space) {}
GpuMemoryBufferHandle CloneHandleForIPC(
const GpuMemoryBufferHandle& source_handle) {
switch (source_handle.type) {
case gfx::EMPTY_BUFFER:
NOTREACHED();
return gfx::GpuMemoryBufferHandle();
case gfx::SHARED_MEMORY_BUFFER: {
gfx::GpuMemoryBufferHandle handle;
handle.type = gfx::SHARED_MEMORY_BUFFER;
handle.id = source_handle.id;
handle.handle = base::SharedMemory::DuplicateHandle(source_handle.handle);
handle.offset = source_handle.offset;
handle.stride = source_handle.stride;
return handle;
}
case gfx::NATIVE_PIXMAP: {
gfx::GpuMemoryBufferHandle handle;
handle.type = gfx::NATIVE_PIXMAP;
handle.id = source_handle.id;
#if defined(OS_LINUX)
handle.native_pixmap_handle =
gfx::CloneHandleForIPC(source_handle.native_pixmap_handle);
#endif
return handle;
}
case gfx::ANDROID_HARDWARE_BUFFER: {
gfx::GpuMemoryBufferHandle handle;
handle.type = gfx::ANDROID_HARDWARE_BUFFER;
handle.id = source_handle.id;
#if defined(OS_ANDROID)
base::AndroidHardwareBufferCompat::GetInstance().Acquire(
source_handle.android_hardware_buffer);
handle.android_hardware_buffer = source_handle.android_hardware_buffer;
#endif
return handle;
}
case gfx::IO_SURFACE_BUFFER: {
gfx::GpuMemoryBufferHandle handle;
handle.type = gfx::IO_SURFACE_BUFFER;
handle.id = source_handle.id;
#if defined(OS_MACOSX) && !defined(OS_IOS)
handle.mach_port = source_handle.mach_port;
#endif
return handle;
}
case gfx::DXGI_SHARED_HANDLE:
gfx::GpuMemoryBufferHandle handle;
handle.type = gfx::DXGI_SHARED_HANDLE;
handle.id = source_handle.id;
#if defined(OS_WIN)
base::ProcessHandle process = ::GetCurrentProcess();
HANDLE duplicated_handle;
BOOL result = ::DuplicateHandle(
process, source_handle.dxgi_handle.GetHandle(), process,
&duplicated_handle, 0, FALSE, DUPLICATE_SAME_ACCESS);
if (!result)
DPLOG(ERROR) << "Failed to duplicate DXGI resource handle.";
handle.dxgi_handle = IPC::PlatformFileForTransit(duplicated_handle);
#endif
return handle;
}
return gfx::GpuMemoryBufferHandle();
}
base::trace_event::MemoryAllocatorDumpGuid GpuMemoryBuffer::GetGUIDForTracing(
uint64_t tracing_process_id) const {
return gfx::GetGenericSharedGpuMemoryGUIDForTracing(tracing_process_id,
GetId());
}
} // namespace gfx