OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 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 | 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 "content/common/gpu/gpu_memory_buffer_factory_io_surface.h" | 5 #include "content/common/gpu/gpu_memory_buffer_factory_io_surface.h" |
6 | 6 |
7 #include <CoreFoundation/CoreFoundation.h> | 7 #include <CoreFoundation/CoreFoundation.h> |
8 | 8 |
9 #include <vector> | 9 #include <vector> |
10 | 10 |
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
108 gfx::BufferFormat format, | 108 gfx::BufferFormat format, |
109 gfx::BufferUsage usage) { | 109 gfx::BufferUsage usage) { |
110 for (auto& configuration : kSupportedConfigurations) { | 110 for (auto& configuration : kSupportedConfigurations) { |
111 if (configuration.format == format && configuration.usage == usage) | 111 if (configuration.format == format && configuration.usage == usage) |
112 return true; | 112 return true; |
113 } | 113 } |
114 | 114 |
115 return false; | 115 return false; |
116 } | 116 } |
117 | 117 |
118 void GpuMemoryBufferFactoryIOSurface::GetSupportedGpuMemoryBufferConfigurations( | 118 // static |
119 std::vector<Configuration>* configurations) { | 119 IOSurfaceRef GpuMemoryBufferFactoryIOSurface |
120 configurations->assign( | 120 : CreateIOSurface(const gfx::Size& size, gfx::BufferFormat format) { |
121 kSupportedConfigurations, | |
122 kSupportedConfigurations + arraysize(kSupportedConfigurations)); | |
123 } | |
124 | |
125 gfx::GpuMemoryBufferHandle | |
126 GpuMemoryBufferFactoryIOSurface::CreateGpuMemoryBuffer( | |
127 gfx::GpuMemoryBufferId id, | |
128 const gfx::Size& size, | |
129 gfx::BufferFormat format, | |
130 gfx::BufferUsage usage, | |
131 int client_id, | |
132 gfx::PluginWindowHandle surface_handle) { | |
133 size_t num_planes = gfx::NumberOfPlanesForBufferFormat(format); | 121 size_t num_planes = gfx::NumberOfPlanesForBufferFormat(format); |
134 base::ScopedCFTypeRef<CFMutableArrayRef> planes(CFArrayCreateMutable( | 122 base::ScopedCFTypeRef<CFMutableArrayRef> planes(CFArrayCreateMutable( |
135 kCFAllocatorDefault, num_planes, &kCFTypeArrayCallBacks)); | 123 kCFAllocatorDefault, num_planes, &kCFTypeArrayCallBacks)); |
136 | 124 |
137 for (size_t plane = 0; plane < num_planes; ++plane) { | 125 for (size_t plane = 0; plane < num_planes; ++plane) { |
138 size_t factor = gfx::SubsamplingFactorForBufferFormat(format, plane); | 126 size_t factor = gfx::SubsamplingFactorForBufferFormat(format, plane); |
139 | 127 |
140 base::ScopedCFTypeRef<CFMutableDictionaryRef> plane_info( | 128 base::ScopedCFTypeRef<CFMutableDictionaryRef> plane_info( |
141 CFDictionaryCreateMutable(kCFAllocatorDefault, 0, | 129 CFDictionaryCreateMutable(kCFAllocatorDefault, 0, |
142 &kCFTypeDictionaryKeyCallBacks, | 130 &kCFTypeDictionaryKeyCallBacks, |
143 &kCFTypeDictionaryValueCallBacks)); | 131 &kCFTypeDictionaryValueCallBacks)); |
144 AddIntegerValue(plane_info, kIOSurfacePlaneWidth, size.width() / factor); | 132 AddIntegerValue(plane_info, kIOSurfacePlaneWidth, size.width() / factor); |
145 AddIntegerValue(plane_info, kIOSurfacePlaneHeight, size.height() / factor); | 133 AddIntegerValue(plane_info, kIOSurfacePlaneHeight, size.height() / factor); |
146 AddIntegerValue(plane_info, kIOSurfacePlaneBytesPerElement, | 134 AddIntegerValue(plane_info, kIOSurfacePlaneBytesPerElement, |
147 BytesPerElement(format, plane)); | 135 BytesPerElement(format, plane)); |
148 | 136 |
149 CFArrayAppendValue(planes, plane_info); | 137 CFArrayAppendValue(planes, plane_info); |
150 } | 138 } |
151 | 139 |
152 base::ScopedCFTypeRef<CFMutableDictionaryRef> properties( | 140 base::ScopedCFTypeRef<CFMutableDictionaryRef> properties( |
153 CFDictionaryCreateMutable(kCFAllocatorDefault, 0, | 141 CFDictionaryCreateMutable(kCFAllocatorDefault, 0, |
154 &kCFTypeDictionaryKeyCallBacks, | 142 &kCFTypeDictionaryKeyCallBacks, |
155 &kCFTypeDictionaryValueCallBacks)); | 143 &kCFTypeDictionaryValueCallBacks)); |
156 AddIntegerValue(properties, kIOSurfaceWidth, size.width()); | 144 AddIntegerValue(properties, kIOSurfaceWidth, size.width()); |
157 AddIntegerValue(properties, kIOSurfaceHeight, size.height()); | 145 AddIntegerValue(properties, kIOSurfaceHeight, size.height()); |
158 AddIntegerValue(properties, kIOSurfacePixelFormat, PixelFormat(format)); | 146 AddIntegerValue(properties, kIOSurfacePixelFormat, PixelFormat(format)); |
159 CFDictionaryAddValue(properties, kIOSurfacePlaneInfo, planes); | 147 CFDictionaryAddValue(properties, kIOSurfacePlaneInfo, planes); |
160 | 148 |
161 base::ScopedCFTypeRef<IOSurfaceRef> io_surface(IOSurfaceCreate(properties)); | 149 return IOSurfaceCreate(properties); |
| 150 } |
| 151 |
| 152 gfx::GpuMemoryBufferHandle |
| 153 GpuMemoryBufferFactoryIOSurface::CreateGpuMemoryBuffer( |
| 154 gfx::GpuMemoryBufferId id, |
| 155 const gfx::Size& size, |
| 156 gfx::BufferFormat format, |
| 157 gfx::BufferUsage usage, |
| 158 int client_id, |
| 159 gfx::PluginWindowHandle surface_handle) { |
| 160 base::ScopedCFTypeRef<IOSurfaceRef> io_surface(CreateIOSurface(size, format)); |
162 if (!io_surface) | 161 if (!io_surface) |
163 return gfx::GpuMemoryBufferHandle(); | 162 return gfx::GpuMemoryBufferHandle(); |
164 | 163 |
165 if (!IOSurfaceManager::GetInstance()->RegisterIOSurface(id, client_id, | 164 if (!IOSurfaceManager::GetInstance()->RegisterIOSurface(id, client_id, |
166 io_surface)) { | 165 io_surface)) { |
167 return gfx::GpuMemoryBufferHandle(); | 166 return gfx::GpuMemoryBufferHandle(); |
168 } | 167 } |
169 | 168 |
170 { | 169 { |
171 base::AutoLock lock(io_surfaces_lock_); | 170 base::AutoLock lock(io_surfaces_lock_); |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
216 | 215 |
217 scoped_refptr<gfx::GLImageIOSurface> image( | 216 scoped_refptr<gfx::GLImageIOSurface> image( |
218 new gfx::GLImageIOSurface(handle.id, size, internalformat)); | 217 new gfx::GLImageIOSurface(handle.id, size, internalformat)); |
219 if (!image->Initialize(it->second.get(), format)) | 218 if (!image->Initialize(it->second.get(), format)) |
220 return scoped_refptr<gfx::GLImage>(); | 219 return scoped_refptr<gfx::GLImage>(); |
221 | 220 |
222 return image; | 221 return image; |
223 } | 222 } |
224 | 223 |
225 } // namespace content | 224 } // namespace content |
OLD | NEW |