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

Side by Side Diff: cc/resource_provider.cc

Issue 11622008: cc: Defer texture allocation (to allow async allocations). (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Address feedback. Add test. Created 8 years 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
1 // Copyright 2012 The Chromium Authors. All rights reserved. 1 // Copyright 2012 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 "cc/resource_provider.h" 5 #include "cc/resource_provider.h"
6 6
7 #include <limits.h> 7 #include <limits.h>
8 8
9 #include "base/debug/alias.h" 9 #include "base/debug/alias.h"
10 #include "base/hash_tables.h" 10 #include "base/hash_tables.h"
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
53 , glPixelBufferId(0) 53 , glPixelBufferId(0)
54 , glUploadQueryId(0) 54 , glUploadQueryId(0)
55 , pixels(0) 55 , pixels(0)
56 , pixelBuffer(0) 56 , pixelBuffer(0)
57 , lockForReadCount(0) 57 , lockForReadCount(0)
58 , lockedForWrite(false) 58 , lockedForWrite(false)
59 , external(false) 59 , external(false)
60 , exported(false) 60 , exported(false)
61 , markedForDeletion(false) 61 , markedForDeletion(false)
62 , pendingSetPixels(false) 62 , pendingSetPixels(false)
63 , allocated(false)
63 , size() 64 , size()
64 , format(0) 65 , format(0)
65 , filter(0) 66 , filter(0)
66 , type(static_cast<ResourceType>(0)) 67 , type(static_cast<ResourceType>(0))
67 { 68 {
68 } 69 }
69 70
70 ResourceProvider::Resource::Resource(unsigned textureId, const gfx::Size& size, GLenum format, GLenum filter) 71 ResourceProvider::Resource::Resource(unsigned textureId, const gfx::Size& size, GLenum format, GLenum filter)
71 : glId(textureId) 72 : glId(textureId)
72 , glPixelBufferId(0) 73 , glPixelBufferId(0)
73 , glUploadQueryId(0) 74 , glUploadQueryId(0)
74 , pixels(0) 75 , pixels(0)
75 , pixelBuffer(0) 76 , pixelBuffer(0)
76 , lockForReadCount(0) 77 , lockForReadCount(0)
77 , lockedForWrite(false) 78 , lockedForWrite(false)
78 , external(false) 79 , external(false)
79 , exported(false) 80 , exported(false)
80 , markedForDeletion(false) 81 , markedForDeletion(false)
81 , pendingSetPixels(false) 82 , pendingSetPixels(false)
83 , allocated(false)
82 , size(size) 84 , size(size)
83 , format(format) 85 , format(format)
84 , filter(filter) 86 , filter(filter)
85 , type(GLTexture) 87 , type(GLTexture)
86 { 88 {
87 } 89 }
88 90
89 ResourceProvider::Resource::Resource(uint8_t* pixels, const gfx::Size& size, GLe num format, GLenum filter) 91 ResourceProvider::Resource::Resource(uint8_t* pixels, const gfx::Size& size, GLe num format, GLenum filter)
90 : glId(0) 92 : glId(0)
91 , glPixelBufferId(0) 93 , glPixelBufferId(0)
92 , glUploadQueryId(0) 94 , glUploadQueryId(0)
93 , pixels(pixels) 95 , pixels(pixels)
94 , pixelBuffer(0) 96 , pixelBuffer(0)
95 , lockForReadCount(0) 97 , lockForReadCount(0)
96 , lockedForWrite(false) 98 , lockedForWrite(false)
97 , external(false) 99 , external(false)
98 , exported(false) 100 , exported(false)
99 , markedForDeletion(false) 101 , markedForDeletion(false)
100 , pendingSetPixels(false) 102 , pendingSetPixels(false)
103 , allocated(false)
101 , size(size) 104 , size(size)
102 , format(format) 105 , format(format)
103 , filter(filter) 106 , filter(filter)
104 , type(Bitmap) 107 , type(Bitmap)
105 { 108 {
106 } 109 }
107 110
108 ResourceProvider::Child::Child() 111 ResourceProvider::Child::Child()
109 { 112 {
110 } 113 }
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
177 { 180 {
178 DCHECK_LE(size.width(), m_maxTextureSize); 181 DCHECK_LE(size.width(), m_maxTextureSize);
179 DCHECK_LE(size.height(), m_maxTextureSize); 182 DCHECK_LE(size.height(), m_maxTextureSize);
180 183
181 DCHECK(m_threadChecker.CalledOnValidThread()); 184 DCHECK(m_threadChecker.CalledOnValidThread());
182 unsigned textureId = 0; 185 unsigned textureId = 0;
183 WebGraphicsContext3D* context3d = m_outputSurface->Context3D(); 186 WebGraphicsContext3D* context3d = m_outputSurface->Context3D();
184 DCHECK(context3d); 187 DCHECK(context3d);
185 GLC(context3d, textureId = context3d->createTexture()); 188 GLC(context3d, textureId = context3d->createTexture());
186 GLC(context3d, context3d->bindTexture(GL_TEXTURE_2D, textureId)); 189 GLC(context3d, context3d->bindTexture(GL_TEXTURE_2D, textureId));
190
191 // Set texture properties. Allocation is delayed until needed.
187 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER , GL_LINEAR)); 192 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER , GL_LINEAR));
188 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER , GL_LINEAR)); 193 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER , GL_LINEAR));
189 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL _CLAMP_TO_EDGE)); 194 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL _CLAMP_TO_EDGE));
190 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL _CLAMP_TO_EDGE)); 195 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL _CLAMP_TO_EDGE));
191 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_POOL_CHROM IUM, texturePool)); 196 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_POOL_CHROM IUM, texturePool));
192
193 if (m_useTextureUsageHint && hint == TextureUsageFramebuffer) 197 if (m_useTextureUsageHint && hint == TextureUsageFramebuffer)
194 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_USAGE_ ANGLE, GL_FRAMEBUFFER_ATTACHMENT_ANGLE)); 198 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_USAGE_ ANGLE, GL_FRAMEBUFFER_ATTACHMENT_ANGLE));
195 if (m_useTextureStorageExt && isTextureFormatSupportedForStorage(format)) {
196 GLenum storageFormat = textureToStorageFormat(format);
197 GLC(context3d, context3d->texStorage2DEXT(GL_TEXTURE_2D, 1, storageForma t, size.width(), size.height()));
198 } else
199 GLC(context3d, context3d->texImage2D(GL_TEXTURE_2D, 0, format, size.widt h(), size.height(), 0, format, GL_UNSIGNED_BYTE, 0));
200 199
201 ResourceId id = m_nextId++; 200 ResourceId id = m_nextId++;
202 Resource resource(textureId, size, format, GL_LINEAR); 201 Resource resource(textureId, size, format, GL_LINEAR);
202 resource.allocated = false;
203 m_resources[id] = resource; 203 m_resources[id] = resource;
204 return id; 204 return id;
205 } 205 }
206 206
207 ResourceProvider::ResourceId ResourceProvider::createBitmap(const gfx::Size& siz e) 207 ResourceProvider::ResourceId ResourceProvider::createBitmap(const gfx::Size& siz e)
208 { 208 {
209 DCHECK(m_threadChecker.CalledOnValidThread()); 209 DCHECK(m_threadChecker.CalledOnValidThread());
210 210
211 uint8_t* pixels = new uint8_t[size.width() * size.height() * 4]; 211 uint8_t* pixels = new uint8_t[size.width() * size.height() * 4];
212 212
213 ResourceId id = m_nextId++; 213 ResourceId id = m_nextId++;
214 Resource resource(pixels, size, GL_RGBA, GL_LINEAR); 214 Resource resource(pixels, size, GL_RGBA, GL_LINEAR);
215 resource.allocated = true;
215 m_resources[id] = resource; 216 m_resources[id] = resource;
216 return id; 217 return id;
217 } 218 }
218 219
219 ResourceProvider::ResourceId ResourceProvider::createResourceFromExternalTexture (unsigned textureId) 220 ResourceProvider::ResourceId ResourceProvider::createResourceFromExternalTexture (unsigned textureId)
220 { 221 {
221 DCHECK(m_threadChecker.CalledOnValidThread()); 222 DCHECK(m_threadChecker.CalledOnValidThread());
222 223
223 WebGraphicsContext3D* context3d = m_outputSurface->Context3D(); 224 WebGraphicsContext3D* context3d = m_outputSurface->Context3D();
224 DCHECK(context3d); 225 DCHECK(context3d);
225 GLC(context3d, context3d->bindTexture(GL_TEXTURE_2D, textureId)); 226 GLC(context3d, context3d->bindTexture(GL_TEXTURE_2D, textureId));
226 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER , GL_LINEAR)); 227 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER , GL_LINEAR));
227 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER , GL_LINEAR)); 228 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER , GL_LINEAR));
228 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL _CLAMP_TO_EDGE)); 229 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL _CLAMP_TO_EDGE));
229 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL _CLAMP_TO_EDGE)); 230 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL _CLAMP_TO_EDGE));
230 231
231 ResourceId id = m_nextId++; 232 ResourceId id = m_nextId++;
232 Resource resource(textureId, gfx::Size(), 0, GL_LINEAR); 233 Resource resource(textureId, gfx::Size(), 0, GL_LINEAR);
233 resource.external = true; 234 resource.external = true;
235 resource.allocated = true;
234 m_resources[id] = resource; 236 m_resources[id] = resource;
235 return id; 237 return id;
236 } 238 }
237 239
238 void ResourceProvider::deleteResource(ResourceId id) 240 void ResourceProvider::deleteResource(ResourceId id)
239 { 241 {
240 DCHECK(m_threadChecker.CalledOnValidThread()); 242 DCHECK(m_threadChecker.CalledOnValidThread());
241 ResourceMap::iterator it = m_resources.find(id); 243 ResourceMap::iterator it = m_resources.find(id);
242 CHECK(it != m_resources.end()); 244 CHECK(it != m_resources.end());
243 Resource* resource = &it->second; 245 Resource* resource = &it->second;
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
291 DCHECK(m_threadChecker.CalledOnValidThread()); 293 DCHECK(m_threadChecker.CalledOnValidThread());
292 ResourceMap::iterator it = m_resources.find(id); 294 ResourceMap::iterator it = m_resources.find(id);
293 CHECK(it != m_resources.end()); 295 CHECK(it != m_resources.end());
294 Resource* resource = &it->second; 296 Resource* resource = &it->second;
295 DCHECK(!resource->lockedForWrite); 297 DCHECK(!resource->lockedForWrite);
296 DCHECK(!resource->lockForReadCount); 298 DCHECK(!resource->lockForReadCount);
297 DCHECK(!resource->external); 299 DCHECK(!resource->external);
298 DCHECK(!resource->exported); 300 DCHECK(!resource->exported);
299 301
300 if (resource->glId) { 302 if (resource->glId) {
303 DCHECK(!resource->pendingSetPixels);
301 WebGraphicsContext3D* context3d = m_outputSurface->Context3D(); 304 WebGraphicsContext3D* context3d = m_outputSurface->Context3D();
302 DCHECK(context3d); 305 DCHECK(context3d);
303 DCHECK(m_textureUploader.get()); 306 DCHECK(m_textureUploader.get());
304 context3d->bindTexture(GL_TEXTURE_2D, resource->glId); 307 context3d->bindTexture(GL_TEXTURE_2D, resource->glId);
308 lazyAllocateTexture(context3d, resource);
305 m_textureUploader->upload(image, 309 m_textureUploader->upload(image,
306 imageRect, 310 imageRect,
307 sourceRect, 311 sourceRect,
308 destOffset, 312 destOffset,
309 resource->format, 313 resource->format,
310 resource->size); 314 resource->size);
311 } 315 }
312 316
313 if (resource->pixels) { 317 if (resource->pixels) {
318 DCHECK(resource->allocated);
314 DCHECK(resource->format == GL_RGBA); 319 DCHECK(resource->format == GL_RGBA);
315 SkBitmap srcFull; 320 SkBitmap srcFull;
316 srcFull.setConfig(SkBitmap::kARGB_8888_Config, imageRect.width(), imageR ect.height()); 321 srcFull.setConfig(SkBitmap::kARGB_8888_Config, imageRect.width(), imageR ect.height());
317 srcFull.setPixels(const_cast<uint8_t*>(image)); 322 srcFull.setPixels(const_cast<uint8_t*>(image));
318 SkBitmap srcSubset; 323 SkBitmap srcSubset;
319 SkIRect skSourceRect = SkIRect::MakeXYWH(sourceRect.x(), sourceRect.y(), sourceRect.width(), sourceRect.height()); 324 SkIRect skSourceRect = SkIRect::MakeXYWH(sourceRect.x(), sourceRect.y(), sourceRect.width(), sourceRect.height());
320 skSourceRect.offset(-imageRect.x(), -imageRect.y()); 325 skSourceRect.offset(-imageRect.x(), -imageRect.y());
321 srcFull.extractSubset(&srcSubset, skSourceRect); 326 srcFull.extractSubset(&srcSubset, skSourceRect);
322 327
323 ScopedWriteLockSoftware lock(this, id); 328 ScopedWriteLockSoftware lock(this, id);
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
378 } 383 }
379 384
380 const ResourceProvider::Resource* ResourceProvider::lockForRead(ResourceId id) 385 const ResourceProvider::Resource* ResourceProvider::lockForRead(ResourceId id)
381 { 386 {
382 DCHECK(m_threadChecker.CalledOnValidThread()); 387 DCHECK(m_threadChecker.CalledOnValidThread());
383 ResourceMap::iterator it = m_resources.find(id); 388 ResourceMap::iterator it = m_resources.find(id);
384 CHECK(it != m_resources.end()); 389 CHECK(it != m_resources.end());
385 Resource* resource = &it->second; 390 Resource* resource = &it->second;
386 DCHECK(!resource->lockedForWrite); 391 DCHECK(!resource->lockedForWrite);
387 DCHECK(!resource->exported); 392 DCHECK(!resource->exported);
393 DCHECK(resource->allocated);
388 resource->lockForReadCount++; 394 resource->lockForReadCount++;
389 return resource; 395 return resource;
390 } 396 }
391 397
392 void ResourceProvider::unlockForRead(ResourceId id) 398 void ResourceProvider::unlockForRead(ResourceId id)
393 { 399 {
394 DCHECK(m_threadChecker.CalledOnValidThread()); 400 DCHECK(m_threadChecker.CalledOnValidThread());
395 ResourceMap::iterator it = m_resources.find(id); 401 ResourceMap::iterator it = m_resources.find(id);
396 CHECK(it != m_resources.end()); 402 CHECK(it != m_resources.end());
397 Resource* resource = &it->second; 403 Resource* resource = &it->second;
(...skipping 241 matching lines...) Expand 10 before | Expand all | Expand 10 after
639 } 645 }
640 Child& childInfo = m_children.find(child)->second; 646 Child& childInfo = m_children.find(child)->second;
641 for (TransferableResourceArray::const_iterator it = resources.resources.begi n(); it != resources.resources.end(); ++it) { 647 for (TransferableResourceArray::const_iterator it = resources.resources.begi n(); it != resources.resources.end(); ++it) {
642 unsigned textureId; 648 unsigned textureId;
643 GLC(context3d, textureId = context3d->createTexture()); 649 GLC(context3d, textureId = context3d->createTexture());
644 GLC(context3d, context3d->bindTexture(GL_TEXTURE_2D, textureId)); 650 GLC(context3d, context3d->bindTexture(GL_TEXTURE_2D, textureId));
645 GLC(context3d, context3d->consumeTextureCHROMIUM(GL_TEXTURE_2D, it->mail box.name)); 651 GLC(context3d, context3d->consumeTextureCHROMIUM(GL_TEXTURE_2D, it->mail box.name));
646 ResourceId id = m_nextId++; 652 ResourceId id = m_nextId++;
647 Resource resource(textureId, it->size, it->format, it->filter); 653 Resource resource(textureId, it->size, it->format, it->filter);
648 resource.mailbox.setName(it->mailbox.name); 654 resource.mailbox.setName(it->mailbox.name);
655 // Don't allocate a texture for a child.
656 resource.allocated = true;
649 m_resources[id] = resource; 657 m_resources[id] = resource;
650 childInfo.parentToChildMap[id] = it->id; 658 childInfo.parentToChildMap[id] = it->id;
651 childInfo.childToParentMap[it->id] = id; 659 childInfo.childToParentMap[it->id] = id;
652 } 660 }
653 } 661 }
654 662
655 void ResourceProvider::receiveFromParent(const TransferableResourceList& resourc es) 663 void ResourceProvider::receiveFromParent(const TransferableResourceList& resourc es)
656 { 664 {
657 DCHECK(m_threadChecker.CalledOnValidThread()); 665 DCHECK(m_threadChecker.CalledOnValidThread());
658 WebGraphicsContext3D* context3d = m_outputSurface->Context3D(); 666 WebGraphicsContext3D* context3d = m_outputSurface->Context3D();
(...skipping 20 matching lines...) Expand all
679 bool ResourceProvider::transferResource(WebGraphicsContext3D* context, ResourceI d id, TransferableResource* resource) 687 bool ResourceProvider::transferResource(WebGraphicsContext3D* context, ResourceI d id, TransferableResource* resource)
680 { 688 {
681 DCHECK(m_threadChecker.CalledOnValidThread()); 689 DCHECK(m_threadChecker.CalledOnValidThread());
682 WebGraphicsContext3D* context3d = m_outputSurface->Context3D(); 690 WebGraphicsContext3D* context3d = m_outputSurface->Context3D();
683 ResourceMap::iterator it = m_resources.find(id); 691 ResourceMap::iterator it = m_resources.find(id);
684 CHECK(it != m_resources.end()); 692 CHECK(it != m_resources.end());
685 Resource* source = &it->second; 693 Resource* source = &it->second;
686 DCHECK(!source->lockedForWrite); 694 DCHECK(!source->lockedForWrite);
687 DCHECK(!source->lockForReadCount); 695 DCHECK(!source->lockForReadCount);
688 DCHECK(!source->external); 696 DCHECK(!source->external);
697 DCHECK(source->allocated);
689 if (source->exported) 698 if (source->exported)
690 return false; 699 return false;
691 resource->id = id; 700 resource->id = id;
692 resource->format = source->format; 701 resource->format = source->format;
693 resource->filter = source->filter; 702 resource->filter = source->filter;
694 resource->size = source->size; 703 resource->size = source->size;
695 704
696 if (source->mailbox.isZero()) { 705 if (source->mailbox.isZero()) {
697 GLbyte name[GL_MAILBOX_SIZE_CHROMIUM]; 706 GLbyte name[GL_MAILBOX_SIZE_CHROMIUM];
698 GLC(context3d, context3d->genMailboxCHROMIUM(name)); 707 GLC(context3d, context3d->genMailboxCHROMIUM(name));
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after
832 DCHECK(!resource->lockedForWrite); 841 DCHECK(!resource->lockedForWrite);
833 DCHECK(!resource->lockForReadCount); 842 DCHECK(!resource->lockForReadCount);
834 DCHECK(!resource->external); 843 DCHECK(!resource->external);
835 DCHECK(!resource->exported); 844 DCHECK(!resource->exported);
836 845
837 if (resource->glId) { 846 if (resource->glId) {
838 WebGraphicsContext3D* context3d = m_outputSurface->Context3D(); 847 WebGraphicsContext3D* context3d = m_outputSurface->Context3D();
839 DCHECK(context3d); 848 DCHECK(context3d);
840 DCHECK(resource->glPixelBufferId); 849 DCHECK(resource->glPixelBufferId);
841 context3d->bindTexture(GL_TEXTURE_2D, resource->glId); 850 context3d->bindTexture(GL_TEXTURE_2D, resource->glId);
851 lazyAllocateTexture(context3d, resource);
852
842 context3d->bindBuffer( 853 context3d->bindBuffer(
843 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, 854 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM,
844 resource->glPixelBufferId); 855 resource->glPixelBufferId);
845 context3d->texSubImage2D(GL_TEXTURE_2D, 856 context3d->texSubImage2D(GL_TEXTURE_2D,
846 0, /* level */ 857 0, /* level */
847 0, /* x */ 858 0, /* x */
848 0, /* y */ 859 0, /* y */
849 resource->size.width(), 860 resource->size.width(),
850 resource->size.height(), 861 resource->size.height(),
851 resource->format, 862 resource->format,
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
903 DCHECK(resource->glPixelBufferId); 914 DCHECK(resource->glPixelBufferId);
904 context3d->bindTexture(GL_TEXTURE_2D, resource->glId); 915 context3d->bindTexture(GL_TEXTURE_2D, resource->glId);
905 context3d->bindBuffer( 916 context3d->bindBuffer(
906 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, 917 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM,
907 resource->glPixelBufferId); 918 resource->glPixelBufferId);
908 if (!resource->glUploadQueryId) 919 if (!resource->glUploadQueryId)
909 resource->glUploadQueryId = context3d->createQueryEXT(); 920 resource->glUploadQueryId = context3d->createQueryEXT();
910 context3d->beginQueryEXT( 921 context3d->beginQueryEXT(
911 GL_ASYNC_PIXEL_TRANSFERS_COMPLETED_CHROMIUM, 922 GL_ASYNC_PIXEL_TRANSFERS_COMPLETED_CHROMIUM,
912 resource->glUploadQueryId); 923 resource->glUploadQueryId);
913 context3d->asyncTexSubImage2DCHROMIUM(GL_TEXTURE_2D, 924 if (!resource->allocated) {
914 0, /* level */ 925 resource->allocated = true;
915 0, /* x */ 926 context3d->asyncTexImage2DCHROMIUM(GL_TEXTURE_2D,
916 0, /* y */ 927 0, /* level */
917 resource->size.width(), 928 resource->format,
918 resource->size.height(), 929 resource->size.width(),
919 resource->format, 930 resource->size.height(),
920 GL_UNSIGNED_BYTE, 931 0, /* border */
921 NULL); 932 resource->format,
933 GL_UNSIGNED_BYTE,
934 NULL);
935 } else {
936 context3d->asyncTexSubImage2DCHROMIUM(GL_TEXTURE_2D,
937 0, /* level */
938 0, /* x */
939 0, /* y */
940 resource->size.width(),
941 resource->size.height(),
942 resource->format,
943 GL_UNSIGNED_BYTE,
944 NULL);
945 }
922 context3d->endQueryEXT(GL_ASYNC_PIXEL_TRANSFERS_COMPLETED_CHROMIUM); 946 context3d->endQueryEXT(GL_ASYNC_PIXEL_TRANSFERS_COMPLETED_CHROMIUM);
923 context3d->bindBuffer(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, 0); 947 context3d->bindBuffer(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, 0);
924 } 948 }
925 949
926 if (resource->pixels) 950 if (resource->pixels)
927 setPixelsFromBuffer(id); 951 setPixelsFromBuffer(id);
928 952
929 resource->pendingSetPixels = true; 953 resource->pendingSetPixels = true;
930 } 954 }
931 955
(...skipping 17 matching lines...) Expand all
949 if (!complete) 973 if (!complete)
950 return false; 974 return false;
951 } 975 }
952 976
953 resource->pendingSetPixels = false; 977 resource->pendingSetPixels = false;
954 unlockForWrite(id); 978 unlockForWrite(id);
955 979
956 return true; 980 return true;
957 } 981 }
958 982
983 void ResourceProvider::lazyAllocateTexture(WebGraphicsContext3D* context3d, Reso urce* resource) {
984 DCHECK(context3d);
985 DCHECK(resource);
986 DCHECK(resource->glId);
987 if (!resource->allocated) {
piman 2012/12/18 04:12:34 nit: if (resource->allocated) return; saves i
epenner 2012/12/18 04:23:52 Good point. Didn't double-check my cut/paste. Don
988 resource->allocated = true;
989 gfx::Size& size = resource->size;
990 GLenum format = resource->format;
991 if (m_useTextureStorageExt && isTextureFormatSupportedForStorage(format) ) {
992 GLenum storageFormat = textureToStorageFormat(format);
993 GLC(context3d, context3d->texStorage2DEXT(GL_TEXTURE_2D, 1, storageF ormat, size.width(), size.height()));
994 } else
995 GLC(context3d, context3d->texImage2D(GL_TEXTURE_2D, 0, format, size. width(), size.height(), 0, format, GL_UNSIGNED_BYTE, 0));
996 }
997 }
998
999
959 } // namespace cc 1000 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698