OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "ui/gl/gl_image_ozone_native_pixmap.h" | 5 #include "ui/gl/gl_image_ozone_native_pixmap.h" |
6 | 6 |
7 #define FOURCC(a, b, c, d) \ | 7 #define FOURCC(a, b, c, d) \ |
8 ((static_cast<uint32>(a)) | (static_cast<uint32>(b) << 8) | \ | 8 ((static_cast<uint32>(a)) | (static_cast<uint32>(b) << 8) | \ |
9 (static_cast<uint32>(c) << 16) | (static_cast<uint32>(d) << 24)) | 9 (static_cast<uint32>(c) << 16) | (static_cast<uint32>(d) << 24)) |
10 | 10 |
11 #define DRM_FORMAT_ARGB8888 FOURCC('A', 'R', '2', '4') | 11 #define DRM_FORMAT_ARGB8888 FOURCC('A', 'R', '2', '4') |
12 #define DRM_FORMAT_ABGR8888 FOURCC('A', 'B', '2', '4') | 12 #define DRM_FORMAT_ABGR8888 FOURCC('A', 'B', '2', '4') |
13 #define DRM_FORMAT_XRGB8888 FOURCC('X', 'R', '2', '4') | 13 #define DRM_FORMAT_XRGB8888 FOURCC('X', 'R', '2', '4') |
14 | 14 |
15 namespace gfx { | 15 namespace gfx { |
16 namespace { | 16 namespace { |
17 | 17 |
18 bool ValidInternalFormat(unsigned internalformat) { | 18 bool ValidInternalFormat(unsigned internalformat) { |
19 switch (internalformat) { | 19 switch (internalformat) { |
20 case GL_RGB: | 20 case GL_RGB: |
21 case GL_RGBA: | 21 case GL_RGBA: |
22 case GL_BGRA_EXT: | 22 case GL_BGRA_EXT: |
23 return true; | 23 return true; |
24 default: | 24 default: |
25 return false; | 25 return false; |
26 } | 26 } |
27 } | 27 } |
28 | 28 |
29 bool ValidFormat(gfx::BufferFormat format) { | 29 bool ValidFormat(BufferFormat format) { |
30 switch (format) { | 30 switch (format) { |
31 case BufferFormat::RGBA_8888: | 31 case BufferFormat::RGBA_8888: |
32 case BufferFormat::BGRA_8888: | 32 case BufferFormat::BGRA_8888: |
33 case BufferFormat::BGRX_8888: | 33 case BufferFormat::BGRX_8888: |
34 return true; | 34 return true; |
35 case BufferFormat::ATC: | 35 case BufferFormat::ATC: |
36 case BufferFormat::ATCIA: | 36 case BufferFormat::ATCIA: |
37 case BufferFormat::DXT1: | 37 case BufferFormat::DXT1: |
38 case BufferFormat::DXT5: | 38 case BufferFormat::DXT5: |
39 case BufferFormat::ETC1: | 39 case BufferFormat::ETC1: |
40 case BufferFormat::R_8: | 40 case BufferFormat::R_8: |
41 case BufferFormat::RGBA_4444: | 41 case BufferFormat::RGBA_4444: |
42 case BufferFormat::YUV_420: | 42 case BufferFormat::YUV_420: |
43 case BufferFormat::YUV_420_BIPLANAR: | 43 case BufferFormat::YUV_420_BIPLANAR: |
44 case BufferFormat::UYVY_422: | 44 case BufferFormat::UYVY_422: |
45 return false; | 45 return false; |
46 } | 46 } |
47 | 47 |
48 NOTREACHED(); | 48 NOTREACHED(); |
49 return false; | 49 return false; |
50 } | 50 } |
51 | 51 |
52 EGLint FourCC(gfx::BufferFormat format) { | 52 EGLint FourCC(BufferFormat format) { |
53 switch (format) { | 53 switch (format) { |
54 case BufferFormat::RGBA_8888: | 54 case BufferFormat::RGBA_8888: |
55 return DRM_FORMAT_ABGR8888; | 55 return DRM_FORMAT_ABGR8888; |
56 case BufferFormat::BGRA_8888: | 56 case BufferFormat::BGRA_8888: |
57 return DRM_FORMAT_ARGB8888; | 57 return DRM_FORMAT_ARGB8888; |
58 case BufferFormat::BGRX_8888: | 58 case BufferFormat::BGRX_8888: |
59 return DRM_FORMAT_XRGB8888; | 59 return DRM_FORMAT_XRGB8888; |
60 case BufferFormat::ATC: | 60 case BufferFormat::ATC: |
61 case BufferFormat::ATCIA: | 61 case BufferFormat::ATCIA: |
62 case BufferFormat::DXT1: | 62 case BufferFormat::DXT1: |
(...skipping 17 matching lines...) Expand all Loading... |
80 GLImageOzoneNativePixmap::GLImageOzoneNativePixmap(const Size& size, | 80 GLImageOzoneNativePixmap::GLImageOzoneNativePixmap(const Size& size, |
81 unsigned internalformat) | 81 unsigned internalformat) |
82 : GLImageEGL(size), internalformat_(internalformat) {} | 82 : GLImageEGL(size), internalformat_(internalformat) {} |
83 | 83 |
84 GLImageOzoneNativePixmap::~GLImageOzoneNativePixmap() { | 84 GLImageOzoneNativePixmap::~GLImageOzoneNativePixmap() { |
85 } | 85 } |
86 | 86 |
87 bool GLImageOzoneNativePixmap::Initialize(ui::NativePixmap* pixmap, | 87 bool GLImageOzoneNativePixmap::Initialize(ui::NativePixmap* pixmap, |
88 BufferFormat format) { | 88 BufferFormat format) { |
89 DCHECK(!pixmap_); | 89 DCHECK(!pixmap_); |
90 | |
91 bool result = true; | |
92 if (pixmap->GetEGLClientBuffer()) { | 90 if (pixmap->GetEGLClientBuffer()) { |
93 EGLint attrs[] = {EGL_IMAGE_PRESERVED_KHR, EGL_TRUE, EGL_NONE}; | 91 EGLint attrs[] = {EGL_IMAGE_PRESERVED_KHR, EGL_TRUE, EGL_NONE}; |
94 result = GLImageEGL::Initialize(EGL_NATIVE_PIXMAP_KHR, | 92 if (!GLImageEGL::Initialize(EGL_NATIVE_PIXMAP_KHR, |
95 pixmap->GetEGLClientBuffer(), attrs); | 93 pixmap->GetEGLClientBuffer(), attrs)) { |
| 94 return false; |
| 95 } |
96 } else if (pixmap->GetDmaBufFd() >= 0) { | 96 } else if (pixmap->GetDmaBufFd() >= 0) { |
97 if (!ValidInternalFormat(internalformat_)) { | 97 if (!ValidInternalFormat(internalformat_)) { |
98 LOG(ERROR) << "Invalid internalformat: " << internalformat_; | 98 LOG(ERROR) << "Invalid internalformat: " << internalformat_; |
99 return false; | 99 return false; |
100 } | 100 } |
101 | 101 |
102 if (!ValidFormat(format)) { | 102 if (!ValidFormat(format)) { |
103 LOG(ERROR) << "Invalid format: " << static_cast<int>(format); | 103 LOG(ERROR) << "Invalid format: " << static_cast<int>(format); |
104 return false; | 104 return false; |
105 } | 105 } |
106 | 106 |
107 // Note: If eglCreateImageKHR is successful for a EGL_LINUX_DMA_BUF_EXT | 107 // Note: If eglCreateImageKHR is successful for a EGL_LINUX_DMA_BUF_EXT |
108 // target, the EGL will take a reference to the dma_buf. | 108 // target, the EGL will take a reference to the dma_buf. |
109 EGLint attrs[] = {EGL_WIDTH, | 109 EGLint attrs[] = {EGL_WIDTH, |
110 size_.width(), | 110 size_.width(), |
111 EGL_HEIGHT, | 111 EGL_HEIGHT, |
112 size_.height(), | 112 size_.height(), |
113 EGL_LINUX_DRM_FOURCC_EXT, | 113 EGL_LINUX_DRM_FOURCC_EXT, |
114 FourCC(format), | 114 FourCC(format), |
115 EGL_DMA_BUF_PLANE0_FD_EXT, | 115 EGL_DMA_BUF_PLANE0_FD_EXT, |
116 pixmap->GetDmaBufFd(), | 116 pixmap->GetDmaBufFd(), |
117 EGL_DMA_BUF_PLANE0_OFFSET_EXT, | 117 EGL_DMA_BUF_PLANE0_OFFSET_EXT, |
118 0, | 118 0, |
119 EGL_DMA_BUF_PLANE0_PITCH_EXT, | 119 EGL_DMA_BUF_PLANE0_PITCH_EXT, |
120 pixmap->GetDmaBufPitch(), | 120 pixmap->GetDmaBufPitch(), |
121 EGL_NONE}; | 121 EGL_NONE}; |
122 result = GLImageEGL::Initialize( | 122 if (!GLImageEGL::Initialize(EGL_LINUX_DMA_BUF_EXT, |
123 EGL_LINUX_DMA_BUF_EXT, static_cast<EGLClientBuffer>(nullptr), attrs); | 123 static_cast<EGLClientBuffer>(nullptr), attrs)) { |
| 124 return false; |
| 125 } |
124 } | 126 } |
125 | 127 |
126 if (result) | 128 pixmap_ = pixmap; |
127 pixmap_ = pixmap; | 129 return true; |
128 return result; | |
129 } | 130 } |
130 | 131 |
131 unsigned GLImageOzoneNativePixmap::GetInternalFormat() { | 132 unsigned GLImageOzoneNativePixmap::GetInternalFormat() { |
132 return internalformat_; | 133 return internalformat_; |
133 } | 134 } |
134 | 135 |
135 void GLImageOzoneNativePixmap::Destroy(bool have_context) { | 136 void GLImageOzoneNativePixmap::Destroy(bool have_context) { |
136 GLImageEGL::Destroy(have_context); | 137 GLImageEGL::Destroy(have_context); |
137 } | 138 } |
138 | 139 |
139 bool GLImageOzoneNativePixmap::ScheduleOverlayPlane(AcceleratedWidget widget, | 140 bool GLImageOzoneNativePixmap::ScheduleOverlayPlane(AcceleratedWidget widget, |
140 int z_order, | 141 int z_order, |
141 OverlayTransform transform, | 142 OverlayTransform transform, |
142 const Rect& bounds_rect, | 143 const Rect& bounds_rect, |
143 const RectF& crop_rect) { | 144 const RectF& crop_rect) { |
144 DCHECK(pixmap_); | 145 DCHECK(pixmap_); |
145 return pixmap_->ScheduleOverlayPlane(widget, z_order, transform, bounds_rect, | 146 return pixmap_->ScheduleOverlayPlane(widget, z_order, transform, bounds_rect, |
146 crop_rect); | 147 crop_rect); |
147 } | 148 } |
148 | 149 |
149 void GLImageOzoneNativePixmap::OnMemoryDump( | 150 void GLImageOzoneNativePixmap::OnMemoryDump( |
150 base::trace_event::ProcessMemoryDump* pmd, | 151 base::trace_event::ProcessMemoryDump* pmd, |
151 uint64_t process_tracing_id, | 152 uint64_t process_tracing_id, |
152 const std::string& dump_name) { | 153 const std::string& dump_name) { |
153 // TODO(ericrk): Implement GLImage OnMemoryDump. crbug.com/514914 | 154 // TODO(ericrk): Implement GLImage OnMemoryDump. crbug.com/514914 |
154 } | 155 } |
155 | 156 |
156 } // namespace gfx | 157 } // namespace gfx |
OLD | NEW |