Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(7)

Side by Side Diff: ui/gl/gl_image_ozone_native_pixmap.cc

Issue 1258713002: ozone: unify GpuMemoryBufferFactoryOzoneNativePixmap in content/ (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Merge gl_image_linux_dma_buffer into gl_image_ozone_native_pixmap Created 5 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2015 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.
4
5 #include "ui/gl/gl_image_ozone_native_pixmap.h"
6
7 #define FOURCC(a, b, c, d) \
8 ((static_cast<uint32>(a)) | (static_cast<uint32>(b) << 8) | \
9 (static_cast<uint32>(c) << 16) | (static_cast<uint32>(d) << 24))
10
11 #define DRM_FORMAT_ARGB8888 FOURCC('A', 'R', '2', '4')
12 #define DRM_FORMAT_XRGB8888 FOURCC('X', 'R', '2', '4')
13
14 namespace gfx {
15 namespace {
16
17 bool ValidInternalFormat(unsigned internalformat) {
18 switch (internalformat) {
19 case GL_RGB:
20 case GL_BGRA_EXT:
21 return true;
22 default:
23 return false;
24 }
25 }
26
27 bool ValidFormat(gfx::GpuMemoryBuffer::Format format) {
28 switch (format) {
29 case GpuMemoryBuffer::BGRA_8888:
30 case GpuMemoryBuffer::RGBX_8888:
31 return true;
32 case GpuMemoryBuffer::ATC:
33 case GpuMemoryBuffer::ATCIA:
34 case GpuMemoryBuffer::DXT1:
35 case GpuMemoryBuffer::DXT5:
36 case GpuMemoryBuffer::ETC1:
37 case GpuMemoryBuffer::R_8:
38 case GpuMemoryBuffer::RGBA_4444:
39 case GpuMemoryBuffer::RGBA_8888:
40 case GpuMemoryBuffer::YUV_420:
41 return false;
42 }
43
44 NOTREACHED();
45 return false;
46 }
47
48 EGLint FourCC(gfx::GpuMemoryBuffer::Format format) {
49 switch (format) {
50 case GpuMemoryBuffer::BGRA_8888:
51 return DRM_FORMAT_ARGB8888;
52 case GpuMemoryBuffer::RGBX_8888:
53 return DRM_FORMAT_XRGB8888;
54 case GpuMemoryBuffer::ATC:
55 case GpuMemoryBuffer::ATCIA:
56 case GpuMemoryBuffer::DXT1:
57 case GpuMemoryBuffer::DXT5:
58 case GpuMemoryBuffer::ETC1:
59 case GpuMemoryBuffer::R_8:
60 case GpuMemoryBuffer::RGBA_4444:
61 case GpuMemoryBuffer::RGBA_8888:
62 case GpuMemoryBuffer::YUV_420:
63 NOTREACHED();
64 return 0;
65 }
66
67 NOTREACHED();
68 return 0;
69 }
70
71 } // namespace
72
73 GLImageOzoneNativePixmap::GLImageOzoneNativePixmap(const Size& size,
74 unsigned internalformat)
75 : GLImageEGL(size), internalformat_(internalformat) {}
76
77 GLImageOzoneNativePixmap::~GLImageOzoneNativePixmap() {
78 DCHECK(!pixmap_);
79 }
80
81 bool GLImageOzoneNativePixmap::Initialize(
82 scoped_refptr<ui::NativePixmap> pixmap,
83 GpuMemoryBuffer::Format format) {
84 DCHECK(pixmap);
85 DCHECK(!pixmap_);
86
87 bool result = false;
reveman 2015/07/29 14:16:41 Would this function be easier to read if you set t
dshwang 2015/07/29 15:15:04 current is more succinct, because otherwise we nee
88 if (pixmap->GetEGLClientBuffer()) {
89 EGLint attrs[] = {EGL_IMAGE_PRESERVED_KHR, EGL_TRUE, EGL_NONE};
90 result = GLImageEGL::Initialize(EGL_NATIVE_PIXMAP_KHR,
91 pixmap->GetEGLClientBuffer(), attrs);
92 } else if (pixmap->GetDmaBufFd() >= 0) {
93 base::FileDescriptor handle(pixmap->GetDmaBufFd(), false);
reveman 2015/07/29 14:16:41 Is this temporary |handle| variable necessary?
dshwang 2015/07/29 15:15:04 no, removed.
94
95 if (!ValidInternalFormat(internalformat_)) {
96 LOG(ERROR) << "Invalid internalformat: " << internalformat_;
97 return false;
98 }
99
100 if (!ValidFormat(format)) {
101 LOG(ERROR) << "Invalid format: " << format;
102 return false;
103 }
104
105 // Note: If eglCreateImageKHR is successful for a EGL_LINUX_DMA_BUF_EXT
106 // target, the EGL will take a reference to the dma_buf.
107 EGLint attrs[] = {EGL_WIDTH,
108 size_.width(),
109 EGL_HEIGHT,
110 size_.height(),
111 EGL_LINUX_DRM_FOURCC_EXT,
112 FourCC(format),
113 EGL_DMA_BUF_PLANE0_FD_EXT,
114 handle.fd,
115 EGL_DMA_BUF_PLANE0_OFFSET_EXT,
116 0,
117 EGL_DMA_BUF_PLANE0_PITCH_EXT,
118 pixmap->GetDmaBufPitch(),
119 EGL_NONE};
120 result = GLImageEGL::Initialize(EGL_LINUX_DMA_BUF_EXT,
121 static_cast<EGLClientBuffer>(NULL), attrs);
reveman 2015/07/29 14:16:41 Indent looks wierd here. Please clang format the p
dshwang 2015/07/29 15:15:04 Done.
122 }
123
124 if (result)
125 pixmap_ = pixmap;
126 return result;
127 }
128
129 unsigned GLImageOzoneNativePixmap::GetInternalFormat() {
130 return internalformat_;
131 }
132
133 void GLImageOzoneNativePixmap::Destroy(bool have_context) {
134 GLImageEGL::Destroy(have_context);
135 pixmap_ = nullptr;
136 }
137
138 bool GLImageOzoneNativePixmap::ScheduleOverlayPlane(AcceleratedWidget widget,
139 int z_order,
140 OverlayTransform transform,
141 const Rect& bounds_rect,
142 const RectF& crop_rect) {
143 DCHECK(pixmap_);
144 return pixmap_->ScheduleOverlayPlane(widget, z_order, transform, bounds_rect,
145 crop_rect);
146 }
147
148 } // namespace gfx
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698