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

Side by Side Diff: src/gpu/SkGpuDevice.cpp

Issue 925343002: Swap render target instead of creating a new gpu device for surface copy-on-write (Closed) Base URL: https://skia.googlesource.com/skia.git@skimage-filters-02-use-sksurface-constructor-skgpudevice
Patch Set: Created 5 years, 10 months 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 /* 1 /*
2 * Copyright 2011 Google Inc. 2 * Copyright 2011 Google Inc.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license that can be 4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file. 5 * found in the LICENSE file.
6 */ 6 */
7 7
8 #include "SkGpuDevice.h" 8 #include "SkGpuDevice.h"
9 9
10 #include "effects/GrBicubicEffect.h" 10 #include "effects/GrBicubicEffect.h"
(...skipping 20 matching lines...) Expand all
31 #include "SkImageFilter.h" 31 #include "SkImageFilter.h"
32 #include "SkLayerInfo.h" 32 #include "SkLayerInfo.h"
33 #include "SkMaskFilter.h" 33 #include "SkMaskFilter.h"
34 #include "SkPathEffect.h" 34 #include "SkPathEffect.h"
35 #include "SkPicture.h" 35 #include "SkPicture.h"
36 #include "SkPictureData.h" 36 #include "SkPictureData.h"
37 #include "SkRecord.h" 37 #include "SkRecord.h"
38 #include "SkRRect.h" 38 #include "SkRRect.h"
39 #include "SkStroke.h" 39 #include "SkStroke.h"
40 #include "SkSurface.h" 40 #include "SkSurface.h"
41 #include "SkSurface_Gpu.h"
41 #include "SkTLazy.h" 42 #include "SkTLazy.h"
42 #include "SkUtils.h" 43 #include "SkUtils.h"
43 #include "SkVertState.h" 44 #include "SkVertState.h"
44 #include "SkXfermode.h" 45 #include "SkXfermode.h"
45 #include "SkErrorInternals.h" 46 #include "SkErrorInternals.h"
46 47
47 #if SK_SUPPORT_GPU 48 #if SK_SUPPORT_GPU
48 49
49 enum { kDefaultImageFilterCacheSize = 32 * 1024 * 1024 }; 50 enum { kDefaultImageFilterCacheSize = 32 * 1024 * 1024 };
50 51
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after
158 159
159 SkImageInfo info = rt->surfacePriv().info(); 160 SkImageInfo info = rt->surfacePriv().info();
160 SkPixelRef* pr = SkNEW_ARGS(SkGrPixelRef, (info, rt)); 161 SkPixelRef* pr = SkNEW_ARGS(SkGrPixelRef, (info, rt));
161 fLegacyBitmap.setInfo(info); 162 fLegacyBitmap.setInfo(info);
162 fLegacyBitmap.setPixelRef(pr)->unref(); 163 fLegacyBitmap.setPixelRef(pr)->unref();
163 164
164 bool useDFT = fSurfaceProps.isUseDistanceFieldFonts(); 165 bool useDFT = fSurfaceProps.isUseDistanceFieldFonts();
165 fTextContext = fContext->createTextContext(fRenderTarget, this->getLeakyProp erties(), useDFT); 166 fTextContext = fContext->createTextContext(fRenderTarget, this->getLeakyProp erties(), useDFT);
166 } 167 }
167 168
168 SkGpuDevice* SkGpuDevice::Create(GrContext* context, SkSurface::Budgeted budgete d, 169 GrRenderTarget* SkGpuDevice::CreateRenderTarget(GrContext* context, SkSurface::B udgeted budgeted,
169 const SkImageInfo& origInfo, int sampleCount, 170 const SkImageInfo& origInfo, int sampleCount) {
170 const SkSurfaceProps* props, unsigned flags) {
171 if (kUnknown_SkColorType == origInfo.colorType() || 171 if (kUnknown_SkColorType == origInfo.colorType() ||
172 origInfo.width() < 0 || origInfo.height() < 0) { 172 origInfo.width() < 0 || origInfo.height() < 0) {
173 return NULL; 173 return NULL;
174 } 174 }
175 175
176 if (!context) { 176 if (!context) {
177 return NULL; 177 return NULL;
178 } 178 }
179 179
180 SkColorType ct = origInfo.colorType(); 180 SkColorType ct = origInfo.colorType();
181 SkAlphaType at = origInfo.alphaType(); 181 SkAlphaType at = origInfo.alphaType();
182 if (kRGB_565_SkColorType == ct) { 182 if (kRGB_565_SkColorType == ct) {
183 at = kOpaque_SkAlphaType; // force this setting 183 at = kOpaque_SkAlphaType; // force this setting
184 } else if (ct != kBGRA_8888_SkColorType && ct != kRGBA_8888_SkColorType) { 184 } else if (ct != kBGRA_8888_SkColorType && ct != kRGBA_8888_SkColorType) {
185 // Fall back from whatever ct was to default of kRGBA or kBGRA which is aliased as kN32 185 // Fall back from whatever ct was to default of kRGBA or kBGRA which is aliased as kN32
186 ct = kN32_SkColorType; 186 ct = kN32_SkColorType;
187 } 187 }
188 if (kOpaque_SkAlphaType != at) { 188 if (kOpaque_SkAlphaType != at) {
189 at = kPremul_SkAlphaType; // force this setting 189 at = kPremul_SkAlphaType; // force this setting
190 } 190 }
191 const SkImageInfo info = SkImageInfo::Make(origInfo.width(), origInfo.height (), ct, at); 191 const SkImageInfo info = SkImageInfo::Make(origInfo.width(), origInfo.height (), ct, at);
192 192
193 GrSurfaceDesc desc; 193 GrSurfaceDesc desc;
194 desc.fFlags = kRenderTarget_GrSurfaceFlag; 194 desc.fFlags = kRenderTarget_GrSurfaceFlag;
195 desc.fWidth = info.width(); 195 desc.fWidth = info.width();
196 desc.fHeight = info.height(); 196 desc.fHeight = info.height();
197 desc.fConfig = SkImageInfo2GrPixelConfig(info); 197 desc.fConfig = SkImageInfo2GrPixelConfig(info);
198 desc.fSampleCnt = sampleCount; 198 desc.fSampleCnt = sampleCount;
199 GrTexture* texture = context->createTexture(desc, SkToBool(budgeted), NULL, 0);
200 if (NULL == texture) {
201 return NULL;
202 }
203 SkASSERT(NULL != texture->asRenderTarget());
204 return texture->asRenderTarget();
205 }
199 206
200 SkAutoTUnref<GrTexture> texture(context->createTexture(desc, SkToBool(budget ed), NULL, 0)); 207 SkGpuDevice* SkGpuDevice::Create(GrContext* context, SkSurface::Budgeted budgete d,
201 if (!texture) { 208 const SkImageInfo& info, int sampleCount,
209 const SkSurfaceProps* props, unsigned flags) {
210
211 SkAutoTUnref<GrRenderTarget> rt(CreateRenderTarget(context, budgeted, info, sampleCount));
212 if (!rt) {
202 return NULL; 213 return NULL;
203 } 214 }
204 215
205 return SkNEW_ARGS(SkGpuDevice, (texture->asRenderTarget(), props, flags)); 216 return SkNEW_ARGS(SkGpuDevice, (rt, props, flags));
206 } 217 }
207 218
208 SkGpuDevice::~SkGpuDevice() { 219 SkGpuDevice::~SkGpuDevice() {
209 if (fDrawProcs) { 220 if (fDrawProcs) {
210 delete fDrawProcs; 221 delete fDrawProcs;
211 } 222 }
212 223
213 delete fTextContext; 224 delete fTextContext;
214 225
215 // The GrContext takes a ref on the target. We don't want to cause the rende r 226 // The GrContext takes a ref on the target. We don't want to cause the rende r
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
304 } 315 }
305 316
306 void SkGpuDevice::clearAll() { 317 void SkGpuDevice::clearAll() {
307 GrColor color = 0; 318 GrColor color = 0;
308 GR_CREATE_TRACE_MARKER_CONTEXT("SkGpuDevice::clearAll", fContext); 319 GR_CREATE_TRACE_MARKER_CONTEXT("SkGpuDevice::clearAll", fContext);
309 SkIRect rect = SkIRect::MakeWH(this->width(), this->height()); 320 SkIRect rect = SkIRect::MakeWH(this->width(), this->height());
310 fContext->clear(&rect, color, true, fRenderTarget); 321 fContext->clear(&rect, color, true, fRenderTarget);
311 fNeedClear = false; 322 fNeedClear = false;
312 } 323 }
313 324
325 void SkGpuDevice::swapRenderTarget(GrRenderTarget* newRenderTarget) {
326 SkASSERT(!fNeedClear);
327 if (fContext->getRenderTarget() == fRenderTarget) {
328 fContext->setRenderTarget(NULL);
329 }
330 SkRefCnt_SafeAssign(fRenderTarget, newRenderTarget);
331 SkASSERT(newRenderTarget->surfacePriv().info() == fLegacyBitmap.info());
332 SkPixelRef* pr = SkNEW_ARGS(SkGrPixelRef, (newRenderTarget->surfacePriv().in fo(),
333 newRenderTarget));
334 fLegacyBitmap.setPixelRef(pr)->unref();
335 }
336
314 /////////////////////////////////////////////////////////////////////////////// 337 ///////////////////////////////////////////////////////////////////////////////
315 338
316 SK_COMPILE_ASSERT(SkShader::kNone_BitmapType == 0, shader_type_mismatch); 339 SK_COMPILE_ASSERT(SkShader::kNone_BitmapType == 0, shader_type_mismatch);
317 SK_COMPILE_ASSERT(SkShader::kDefault_BitmapType == 1, shader_type_mismatch); 340 SK_COMPILE_ASSERT(SkShader::kDefault_BitmapType == 1, shader_type_mismatch);
318 SK_COMPILE_ASSERT(SkShader::kRadial_BitmapType == 2, shader_type_mismatch); 341 SK_COMPILE_ASSERT(SkShader::kRadial_BitmapType == 2, shader_type_mismatch);
319 SK_COMPILE_ASSERT(SkShader::kSweep_BitmapType == 3, shader_type_mismatch); 342 SK_COMPILE_ASSERT(SkShader::kSweep_BitmapType == 3, shader_type_mismatch);
320 SK_COMPILE_ASSERT(SkShader::kTwoPointRadial_BitmapType == 4, 343 SK_COMPILE_ASSERT(SkShader::kTwoPointRadial_BitmapType == 4,
321 shader_type_mismatch); 344 shader_type_mismatch);
322 SK_COMPILE_ASSERT(SkShader::kTwoPointConical_BitmapType == 5, 345 SK_COMPILE_ASSERT(SkShader::kTwoPointConical_BitmapType == 5,
323 shader_type_mismatch); 346 shader_type_mismatch);
(...skipping 1580 matching lines...) Expand 10 before | Expand all | Expand 10 after
1904 #endif 1927 #endif
1905 } 1928 }
1906 1929
1907 SkImageFilter::Cache* SkGpuDevice::getImageFilterCache() { 1930 SkImageFilter::Cache* SkGpuDevice::getImageFilterCache() {
1908 // We always return a transient cache, so it is freed after each 1931 // We always return a transient cache, so it is freed after each
1909 // filter traversal. 1932 // filter traversal.
1910 return SkImageFilter::Cache::Create(kDefaultImageFilterCacheSize); 1933 return SkImageFilter::Cache::Create(kDefaultImageFilterCacheSize);
1911 } 1934 }
1912 1935
1913 #endif 1936 #endif
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698