[Sync] Make it impossible to get a reference to AndroidSyncSettings.
[chromium-blink-merge.git] / ui / gl / gl_image_linux_dma_buffer.cc
blob20adb2fdaaf2abb3c96a96c7fdd8064115558c45
1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "ui/gl/gl_image_linux_dma_buffer.h"
7 #include <unistd.h>
9 #define FOURCC(a, b, c, d) \
10 ((static_cast<uint32>(a)) | (static_cast<uint32>(b) << 8) | \
11 (static_cast<uint32>(c) << 16) | (static_cast<uint32>(d) << 24))
13 #define DRM_FORMAT_ARGB8888 FOURCC('A', 'R', '2', '4')
14 #define DRM_FORMAT_XRGB8888 FOURCC('X', 'R', '2', '4')
16 namespace gfx {
17 namespace {
19 bool ValidInternalFormat(unsigned internalformat) {
20 switch (internalformat) {
21 case GL_RGB:
22 case GL_BGRA_EXT:
23 return true;
24 default:
25 return false;
29 bool ValidFormat(gfx::GpuMemoryBuffer::Format format) {
30 switch (format) {
31 case gfx::GpuMemoryBuffer::BGRA_8888:
32 case gfx::GpuMemoryBuffer::RGBX_8888:
33 return true;
34 case gfx::GpuMemoryBuffer::ATC:
35 case gfx::GpuMemoryBuffer::ATCIA:
36 case gfx::GpuMemoryBuffer::DXT1:
37 case gfx::GpuMemoryBuffer::DXT5:
38 case gfx::GpuMemoryBuffer::ETC1:
39 case gfx::GpuMemoryBuffer::R_8:
40 case gfx::GpuMemoryBuffer::RGBA_8888:
41 case gfx::GpuMemoryBuffer::YUV_420:
42 return false;
45 NOTREACHED();
46 return false;
49 EGLint FourCC(gfx::GpuMemoryBuffer::Format format) {
50 switch (format) {
51 case GpuMemoryBuffer::BGRA_8888:
52 return DRM_FORMAT_ARGB8888;
53 case GpuMemoryBuffer::RGBX_8888:
54 return DRM_FORMAT_XRGB8888;
55 case GpuMemoryBuffer::ATC:
56 case GpuMemoryBuffer::ATCIA:
57 case GpuMemoryBuffer::DXT1:
58 case GpuMemoryBuffer::DXT5:
59 case GpuMemoryBuffer::ETC1:
60 case GpuMemoryBuffer::R_8:
61 case GpuMemoryBuffer::RGBA_8888:
62 case GpuMemoryBuffer::YUV_420:
63 NOTREACHED();
64 return 0;
67 NOTREACHED();
68 return 0;
71 bool IsHandleValid(const base::FileDescriptor& handle) {
72 return handle.fd >= 0;
75 } // namespace
77 GLImageLinuxDMABuffer::GLImageLinuxDMABuffer(const Size& size,
78 unsigned internalformat)
79 : GLImageEGL(size), internalformat_(internalformat) {
82 GLImageLinuxDMABuffer::~GLImageLinuxDMABuffer() {
85 bool GLImageLinuxDMABuffer::Initialize(const base::FileDescriptor& handle,
86 GpuMemoryBuffer::Format format,
87 int pitch) {
88 if (!ValidInternalFormat(internalformat_)) {
89 LOG(ERROR) << "Invalid internalformat: " << internalformat_;
90 return false;
93 if (!ValidFormat(format)) {
94 LOG(ERROR) << "Invalid format: " << format;
95 return false;
98 if (!IsHandleValid(handle)) {
99 LOG(ERROR) << "Invalid file descriptor: " << handle.fd;
100 return false;
103 // Note: If eglCreateImageKHR is successful for a EGL_LINUX_DMA_BUF_EXT
104 // target, the EGL will take a reference to the dma_buf.
105 EGLint attrs[] = {EGL_WIDTH,
106 size_.width(),
107 EGL_HEIGHT,
108 size_.height(),
109 EGL_LINUX_DRM_FOURCC_EXT,
110 FourCC(format),
111 EGL_DMA_BUF_PLANE0_FD_EXT,
112 handle.fd,
113 EGL_DMA_BUF_PLANE0_OFFSET_EXT,
115 EGL_DMA_BUF_PLANE0_PITCH_EXT,
116 pitch,
117 EGL_NONE};
118 return GLImageEGL::Initialize(
119 EGL_LINUX_DMA_BUF_EXT, static_cast<EGLClientBuffer>(NULL), attrs);
122 unsigned GLImageLinuxDMABuffer::GetInternalFormat() { return internalformat_; }
124 } // namespace gfx