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

Side by Side Diff: cc/resource_provider.cc

Issue 11412043: cc: Add asynchronous setPixel interface. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebase 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 | Annotate | Revision Log
« no previous file with comments | « cc/resource_provider.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
43 } 43 }
44 44
45 static bool isTextureFormatSupportedForStorage(GLenum format) 45 static bool isTextureFormatSupportedForStorage(GLenum format)
46 { 46 {
47 return (format == GL_RGBA || format == GL_BGRA_EXT); 47 return (format == GL_RGBA || format == GL_BGRA_EXT);
48 } 48 }
49 49
50 ResourceProvider::Resource::Resource() 50 ResourceProvider::Resource::Resource()
51 : glId(0) 51 : glId(0)
52 , glPixelBufferId(0) 52 , glPixelBufferId(0)
53 , glUploadQueryId(0)
53 , pixels(0) 54 , pixels(0)
54 , pixelBuffer(0) 55 , pixelBuffer(0)
55 , pool(0) 56 , pool(0)
56 , lockForReadCount(0) 57 , lockForReadCount(0)
57 , lockedForWrite(false) 58 , lockedForWrite(false)
58 , external(false) 59 , external(false)
59 , exported(false) 60 , exported(false)
60 , markedForDeletion(false) 61 , markedForDeletion(false)
62 , pendingSetPixels(false)
61 , size() 63 , size()
62 , format(0) 64 , format(0)
63 , filter(0) 65 , filter(0)
64 , type(static_cast<ResourceType>(0)) 66 , type(static_cast<ResourceType>(0))
65 { 67 {
66 } 68 }
67 69
68 ResourceProvider::Resource::Resource(unsigned textureId, int pool, const gfx::Si ze& size, GLenum format, GLenum filter) 70 ResourceProvider::Resource::Resource(unsigned textureId, int pool, const gfx::Si ze& size, GLenum format, GLenum filter)
69 : glId(textureId) 71 : glId(textureId)
70 , glPixelBufferId(0) 72 , glPixelBufferId(0)
73 , glUploadQueryId(0)
71 , pixels(0) 74 , pixels(0)
72 , pixelBuffer(0) 75 , pixelBuffer(0)
73 , pool(pool) 76 , pool(pool)
74 , lockForReadCount(0) 77 , lockForReadCount(0)
75 , lockedForWrite(false) 78 , lockedForWrite(false)
76 , external(false) 79 , external(false)
77 , exported(false) 80 , exported(false)
78 , markedForDeletion(false) 81 , markedForDeletion(false)
82 , pendingSetPixels(false)
79 , size(size) 83 , size(size)
80 , format(format) 84 , format(format)
81 , filter(filter) 85 , filter(filter)
82 , type(GLTexture) 86 , type(GLTexture)
83 { 87 {
84 } 88 }
85 89
86 ResourceProvider::Resource::Resource(uint8_t* pixels, int pool, const gfx::Size& size, GLenum format, GLenum filter) 90 ResourceProvider::Resource::Resource(uint8_t* pixels, int pool, const gfx::Size& size, GLenum format, GLenum filter)
87 : glId(0) 91 : glId(0)
88 , glPixelBufferId(0) 92 , glPixelBufferId(0)
93 , glUploadQueryId(0)
89 , pixels(pixels) 94 , pixels(pixels)
90 , pixelBuffer(0) 95 , pixelBuffer(0)
91 , pool(pool) 96 , pool(pool)
92 , lockForReadCount(0) 97 , lockForReadCount(0)
93 , lockedForWrite(false) 98 , lockedForWrite(false)
94 , external(false) 99 , external(false)
95 , exported(false) 100 , exported(false)
96 , markedForDeletion(false) 101 , markedForDeletion(false)
102 , pendingSetPixels(false)
97 , size(size) 103 , size(size)
98 , format(format) 104 , format(format)
99 , filter(filter) 105 , filter(filter)
100 , type(Bitmap) 106 , type(Bitmap)
101 { 107 {
102 } 108 }
103 109
104 ResourceProvider::Child::Child() 110 ResourceProvider::Child::Child()
105 { 111 {
106 } 112 }
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after
234 } 240 }
235 241
236 void ResourceProvider::deleteResourceInternal(ResourceMap::iterator it) 242 void ResourceProvider::deleteResourceInternal(ResourceMap::iterator it)
237 { 243 {
238 Resource* resource = &it->second; 244 Resource* resource = &it->second;
239 if (resource->glId && !resource->external) { 245 if (resource->glId && !resource->external) {
240 WebGraphicsContext3D* context3d = m_outputSurface->context3D(); 246 WebGraphicsContext3D* context3d = m_outputSurface->context3D();
241 DCHECK(context3d); 247 DCHECK(context3d);
242 GLC(context3d, context3d->deleteTexture(resource->glId)); 248 GLC(context3d, context3d->deleteTexture(resource->glId));
243 } 249 }
250 if (resource->glUploadQueryId) {
251 WebGraphicsContext3D* context3d = m_outputSurface->context3D();
252 DCHECK(context3d);
253 GLC(context3d, context3d->deleteQueryEXT(resource->glUploadQueryId));
254 }
244 if (resource->glPixelBufferId) { 255 if (resource->glPixelBufferId) {
245 WebGraphicsContext3D* context3d = m_outputSurface->context3D(); 256 WebGraphicsContext3D* context3d = m_outputSurface->context3D();
246 DCHECK(context3d); 257 DCHECK(context3d);
247 GLC(context3d, context3d->deleteBuffer(resource->glPixelBufferId)); 258 GLC(context3d, context3d->deleteBuffer(resource->glPixelBufferId));
248 } 259 }
249 if (resource->pixels) 260 if (resource->pixels)
250 delete[] resource->pixels; 261 delete[] resource->pixels;
251 if (resource->pixelBuffer) 262 if (resource->pixelBuffer)
252 delete[] resource->pixelBuffer; 263 delete[] resource->pixelBuffer;
253 264
(...skipping 607 matching lines...) Expand 10 before | Expand all | Expand 10 after
861 DCHECK(!resource->lockedForWrite); 872 DCHECK(!resource->lockedForWrite);
862 873
863 GLC(context3d, context3d->bindTexture(target, resource->glId)); 874 GLC(context3d, context3d->bindTexture(target, resource->glId));
864 if (filter != resource->filter) { 875 if (filter != resource->filter) {
865 GLC(context3d, context3d->texParameteri(target, GL_TEXTURE_MIN_FILTER, f ilter)); 876 GLC(context3d, context3d->texParameteri(target, GL_TEXTURE_MIN_FILTER, f ilter));
866 GLC(context3d, context3d->texParameteri(target, GL_TEXTURE_MAG_FILTER, f ilter)); 877 GLC(context3d, context3d->texParameteri(target, GL_TEXTURE_MAG_FILTER, f ilter));
867 resource->filter = filter; 878 resource->filter = filter;
868 } 879 }
869 } 880 }
870 881
882 void ResourceProvider::beginSetPixels(ResourceId id)
883 {
884 DCHECK(m_threadChecker.CalledOnValidThread());
885 ResourceMap::iterator it = m_resources.find(id);
886 CHECK(it != m_resources.end());
887 Resource* resource = &it->second;
888 DCHECK(!resource->pendingSetPixels);
889
890 lockForWrite(id);
891
892 if (resource->glId) {
893 WebGraphicsContext3D* context3d = m_outputSurface->context3D();
894 DCHECK(context3d);
895 DCHECK(resource->glPixelBufferId);
896 context3d->bindTexture(GL_TEXTURE_2D, resource->glId);
897 context3d->bindBuffer(
898 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM,
899 resource->glPixelBufferId);
900 if (!resource->glUploadQueryId)
901 resource->glUploadQueryId = context3d->createQueryEXT();
902 context3d->beginQueryEXT(
903 GL_ASYNC_PIXEL_TRANSFERS_COMPLETED_CHROMIUM,
904 resource->glUploadQueryId);
905 context3d->asyncTexSubImage2DCHROMIUM(GL_TEXTURE_2D,
906 0, /* level */
907 0, /* x */
908 0, /* y */
909 resource->size.width(),
910 resource->size.height(),
911 resource->format,
912 GL_UNSIGNED_BYTE,
913 NULL);
914 context3d->endQueryEXT(GL_ASYNC_PIXEL_TRANSFERS_COMPLETED_CHROMIUM);
915 context3d->bindBuffer(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, 0);
916 }
917
918 if (resource->pixels)
919 setPixelsFromBuffer(id);
920
921 resource->pendingSetPixels = true;
922 }
923
924 bool ResourceProvider::didSetPixelsComplete(ResourceId id) {
925 DCHECK(m_threadChecker.CalledOnValidThread());
926 ResourceMap::iterator it = m_resources.find(id);
927 CHECK(it != m_resources.end());
928 Resource* resource = &it->second;
929 DCHECK(resource->lockedForWrite);
930 DCHECK(resource->pendingSetPixels);
931
932 if (resource->glId) {
933 WebGraphicsContext3D* context3d = m_outputSurface->context3D();
934 DCHECK(context3d);
935 DCHECK(resource->glUploadQueryId);
936 unsigned complete = 1;
937 context3d->getQueryObjectuivEXT(
938 resource->glUploadQueryId,
939 GL_QUERY_RESULT_AVAILABLE_EXT,
940 &complete);
941 if (!complete)
942 return false;
943 }
944
945 resource->pendingSetPixels = false;
946 unlockForWrite(id);
947
948 return true;
949 }
950
871 } // namespace cc 951 } // namespace cc
OLDNEW
« no previous file with comments | « cc/resource_provider.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698