Changeset 126202 in webkit
- Timestamp:
- Aug 21, 2012 4:00:12 PM (12 years ago)
- Location:
- trunk/Source
- Files:
-
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r126201 r126202 1 2012-08-21 Alexandre Elias <aelias@google.com> 2 3 [chromium] Add software bitmap resources to CCResourceProvider 4 https://bugs.webkit.org/show_bug.cgi?id=93677 5 6 Reviewed by Adrienne Walker. 7 8 This adds the ability to CCResourceProvider to use software bitmaps. 9 They are allocated as plain-old-memory, and exposed as Skia objects. 10 11 We want the ResourceProvider to be able to handle different resource 12 types at the same time. In practice, a default resource type is 13 desired for most uses within a single compositor instance, which is 14 specified by the default resource type. Default resource types are 15 expected to be mostly 1-to-1 with CCRenderer types. 16 17 New tests added by parametrizing existing CCResourceProvider tests. 18 19 * platform/graphics/chromium/FrameBufferSkPictureCanvasLayerTextureUpdater.cpp: 20 (WebCore::FrameBufferSkPictureCanvasLayerTextureUpdater::updateTextureRect): 21 * platform/graphics/chromium/LayerRendererChromium.cpp: 22 (WebCore::applyFilters): 23 (WebCore::LayerRendererChromium::drawRenderPassQuad): 24 (WebCore::LayerRendererChromium::drawTileQuad): 25 (WebCore::LayerRendererChromium::drawYUVVideoQuad): 26 (WebCore::LayerRendererChromium::drawTextureQuad): 27 (WebCore::LayerRendererChromium::getFramebufferTexture): 28 (WebCore::LayerRendererChromium::bindFramebufferToTexture): 29 * platform/graphics/chromium/LayerRendererChromium.h: 30 (DrawingFrame): 31 * platform/graphics/chromium/cc/CCResourceProvider.cpp: 32 (WebCore::CCResourceProvider::createResource): 33 (WebCore): 34 (WebCore::CCResourceProvider::createGLTexture): 35 (WebCore::CCResourceProvider::createBitmap): 36 (WebCore::CCResourceProvider::createResourceFromExternalTexture): 37 (WebCore::CCResourceProvider::deleteResource): 38 (WebCore::CCResourceProvider::upload): 39 (WebCore::CCResourceProvider::flush): 40 (WebCore::CCResourceProvider::shallowFlushIfSupported): 41 (WebCore::CCResourceProvider::lockForRead): 42 (WebCore::CCResourceProvider::unlockForRead): 43 (WebCore::CCResourceProvider::lockForWrite): 44 (WebCore::CCResourceProvider::unlockForWrite): 45 (WebCore::CCResourceProvider::ScopedReadLockGL::ScopedReadLockGL): 46 (WebCore::CCResourceProvider::ScopedReadLockGL::~ScopedReadLockGL): 47 (WebCore::CCResourceProvider::ScopedWriteLockGL::ScopedWriteLockGL): 48 (WebCore::CCResourceProvider::ScopedWriteLockGL::~ScopedWriteLockGL): 49 (WebCore::CCResourceProvider::populateSkBitmapWithResource): 50 (WebCore::CCResourceProvider::ScopedReadLockSoftware::ScopedReadLockSoftware): 51 (WebCore::CCResourceProvider::ScopedReadLockSoftware::~ScopedReadLockSoftware): 52 (WebCore::CCResourceProvider::ScopedWriteLockSoftware::ScopedWriteLockSoftware): 53 (WebCore::CCResourceProvider::ScopedWriteLockSoftware::~ScopedWriteLockSoftware): 54 (WebCore::CCResourceProvider::CCResourceProvider): 55 * platform/graphics/chromium/cc/CCResourceProvider.h: 56 (WebCore): 57 (WebCore::CCResourceProvider::setCreationPolicy): 58 (WebCore::CCResourceProvider::creationPolicy): 59 (CCResourceProvider): 60 (ScopedReadLockGL): 61 (WebCore::CCResourceProvider::ScopedReadLockGL::textureId): 62 (ScopedWriteLockGL): 63 (WebCore::CCResourceProvider::ScopedWriteLockGL::textureId): 64 (ScopedReadLockSoftware): 65 (WebCore::CCResourceProvider::ScopedReadLockSoftware::skBitmap): 66 (ScopedWriteLockSoftware): 67 (WebCore::CCResourceProvider::ScopedWriteLockSoftware::skCanvas): 68 (Resource): 69 1 70 2012-08-21 Tab Atkins <tabatkins@google.com> 2 71 -
trunk/Source/WebCore/platform/graphics/chromium/FrameBufferSkPictureCanvasLayerTextureUpdater.cpp
r125932 r126202 108 108 109 109 texture->acquireBackingTexture(resourceProvider); 110 CC ScopedLockResourceForWritelock(resourceProvider, texture->resourceId());110 CCResourceProvider::ScopedWriteLockGL lock(resourceProvider, texture->resourceId()); 111 111 // Create an accelerated canvas to draw on. 112 112 OwnPtr<SkCanvas> canvas = createAcceleratedCanvas(grContext, texture->size(), lock.textureId()); -
trunk/Source/WebCore/platform/graphics/chromium/LayerRendererChromium.cpp
r126052 r126202 364 364 layerRenderer->context()->flush(); 365 365 366 CC ScopedLockResourceForWritelock(layerRenderer->resourceProvider(), sourceTexture->id());366 CCResourceProvider::ScopedWriteLockGL lock(layerRenderer->resourceProvider(), sourceTexture->id()); 367 367 SkBitmap source = CCRenderSurfaceFilters::apply(filters, lock.textureId(), sourceTexture->size(), filterContext, filterGrContext); 368 368 return source; … … 466 466 // Apply filters to the contents texture. 467 467 SkBitmap filterBitmap = applyFilters(this, renderPass->filters(), contentsTexture); 468 OwnPtr<CC ScopedLockResourceForRead> contentsResourceLock;468 OwnPtr<CCResourceProvider::ScopedReadLockGL> contentsResourceLock; 469 469 unsigned contentsTextureId = 0; 470 470 if (filterBitmap.getTexture()) { … … 472 472 contentsTextureId = texture->getTextureHandle(); 473 473 } else { 474 contentsResourceLock = adoptPtr(new CC ScopedLockResourceForRead(m_resourceProvider, contentsTexture->id()));474 contentsResourceLock = adoptPtr(new CCResourceProvider::ScopedReadLockGL(m_resourceProvider, contentsTexture->id())); 475 475 contentsTextureId = contentsResourceLock->textureId(); 476 476 } … … 479 479 if (backgroundTexture) { 480 480 ASSERT(backgroundTexture->size() == quad->quadRect().size()); 481 CC ScopedLockResourceForReadlock(m_resourceProvider, backgroundTexture->id());481 CCResourceProvider::ScopedReadLockGL lock(m_resourceProvider, backgroundTexture->id()); 482 482 copyTextureToFramebuffer(frame, lock.textureId(), quad->quadRect(), quad->quadTransform()); 483 483 } … … 496 496 } 497 497 498 OwnPtr<CC ScopedLockResourceForRead> maskResourceLock;498 OwnPtr<CCResourceProvider::ScopedReadLockGL> maskResourceLock; 499 499 unsigned maskTextureId = 0; 500 500 if (quad->maskResourceId()) { 501 maskResourceLock = adoptPtr(new CC ScopedLockResourceForRead(m_resourceProvider, quad->maskResourceId()));501 maskResourceLock = adoptPtr(new CCResourceProvider::ScopedReadLockGL(m_resourceProvider, quad->maskResourceId())); 502 502 maskTextureId = maskResourceLock->textureId(); 503 503 } … … 690 690 GLC(context(), context()->uniform1i(uniforms.samplerLocation, 0)); 691 691 GLC(context(), context()->activeTexture(GraphicsContext3D::TEXTURE0)); 692 CC ScopedLockResourceForReadquadResourceLock(m_resourceProvider, quad->resourceId());692 CCResourceProvider::ScopedReadLockGL quadResourceLock(m_resourceProvider, quad->resourceId()); 693 693 GLC(context(), context()->bindTexture(GraphicsContext3D::TEXTURE_2D, quadResourceLock.textureId())); 694 694 GLC(context(), context()->texParameteri(GraphicsContext3D::TEXTURE_2D, GraphicsContext3D::TEXTURE_MIN_FILTER, quad->textureFilter())); … … 797 797 const CCVideoLayerImpl::FramePlane& vPlane = quad->vPlane(); 798 798 799 CC ScopedLockResourceForReadyPlaneLock(m_resourceProvider, yPlane.resourceId);800 CC ScopedLockResourceForReaduPlaneLock(m_resourceProvider, uPlane.resourceId);801 CC ScopedLockResourceForReadvPlaneLock(m_resourceProvider, vPlane.resourceId);799 CCResourceProvider::ScopedReadLockGL yPlaneLock(m_resourceProvider, yPlane.resourceId); 800 CCResourceProvider::ScopedReadLockGL uPlaneLock(m_resourceProvider, uPlane.resourceId); 801 CCResourceProvider::ScopedReadLockGL vPlaneLock(m_resourceProvider, vPlane.resourceId); 802 802 GLC(context(), context()->activeTexture(GraphicsContext3D::TEXTURE1)); 803 803 GLC(context(), context()->bindTexture(GraphicsContext3D::TEXTURE_2D, yPlaneLock.textureId())); … … 908 908 909 909 GLC(context(), context()->activeTexture(GraphicsContext3D::TEXTURE0)); 910 CC ScopedLockResourceForReadquadResourceLock(m_resourceProvider, quad->resourceId());910 CCResourceProvider::ScopedReadLockGL quadResourceLock(m_resourceProvider, quad->resourceId()); 911 911 GLC(context(), context()->bindTexture(GraphicsContext3D::TEXTURE_2D, quadResourceLock.textureId())); 912 912 … … 1200 1200 return false; 1201 1201 1202 CC ScopedLockResourceForWritelock(m_resourceProvider, texture->id());1202 CCResourceProvider::ScopedWriteLockGL lock(m_resourceProvider, texture->id()); 1203 1203 GLC(m_context, m_context->bindTexture(GraphicsContext3D::TEXTURE_2D, lock.textureId())); 1204 1204 GLC(m_context, m_context->copyTexImage2D(GraphicsContext3D::TEXTURE_2D, 0, texture->format(), … … 1227 1227 1228 1228 GLC(m_context, m_context->bindFramebuffer(GraphicsContext3D::FRAMEBUFFER, m_offscreenFramebufferId)); 1229 m_currentFramebufferLock = adoptPtr(new CC ScopedLockResourceForWrite(m_resourceProvider, texture->id()));1229 m_currentFramebufferLock = adoptPtr(new CCResourceProvider::ScopedWriteLockGL(m_resourceProvider, texture->id())); 1230 1230 unsigned textureId = m_currentFramebufferLock->textureId(); 1231 1231 GLC(m_context, m_context->framebufferTexture2D(GraphicsContext3D::FRAMEBUFFER, GraphicsContext3D::COLOR_ATTACHMENT0, GraphicsContext3D::TEXTURE_2D, textureId, 0)); -
trunk/Source/WebCore/platform/graphics/chromium/LayerRendererChromium.h
r126052 r126202 249 249 TextureUploaderOption m_textureUploaderSetting; 250 250 251 OwnPtr<CC ScopedLockResourceForWrite> m_currentFramebufferLock;251 OwnPtr<CCResourceProvider::ScopedWriteLockGL> m_currentFramebufferLock; 252 252 }; 253 253 -
trunk/Source/WebCore/platform/graphics/chromium/cc/CCResourceProvider.cpp
r125932 r126202 32 32 #include "LayerRendererChromium.h" // For the GLC() macro 33 33 #include "LayerTextureSubImage.h" 34 #include <limits.h> 34 35 #include <public/WebGraphicsContext3D.h> 35 36 #include <wtf/HashSet.h> … … 89 90 CCResourceProvider::ResourceId CCResourceProvider::createResource(int pool, const IntSize& size, GC3Denum format, TextureUsageHint hint) 90 91 { 92 switch (m_defaultResourceType) { 93 case GLTexture: 94 return createGLTexture(pool, size, format, hint); 95 case Bitmap: 96 ASSERT(format == GraphicsContext3D::RGBA); 97 return createBitmap(pool, size); 98 } 99 100 CRASH(); 101 return 0; 102 } 103 104 CCResourceProvider::ResourceId CCResourceProvider::createGLTexture(int pool, const IntSize& size, GC3Denum format, TextureUsageHint hint) 105 { 91 106 ASSERT(CCProxy::isImplThread()); 92 107 unsigned textureId = 0; 93 108 WebGraphicsContext3D* context3d = m_context->context3D(); 94 if (!context3d) { 95 // FIXME: Implement this path for software compositing. 96 return 0; 97 } 109 ASSERT(context3d); 98 110 GLC(context3d, textureId = context3d->createTexture()); 99 111 GLC(context3d, context3d->bindTexture(GraphicsContext3D::TEXTURE_2D, textureId)); … … 116 128 } 117 129 130 CCResourceProvider::ResourceId CCResourceProvider::createBitmap(int pool, const IntSize& size) 131 { 132 ASSERT(CCProxy::isImplThread()); 133 134 uint8_t* pixels = new uint8_t[size.width() * size.height() * 4]; 135 136 ResourceId id = m_nextId++; 137 Resource resource(pixels, pool, size, GraphicsContext3D::RGBA); 138 m_resources.add(id, resource); 139 return id; 140 } 141 118 142 CCResourceProvider::ResourceId CCResourceProvider::createResourceFromExternalTexture(unsigned textureId) 119 143 { 120 144 ASSERT(CCProxy::isImplThread()); 121 145 ResourceId id = m_nextId++; 122 Resource resource; 123 resource.glId = textureId; 146 Resource resource(textureId, 0, IntSize(), 0); 124 147 resource.external = true; 125 148 m_resources.add(id, resource); … … 130 153 { 131 154 ASSERT(CCProxy::isImplThread()); 132 WebGraphicsContext3D* context3d = m_context->context3D();133 if (!context3d) {134 // FIXME: Implement this path for software compositing.135 return;136 }137 155 ResourceMap::iterator it = m_resources.find(id); 138 156 ASSERT(it != m_resources.end() && !it->second.lockedForWrite && !it->second.lockForReadCount); 139 if (!it->second.external) 157 158 if (it->second.glId && !it->second.external) { 159 WebGraphicsContext3D* context3d = m_context->context3D(); 160 ASSERT(context3d); 140 161 GLC(context3d, context3d->deleteTexture(it->second.glId)); 162 } 163 if (it->second.pixels) 164 delete it->second.pixels; 165 141 166 m_resources.remove(it); 142 167 } … … 154 179 } 155 180 181 CCResourceProvider::ResourceType CCResourceProvider::resourceType(ResourceId id) 182 { 183 ResourceMap::iterator it = m_resources.find(id); 184 ASSERT(it != m_resources.end()); 185 return it->second.type; 186 } 187 156 188 void CCResourceProvider::upload(ResourceId id, const uint8_t* image, const IntRect& imageRect, const IntRect& sourceRect, const IntSize& destOffset) 157 189 { 158 190 ASSERT(CCProxy::isImplThread()); 159 ASSERT(m_texSubImage.get());160 WebGraphicsContext3D* context3d = m_context->context3D();161 if (!context3d) {162 // FIXME: Implement this path for software compositing.163 return;164 }165 191 ResourceMap::iterator it = m_resources.find(id); 166 192 ASSERT(it != m_resources.end() && !it->second.lockedForWrite && !it->second.lockForReadCount && !it->second.external); 167 193 168 context3d->bindTexture(GraphicsContext3D::TEXTURE_2D, it->second.glId); 169 m_texSubImage->upload(image, imageRect, sourceRect, destOffset, it->second.format, context3d); 170 } 171 172 unsigned CCResourceProvider::lockForWrite(ResourceId id) 194 if (it->second.glId) { 195 WebGraphicsContext3D* context3d = m_context->context3D(); 196 ASSERT(context3d); 197 ASSERT(m_texSubImage.get()); 198 context3d->bindTexture(GraphicsContext3D::TEXTURE_2D, it->second.glId); 199 m_texSubImage->upload(image, imageRect, sourceRect, destOffset, it->second.format, context3d); 200 } 201 202 if (it->second.pixels) { 203 SkBitmap srcFull; 204 srcFull.setConfig(SkBitmap::kARGB_8888_Config, imageRect.width(), imageRect.height()); 205 srcFull.setPixels(const_cast<uint8_t*>(image)); 206 SkBitmap srcSubset; 207 SkIRect skSourceRect = SkIRect::MakeXYWH(sourceRect.x(), sourceRect.y(), sourceRect.width(), sourceRect.height()); 208 skSourceRect.offset(-imageRect.x(), -imageRect.y()); 209 srcFull.extractSubset(&srcSubset, skSourceRect); 210 211 ScopedWriteLockSoftware lock(this, id); 212 SkCanvas* dest = lock.skCanvas(); 213 dest->writePixels(srcSubset, destOffset.width(), destOffset.height()); 214 } 215 } 216 217 void CCResourceProvider::flush() 218 { 219 ASSERT(CCProxy::isImplThread()); 220 WebGraphicsContext3D* context3d = m_context->context3D(); 221 if (context3d) 222 context3d->flush(); 223 } 224 225 bool CCResourceProvider::shallowFlushIfSupported() 226 { 227 ASSERT(CCProxy::isImplThread()); 228 WebGraphicsContext3D* context3d = m_context->context3D(); 229 if (!context3d || !m_useShallowFlush) 230 return false; 231 232 context3d->shallowFlushCHROMIUM(); 233 return true; 234 } 235 236 const CCResourceProvider::Resource* CCResourceProvider::lockForRead(ResourceId id) 237 { 238 ASSERT(CCProxy::isImplThread()); 239 ResourceMap::iterator it = m_resources.find(id); 240 ASSERT(it != m_resources.end() && !it->second.lockedForWrite); 241 it->second.lockForReadCount++; 242 return &it->second; 243 } 244 245 void CCResourceProvider::unlockForRead(ResourceId id) 246 { 247 ASSERT(CCProxy::isImplThread()); 248 ResourceMap::iterator it = m_resources.find(id); 249 ASSERT(it != m_resources.end() && it->second.lockForReadCount > 0); 250 it->second.lockForReadCount--; 251 } 252 253 const CCResourceProvider::Resource* CCResourceProvider::lockForWrite(ResourceId id) 173 254 { 174 255 ASSERT(CCProxy::isImplThread()); … … 176 257 ASSERT(it != m_resources.end() && !it->second.lockedForWrite && !it->second.lockForReadCount && !it->second.external); 177 258 it->second.lockedForWrite = true; 178 return it->second.glId;259 return &it->second; 179 260 } 180 261 … … 187 268 } 188 269 189 void CCResourceProvider::flush() 190 { 191 ASSERT(CCProxy::isImplThread()); 192 WebGraphicsContext3D* context3d = m_context->context3D(); 193 if (!context3d) { 194 // FIXME: Implement this path for software compositing. 195 return; 196 } 197 context3d->flush(); 198 } 199 200 bool CCResourceProvider::shallowFlushIfSupported() 201 { 202 ASSERT(CCProxy::isImplThread()); 203 WebGraphicsContext3D* context3d = m_context->context3D(); 204 if (!context3d) { 205 // FIXME: Implement this path for software compositing. 206 return false; 207 } 208 209 if (m_useShallowFlush) 210 context3d->shallowFlushCHROMIUM(); 211 return m_useShallowFlush; 212 } 213 214 unsigned CCResourceProvider::lockForRead(ResourceId id) 215 { 216 ASSERT(CCProxy::isImplThread()); 217 ResourceMap::iterator it = m_resources.find(id); 218 ASSERT(it != m_resources.end() && !it->second.lockedForWrite); 219 ++(it->second.lockForReadCount); 220 return it->second.glId; 221 } 222 223 void CCResourceProvider::unlockForRead(ResourceId id) 224 { 225 ASSERT(CCProxy::isImplThread()); 226 ResourceMap::iterator it = m_resources.find(id); 227 ASSERT(it != m_resources.end() && it->second.lockForReadCount > 0); 228 --(it->second.lockForReadCount); 270 CCResourceProvider::ScopedReadLockGL::ScopedReadLockGL(CCResourceProvider* resourceProvider, CCResourceProvider::ResourceId resourceId) 271 : m_resourceProvider(resourceProvider) 272 , m_resourceId(resourceId) 273 , m_textureId(resourceProvider->lockForRead(resourceId)->glId) 274 { 275 ASSERT(m_textureId); 276 } 277 278 CCResourceProvider::ScopedReadLockGL::~ScopedReadLockGL() 279 { 280 m_resourceProvider->unlockForRead(m_resourceId); 281 } 282 283 CCResourceProvider::ScopedWriteLockGL::ScopedWriteLockGL(CCResourceProvider* resourceProvider, CCResourceProvider::ResourceId resourceId) 284 : m_resourceProvider(resourceProvider) 285 , m_resourceId(resourceId) 286 , m_textureId(resourceProvider->lockForWrite(resourceId)->glId) 287 { 288 ASSERT(m_textureId); 289 } 290 291 CCResourceProvider::ScopedWriteLockGL::~ScopedWriteLockGL() 292 { 293 m_resourceProvider->unlockForWrite(m_resourceId); 294 } 295 296 void CCResourceProvider::populateSkBitmapWithResource(SkBitmap* skBitmap, const Resource* resource) 297 { 298 ASSERT(resource->pixels); 299 ASSERT(resource->format == GraphicsContext3D::RGBA); 300 skBitmap->setConfig(SkBitmap::kARGB_8888_Config, resource->size.width(), resource->size.height()); 301 skBitmap->setPixels(resource->pixels); 302 } 303 304 CCResourceProvider::ScopedReadLockSoftware::ScopedReadLockSoftware(CCResourceProvider* resourceProvider, CCResourceProvider::ResourceId resourceId) 305 : m_resourceProvider(resourceProvider) 306 , m_resourceId(resourceId) 307 { 308 CCResourceProvider::populateSkBitmapWithResource(&m_skBitmap, resourceProvider->lockForRead(resourceId)); 309 } 310 311 CCResourceProvider::ScopedReadLockSoftware::~ScopedReadLockSoftware() 312 { 313 m_resourceProvider->unlockForRead(m_resourceId); 314 } 315 316 CCResourceProvider::ScopedWriteLockSoftware::ScopedWriteLockSoftware(CCResourceProvider* resourceProvider, CCResourceProvider::ResourceId resourceId) 317 : m_resourceProvider(resourceProvider) 318 , m_resourceId(resourceId) 319 { 320 CCResourceProvider::populateSkBitmapWithResource(&m_skBitmap, resourceProvider->lockForWrite(resourceId)); 321 m_skCanvas.setBitmapDevice(m_skBitmap); 322 } 323 324 CCResourceProvider::ScopedWriteLockSoftware::~ScopedWriteLockSoftware() 325 { 326 m_resourceProvider->unlockForWrite(m_resourceId); 229 327 } 230 328 … … 233 331 , m_nextId(1) 234 332 , m_nextChild(1) 333 , m_defaultResourceType(GLTexture) 235 334 , m_useTextureStorageExt(false) 236 335 , m_useTextureUsageHint(false) 237 336 , m_useShallowFlush(false) 238 , m_maxTextureSize( 0)337 , m_maxTextureSize(INT_MAX) 239 338 { 240 339 } -
trunk/Source/WebCore/platform/graphics/chromium/cc/CCResourceProvider.h
r126122 r126202 31 31 #include "GraphicsContext3D.h" 32 32 #include "IntSize.h" 33 #include "SkBitmap.h" 34 #include "SkCanvas.h" 33 35 #include <wtf/Deque.h> 34 36 #include <wtf/HashMap.h> … … 45 47 namespace WebCore { 46 48 47 class CCScopedLockResourceForRead;48 class CCScopedLockResourceForWrite;49 49 class IntRect; 50 50 class LayerTextureSubImage; … … 59 59 typedef HashMap<ResourceId, ResourceId> ResourceIdMap; 60 60 enum TextureUsageHint { TextureUsageAny, TextureUsageFramebuffer }; 61 enum ResourceType { 62 GLTexture = 1, 63 Bitmap, 64 }; 61 65 struct Mailbox { 62 66 GC3Dbyte name[64]; … … 88 92 // Producer interface. 89 93 90 // Creates a resource of the given size/format, into the given pool. 94 void setDefaultResourceType(ResourceType type) { m_defaultResourceType = type; } 95 ResourceType defaultResourceType() const { return m_defaultResourceType; } 96 ResourceType resourceType(ResourceId); 97 98 // Creates a resource of the default resource type. 91 99 ResourceId createResource(int pool, const IntSize&, GC3Denum format, TextureUsageHint); 92 100 93 // Wraps an external texture into a resource. 101 // You can also explicitly create a specific resource type. 102 ResourceId createGLTexture(int pool, const IntSize&, GC3Denum format, TextureUsageHint); 103 ResourceId createBitmap(int pool, const IntSize&); 104 // Wraps an external texture into a GL resource. 94 105 ResourceId createResourceFromExternalTexture(unsigned textureId); 106 95 107 void deleteResource(ResourceId); 96 108 … … 148 160 size_t mailboxCount() const { return m_mailboxes.size(); } 149 161 162 // The following lock classes are part of the CCResourceProvider API and are 163 // needed to read and write the resource contents. The user must ensure 164 // that they only use GL locks on GL resources, etc, and this is enforced 165 // by assertions. 166 class ScopedReadLockGL { 167 WTF_MAKE_NONCOPYABLE(ScopedReadLockGL); 168 public: 169 ScopedReadLockGL(CCResourceProvider*, CCResourceProvider::ResourceId); 170 ~ScopedReadLockGL(); 171 172 unsigned textureId() const { return m_textureId; } 173 174 private: 175 CCResourceProvider* m_resourceProvider; 176 CCResourceProvider::ResourceId m_resourceId; 177 unsigned m_textureId; 178 }; 179 180 class ScopedWriteLockGL { 181 WTF_MAKE_NONCOPYABLE(ScopedWriteLockGL); 182 public: 183 ScopedWriteLockGL(CCResourceProvider*, CCResourceProvider::ResourceId); 184 ~ScopedWriteLockGL(); 185 186 unsigned textureId() const { return m_textureId; } 187 188 private: 189 CCResourceProvider* m_resourceProvider; 190 CCResourceProvider::ResourceId m_resourceId; 191 unsigned m_textureId; 192 }; 193 194 class ScopedReadLockSoftware { 195 WTF_MAKE_NONCOPYABLE(ScopedReadLockSoftware); 196 public: 197 ScopedReadLockSoftware(CCResourceProvider*, CCResourceProvider::ResourceId); 198 ~ScopedReadLockSoftware(); 199 200 const SkBitmap* skBitmap() const { return &m_skBitmap; } 201 202 private: 203 CCResourceProvider* m_resourceProvider; 204 CCResourceProvider::ResourceId m_resourceId; 205 SkBitmap m_skBitmap; 206 }; 207 208 class ScopedWriteLockSoftware { 209 WTF_MAKE_NONCOPYABLE(ScopedWriteLockSoftware); 210 public: 211 ScopedWriteLockSoftware(CCResourceProvider*, CCResourceProvider::ResourceId); 212 ~ScopedWriteLockSoftware(); 213 214 SkCanvas* skCanvas() { return &m_skCanvas; } 215 216 private: 217 CCResourceProvider* m_resourceProvider; 218 CCResourceProvider::ResourceId m_resourceId; 219 SkBitmap m_skBitmap; 220 SkCanvas m_skCanvas; 221 }; 222 150 223 private: 151 friend class CCScopedLockResourceForRead;152 friend class CCScopedLockResourceForWrite;153 154 224 struct Resource { 155 225 Resource() 156 226 : glId(0) 227 , pixels(0) 157 228 , pool(0) 158 229 , lockForReadCount(0) … … 162 233 , size() 163 234 , format(0) 235 , type(static_cast<ResourceType>(0)) 164 236 { } 165 237 Resource(unsigned textureId, int pool, const IntSize& size, GC3Denum format) 166 238 : glId(textureId) 239 , pixels(0) 167 240 , pool(pool) 168 241 , lockForReadCount(0) … … 172 245 , size(size) 173 246 , format(format) 247 , type(GLTexture) 248 { } 249 Resource(uint8_t* pixels, int pool, const IntSize& size, GC3Denum format) 250 : glId(0) 251 , pixels(pixels) 252 , pool(pool) 253 , lockForReadCount(0) 254 , lockedForWrite(false) 255 , external(false) 256 , exported(false) 257 , size(size) 258 , format(format) 259 , type(Bitmap) 174 260 { } 175 261 unsigned glId; 262 uint8_t* pixels; 176 263 int pool; 177 264 int lockForReadCount; … … 181 268 IntSize size; 182 269 GC3Denum format; 270 ResourceType type; 183 271 }; 184 272 typedef HashMap<ResourceId, Resource> ResourceMap; … … 193 281 bool initialize(); 194 282 195 // Gets a GL texture id representing the resource, that can be rendered into. 196 unsigned lockForWrite(ResourceId); 283 const Resource* lockForRead(ResourceId); 284 void unlockForRead(ResourceId); 285 const Resource* lockForWrite(ResourceId); 197 286 void unlockForWrite(ResourceId); 198 199 // Gets a GL texture id representing the resource, that can be rendered with. 200 unsigned lockForRead(ResourceId); 201 void unlockForRead(ResourceId); 287 static void populateSkBitmapWithResource(SkBitmap*, const Resource*); 202 288 203 289 bool transferResource(WebKit::WebGraphicsContext3D*, ResourceId, TransferableResource*); … … 212 298 Deque<Mailbox> m_mailboxes; 213 299 300 ResourceType m_defaultResourceType; 214 301 bool m_useTextureStorageExt; 215 302 bool m_useTextureUsageHint; … … 219 306 }; 220 307 221 class CCScopedLockResourceForRead {222 WTF_MAKE_NONCOPYABLE(CCScopedLockResourceForRead);223 public:224 CCScopedLockResourceForRead(CCResourceProvider* resourceProvider, CCResourceProvider::ResourceId resourceId)225 : m_resourceProvider(resourceProvider)226 , m_resourceId(resourceId)227 , m_textureId(resourceProvider->lockForRead(resourceId))228 {229 ASSERT(m_textureId);230 }231 232 ~CCScopedLockResourceForRead()233 {234 m_resourceProvider->unlockForRead(m_resourceId);235 }236 237 unsigned textureId() const { return m_textureId; }238 239 private:240 CCResourceProvider* m_resourceProvider;241 CCResourceProvider::ResourceId m_resourceId;242 unsigned m_textureId;243 };244 245 class CCScopedLockResourceForWrite {246 WTF_MAKE_NONCOPYABLE(CCScopedLockResourceForWrite);247 public:248 CCScopedLockResourceForWrite(CCResourceProvider* resourceProvider, CCResourceProvider::ResourceId resourceId)249 : m_resourceProvider(resourceProvider)250 , m_resourceId(resourceId)251 , m_textureId(resourceProvider->lockForWrite(resourceId)) { }252 253 ~CCScopedLockResourceForWrite()254 {255 m_resourceProvider->unlockForWrite(m_resourceId);256 }257 258 unsigned textureId() const { return m_textureId; }259 260 private:261 CCResourceProvider* m_resourceProvider;262 CCResourceProvider::ResourceId m_resourceId;263 unsigned m_textureId;264 };265 266 308 } 267 309 -
trunk/Source/WebKit/chromium/ChangeLog
r126200 r126202 1 2012-08-21 Alexandre Elias <aelias@google.com> 2 3 [chromium] Add software bitmap resources to CCResourceProvider 4 https://bugs.webkit.org/show_bug.cgi?id=93677 5 6 Reviewed by Adrienne Walker. 7 8 This adds the ability to CCResourceProvider to use software bitmaps. 9 They are allocated as plain-old-memory, and exposed as Skia objects. 10 11 We want the ResourceProvider to be able to handle different resource 12 types at the same time. In practice, a default resource type is 13 desired for most uses within a single compositor instance, which is 14 specified by the default resource type. Default resource types are 15 expected to be mostly 1-to-1 with CCRenderer types. 16 17 New tests added by parametrizing existing CCResourceProvider tests. 18 19 * tests/CCResourceProviderTest.cpp: 20 (WebKit::CCResourceProviderTest::getResourcePixels): 21 1 22 2012-08-21 Oli Lan <olilan@chromium.org> 2 23 -
trunk/Source/WebKit/chromium/tests/CCResourceProviderTest.cpp
r125932 r126202 288 288 }; 289 289 290 class CCResourceProviderTest : public testing::Test {290 class CCResourceProviderTest : public testing::TestWithParam<CCResourceProvider::ResourceType> { 291 291 public: 292 292 CCResourceProviderTest() … … 295 295 , m_resourceProvider(CCResourceProvider::create(m_context.get())) 296 296 { 297 m_resourceProvider->setDefaultResourceType(GetParam()); 297 298 } 298 299 … … 301 302 void getResourcePixels(CCResourceProvider::ResourceId id, const IntSize& size, WGC3Denum format, uint8_t* pixels) 302 303 { 303 CCScopedLockResourceForRead lock(m_resourceProvider.get(), id); 304 ASSERT_NE(0U, lock.textureId()); 305 context()->bindTexture(GraphicsContext3D::TEXTURE_2D, lock.textureId()); 306 context()->getPixels(size, format, pixels); 304 if (GetParam() == CCResourceProvider::GLTexture) { 305 CCResourceProvider::ScopedReadLockGL lockGL(m_resourceProvider.get(), id); 306 ASSERT_NE(0U, lockGL.textureId()); 307 context()->bindTexture(GraphicsContext3D::TEXTURE_2D, lockGL.textureId()); 308 context()->getPixels(size, format, pixels); 309 } else if (GetParam() == CCResourceProvider::Bitmap) { 310 CCResourceProvider::ScopedReadLockSoftware lockSoftware(m_resourceProvider.get(), id); 311 memcpy(pixels, lockSoftware.skBitmap()->getPixels(), lockSoftware.skBitmap()->getSize()); 312 } 313 } 314 315 void expectNumResources(int count) 316 { 317 EXPECT_EQ(count, static_cast<int>(m_resourceProvider->numResources())); 318 if (GetParam() == CCResourceProvider::GLTexture) 319 EXPECT_EQ(count, context()->textureCount()); 307 320 } 308 321 … … 314 327 }; 315 328 316 TEST_ F(CCResourceProviderTest, Basic)329 TEST_P(CCResourceProviderTest, Basic) 317 330 { 318 331 IntSize size(1, 1); … … 323 336 324 337 CCResourceProvider::ResourceId id = m_resourceProvider->createResource(pool, size, format, CCResourceProvider::TextureUsageAny); 325 EXPECT_EQ(1, context()->textureCount());338 expectNumResources(1); 326 339 327 340 uint8_t data[4] = {1, 2, 3, 4}; … … 334 347 335 348 m_resourceProvider->deleteResource(id); 336 EXPECT_EQ(0, context()->textureCount());349 expectNumResources(0); 337 350 } 338 351 339 TEST_ F(CCResourceProviderTest, DeleteOwnedResources)352 TEST_P(CCResourceProviderTest, DeleteOwnedResources) 340 353 { 341 354 IntSize size(1, 1); … … 346 359 for (int i = 0; i < count; ++i) 347 360 m_resourceProvider->createResource(pool, size, format, CCResourceProvider::TextureUsageAny); 348 EXPECT_EQ(3, context()->textureCount());361 expectNumResources(3); 349 362 350 363 m_resourceProvider->deleteOwnedResources(pool+1); 351 EXPECT_EQ(3, context()->textureCount());364 expectNumResources(3); 352 365 353 366 m_resourceProvider->deleteOwnedResources(pool); 354 EXPECT_EQ(0, context()->textureCount());367 expectNumResources(0); 355 368 } 356 369 357 TEST_ F(CCResourceProviderTest, Upload)370 TEST_P(CCResourceProviderTest, Upload) 358 371 { 359 372 IntSize size(2, 2); … … 403 416 EXPECT_EQ(0, memcmp(expected, result, pixelSize)); 404 417 } 418 { 419 IntRect offsetImageRect(IntPoint(100, 100), size); 420 IntRect sourceRect(100, 100, 1, 1); 421 IntSize destOffset(1, 0); 422 m_resourceProvider->upload(id, image, offsetImageRect, sourceRect, destOffset); 423 424 uint8_t expected[16] = {0, 1, 2, 3, 0, 1, 2, 3, 425 4, 5, 6, 7, 0, 1, 2, 3}; 426 getResourcePixels(id, size, format, result); 427 EXPECT_EQ(0, memcmp(expected, result, pixelSize)); 428 } 429 405 430 406 431 m_resourceProvider->deleteResource(id); 407 432 } 408 433 409 TEST_ F(CCResourceProviderTest, TransferResources)434 TEST_P(CCResourceProviderTest, TransferResources) 410 435 { 436 // Resource transfer is only supported with GL textures for now. 437 if (GetParam() != CCResourceProvider::GLTexture) 438 return; 439 411 440 OwnPtr<CCGraphicsContext> childContext(FakeWebCompositorOutputSurface::create(ResourceProviderContext::create(m_sharedData.get()))); 412 441 OwnPtr<CCResourceProvider> childResourceProvider(CCResourceProvider::create(childContext.get())); … … 487 516 ResourceProviderContext* childContext3D = static_cast<ResourceProviderContext*>(childContext->context3D()); 488 517 { 489 CC ScopedLockResourceForReadlock(childResourceProvider.get(), id1);518 CCResourceProvider::ScopedReadLockGL lock(childResourceProvider.get(), id1); 490 519 ASSERT_NE(0U, lock.textureId()); 491 520 childContext3D->bindTexture(GraphicsContext3D::TEXTURE_2D, lock.textureId()); … … 494 523 } 495 524 { 496 CC ScopedLockResourceForReadlock(childResourceProvider.get(), id2);525 CCResourceProvider::ScopedReadLockGL lock(childResourceProvider.get(), id2); 497 526 ASSERT_NE(0U, lock.textureId()); 498 527 childContext3D->bindTexture(GraphicsContext3D::TEXTURE_2D, lock.textureId()); … … 520 549 } 521 550 551 INSTANTIATE_TEST_CASE_P(CCResourceProviderTests, 552 CCResourceProviderTest, 553 ::testing::Values(CCResourceProvider::GLTexture, 554 CCResourceProvider::Bitmap)); 555 522 556 } // namespace
Note: See TracChangeset
for help on using the changeset viewer.