OLD | NEW |
1 #include "DMSrcSink.h" | 1 #include "DMSrcSink.h" |
2 #include "SamplePipeControllers.h" | 2 #include "SamplePipeControllers.h" |
3 #include "SkCommonFlags.h" | 3 #include "SkCommonFlags.h" |
4 #include "SkDocument.h" | 4 #include "SkDocument.h" |
5 #include "SkMultiPictureDraw.h" | 5 #include "SkMultiPictureDraw.h" |
6 #include "SkOSFile.h" | 6 #include "SkOSFile.h" |
7 #include "SkPictureRecorder.h" | 7 #include "SkPictureRecorder.h" |
8 #include "SkRandom.h" | 8 #include "SkRandom.h" |
9 #include "SkTLS.h" | |
10 | 9 |
11 namespace DM { | 10 namespace DM { |
12 | 11 |
13 void SafeUnref(SkPicture* p) { SkSafeUnref(p); } | 12 void SafeUnref(SkPicture* p) { SkSafeUnref(p); } |
14 void SafeUnref(SkData* d) { SkSafeUnref(d); } | 13 void SafeUnref(SkData* d) { SkSafeUnref(d); } |
15 | 14 |
16 // FIXME: the GM objects themselves are not threadsafe, so we create and destroy
them as needed. | 15 // FIXME: the GM objects themselves are not threadsafe, so we create and destroy
them as needed. |
17 | 16 |
18 GMSrc::GMSrc(skiagm::GMRegistry::Factory factory) : fFactory(factory) {} | 17 GMSrc::GMSrc(skiagm::GMRegistry::Factory factory) : fFactory(factory) {} |
19 | 18 |
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
146 SkIRect bounds; | 145 SkIRect bounds; |
147 cull.roundOut(&bounds); | 146 cull.roundOut(&bounds); |
148 SkISize size = { bounds.width(), bounds.height() }; | 147 SkISize size = { bounds.width(), bounds.height() }; |
149 return size; | 148 return size; |
150 } | 149 } |
151 | 150 |
152 Name SKPSrc::name() const { return SkOSPath::Basename(fPath.c_str()); } | 151 Name SKPSrc::name() const { return SkOSPath::Basename(fPath.c_str()); } |
153 | 152 |
154 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~*/ | 153 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~*/ |
155 | 154 |
156 DEFINE_string(gpu_threading, "none", | 155 GPUSink::GPUSink(GrContextFactory::GLContextType ct, |
157 "none: single thread,\n" | 156 GrGLStandard api, |
158 "tls: any thread, GrContextFactory in TLS (crashy),\n" | 157 int samples, |
159 "stack: any thread, GrContextFactory on stack (less crashy, differently
so)"); | 158 bool dfText, |
160 | 159 bool threaded) |
161 GPUSink::GPUSink(GrContextFactory::GLContextType ct, GrGLStandard api, int sampl
es, bool dfText) | |
162 : fContextType(ct) | 160 : fContextType(ct) |
163 , fGpuAPI(api) | 161 , fGpuAPI(api) |
164 , fSampleCount(samples) | 162 , fSampleCount(samples) |
165 , fUseDFText(dfText) {} | 163 , fUseDFText(dfText) |
| 164 , fThreaded(threaded) {} |
166 | 165 |
167 int GPUSink::enclave() const { | 166 int GPUSink::enclave() const { |
168 return FLAGS_gpu_threading.contains("none") ? kGPUSink_Enclave : kAnyThread_
Enclave; | 167 return fThreaded ? kAnyThread_Enclave : kGPUSink_Enclave; |
169 } | 168 } |
170 | 169 |
171 static void* CreateGrFactory() { return new GrContextFactory; } | |
172 static void DeleteGrFactory(void* p) { delete (GrContextFactory*)p; } | |
173 | |
174 Error GPUSink::draw(const Src& src, SkBitmap* dst, SkWStream*) const { | 170 Error GPUSink::draw(const Src& src, SkBitmap* dst, SkWStream*) const { |
175 GrContextFactory local, *factory = &local; | 171 GrContextFactory* factory = GetThreadLocalGrContextFactory(); |
176 if (!FLAGS_gpu_threading.contains("stack")) { | |
177 factory = (GrContextFactory*)SkTLS::Get(CreateGrFactory, DeleteGrFactory
); | |
178 } | |
179 // Does abandoning / resetting contexts make any sense if we have stack-scop
ed factories? | |
180 if (FLAGS_abandonGpuContext) { | 172 if (FLAGS_abandonGpuContext) { |
181 factory->abandonContexts(); | 173 factory->abandonContexts(); |
182 } | 174 } |
183 if (FLAGS_resetGpuContext || FLAGS_abandonGpuContext) { | 175 if (FLAGS_resetGpuContext || FLAGS_abandonGpuContext) { |
184 factory->destroyContexts(); | 176 factory->destroyContexts(); |
185 } | 177 } |
186 const SkISize size = src.size(); | 178 const SkISize size = src.size(); |
187 const SkImageInfo info = | 179 const SkImageInfo info = |
188 SkImageInfo::Make(size.width(), size.height(), kN32_SkColorType, kPremul
_SkAlphaType); | 180 SkImageInfo::Make(size.width(), size.height(), kN32_SkColorType, kPremul
_SkAlphaType); |
189 SkAutoTUnref<SkSurface> surface( | 181 SkAutoTUnref<SkSurface> surface( |
(...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
380 surfaces.unrefAll(); | 372 surfaces.unrefAll(); |
381 return ""; | 373 return ""; |
382 } | 374 } |
383 SkISize size() const SK_OVERRIDE { return fSize; } | 375 SkISize size() const SK_OVERRIDE { return fSize; } |
384 Name name() const SK_OVERRIDE { sk_throw(); return ""; } // No one shou
ld be calling this. | 376 Name name() const SK_OVERRIDE { sk_throw(); return ""; } // No one shou
ld be calling this. |
385 } proxy(fW, fH, pic, src.size()); | 377 } proxy(fW, fH, pic, src.size()); |
386 return fSink->draw(proxy, bitmap, stream); | 378 return fSink->draw(proxy, bitmap, stream); |
387 } | 379 } |
388 | 380 |
389 } // namespace DM | 381 } // namespace DM |
OLD | NEW |