| Index: ui/gl/gl_image_ozone_native_pixmap.cc
|
| diff --git a/ui/gl/gl_image_ozone_native_pixmap.cc b/ui/gl/gl_image_ozone_native_pixmap.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..30518b9207a88d8f4348eff5076dbd8ac03f9d00
|
| --- /dev/null
|
| +++ b/ui/gl/gl_image_ozone_native_pixmap.cc
|
| @@ -0,0 +1,144 @@
|
| +// Copyright 2015 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/gl/gl_image_ozone_native_pixmap.h"
|
| +
|
| +#define FOURCC(a, b, c, d) \
|
| + ((static_cast<uint32>(a)) | (static_cast<uint32>(b) << 8) | \
|
| + (static_cast<uint32>(c) << 16) | (static_cast<uint32>(d) << 24))
|
| +
|
| +#define DRM_FORMAT_ARGB8888 FOURCC('A', 'R', '2', '4')
|
| +#define DRM_FORMAT_XRGB8888 FOURCC('X', 'R', '2', '4')
|
| +
|
| +namespace gfx {
|
| +namespace {
|
| +
|
| +bool ValidInternalFormat(unsigned internalformat) {
|
| + switch (internalformat) {
|
| + case GL_RGB:
|
| + case GL_BGRA_EXT:
|
| + return true;
|
| + default:
|
| + return false;
|
| + }
|
| +}
|
| +
|
| +bool ValidFormat(gfx::GpuMemoryBuffer::Format format) {
|
| + switch (format) {
|
| + case GpuMemoryBuffer::BGRA_8888:
|
| + case GpuMemoryBuffer::RGBX_8888:
|
| + return true;
|
| + case GpuMemoryBuffer::ATC:
|
| + case GpuMemoryBuffer::ATCIA:
|
| + case GpuMemoryBuffer::DXT1:
|
| + case GpuMemoryBuffer::DXT5:
|
| + case GpuMemoryBuffer::ETC1:
|
| + case GpuMemoryBuffer::R_8:
|
| + case GpuMemoryBuffer::RGBA_4444:
|
| + case GpuMemoryBuffer::RGBA_8888:
|
| + case GpuMemoryBuffer::YUV_420:
|
| + return false;
|
| + }
|
| +
|
| + NOTREACHED();
|
| + return false;
|
| +}
|
| +
|
| +EGLint FourCC(gfx::GpuMemoryBuffer::Format format) {
|
| + switch (format) {
|
| + case GpuMemoryBuffer::BGRA_8888:
|
| + return DRM_FORMAT_ARGB8888;
|
| + case GpuMemoryBuffer::RGBX_8888:
|
| + return DRM_FORMAT_XRGB8888;
|
| + case GpuMemoryBuffer::ATC:
|
| + case GpuMemoryBuffer::ATCIA:
|
| + case GpuMemoryBuffer::DXT1:
|
| + case GpuMemoryBuffer::DXT5:
|
| + case GpuMemoryBuffer::ETC1:
|
| + case GpuMemoryBuffer::R_8:
|
| + case GpuMemoryBuffer::RGBA_4444:
|
| + case GpuMemoryBuffer::RGBA_8888:
|
| + case GpuMemoryBuffer::YUV_420:
|
| + NOTREACHED();
|
| + return 0;
|
| + }
|
| +
|
| + NOTREACHED();
|
| + return 0;
|
| +}
|
| +
|
| +} // namespace
|
| +
|
| +GLImageOzoneNativePixmap::GLImageOzoneNativePixmap(const Size& size,
|
| + unsigned internalformat)
|
| + : GLImageEGL(size), internalformat_(internalformat) {}
|
| +
|
| +GLImageOzoneNativePixmap::~GLImageOzoneNativePixmap() {
|
| + DCHECK(!pixmap_);
|
| +}
|
| +
|
| +bool GLImageOzoneNativePixmap::Initialize(ui::NativePixmap* pixmap,
|
| + GpuMemoryBuffer::Format format) {
|
| + DCHECK(!pixmap_);
|
| +
|
| + bool result = true;
|
| + if (pixmap->GetEGLClientBuffer()) {
|
| + EGLint attrs[] = {EGL_IMAGE_PRESERVED_KHR, EGL_TRUE, EGL_NONE};
|
| + result = GLImageEGL::Initialize(EGL_NATIVE_PIXMAP_KHR,
|
| + pixmap->GetEGLClientBuffer(), attrs);
|
| + } else if (pixmap->GetDmaBufFd() >= 0) {
|
| + if (!ValidInternalFormat(internalformat_)) {
|
| + LOG(ERROR) << "Invalid internalformat: " << internalformat_;
|
| + return false;
|
| + }
|
| +
|
| + if (!ValidFormat(format)) {
|
| + LOG(ERROR) << "Invalid format: " << format;
|
| + return false;
|
| + }
|
| +
|
| + // Note: If eglCreateImageKHR is successful for a EGL_LINUX_DMA_BUF_EXT
|
| + // target, the EGL will take a reference to the dma_buf.
|
| + EGLint attrs[] = {EGL_WIDTH,
|
| + size_.width(),
|
| + EGL_HEIGHT,
|
| + size_.height(),
|
| + EGL_LINUX_DRM_FOURCC_EXT,
|
| + FourCC(format),
|
| + EGL_DMA_BUF_PLANE0_FD_EXT,
|
| + pixmap->GetDmaBufFd(),
|
| + EGL_DMA_BUF_PLANE0_OFFSET_EXT,
|
| + 0,
|
| + EGL_DMA_BUF_PLANE0_PITCH_EXT,
|
| + pixmap->GetDmaBufPitch(),
|
| + EGL_NONE};
|
| + result = GLImageEGL::Initialize(
|
| + EGL_LINUX_DMA_BUF_EXT, static_cast<EGLClientBuffer>(nullptr), attrs);
|
| + }
|
| +
|
| + if (result)
|
| + pixmap_ = pixmap;
|
| + return result;
|
| +}
|
| +
|
| +unsigned GLImageOzoneNativePixmap::GetInternalFormat() {
|
| + return internalformat_;
|
| +}
|
| +
|
| +void GLImageOzoneNativePixmap::Destroy(bool have_context) {
|
| + GLImageEGL::Destroy(have_context);
|
| + pixmap_ = nullptr;
|
| +}
|
| +
|
| +bool GLImageOzoneNativePixmap::ScheduleOverlayPlane(AcceleratedWidget widget,
|
| + int z_order,
|
| + OverlayTransform transform,
|
| + const Rect& bounds_rect,
|
| + const RectF& crop_rect) {
|
| + DCHECK(pixmap_);
|
| + return pixmap_->ScheduleOverlayPlane(widget, z_order, transform, bounds_rect,
|
| + crop_rect);
|
| +}
|
| +
|
| +} // namespace gfx
|
|
|