OLD | NEW |
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 "GrBlurUtils.h" | 10 #include "GrBlurUtils.h" |
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
142 } | 142 } |
143 unsigned flags; | 143 unsigned flags; |
144 if (!CheckAlphaTypeAndGetFlags(nullptr, init, &flags)) { | 144 if (!CheckAlphaTypeAndGetFlags(nullptr, init, &flags)) { |
145 return nullptr; | 145 return nullptr; |
146 } | 146 } |
147 return new SkGpuDevice(rt, width, height, props, flags); | 147 return new SkGpuDevice(rt, width, height, props, flags); |
148 } | 148 } |
149 | 149 |
150 SkGpuDevice* SkGpuDevice::Create(GrContext* context, SkSurface::Budgeted budgete
d, | 150 SkGpuDevice* SkGpuDevice::Create(GrContext* context, SkSurface::Budgeted budgete
d, |
151 const SkImageInfo& info, int sampleCount, | 151 const SkImageInfo& info, int sampleCount, |
152 const SkSurfaceProps* props, InitContents init, | 152 const SkSurfaceProps* props, InitContents init)
{ |
153 GrTextureStorageAllocator customAllocator) { | |
154 unsigned flags; | 153 unsigned flags; |
155 if (!CheckAlphaTypeAndGetFlags(&info, init, &flags)) { | 154 if (!CheckAlphaTypeAndGetFlags(&info, init, &flags)) { |
156 return nullptr; | 155 return nullptr; |
157 } | 156 } |
158 | 157 |
159 SkAutoTUnref<GrRenderTarget> rt(CreateRenderTarget( | 158 SkAutoTUnref<GrRenderTarget> rt(CreateRenderTarget(context, budgeted, info,
sampleCount)); |
160 context, budgeted, info, sampleCount, customAllocator)); | |
161 if (nullptr == rt) { | 159 if (nullptr == rt) { |
162 return nullptr; | 160 return nullptr; |
163 } | 161 } |
164 | 162 |
165 return new SkGpuDevice(rt, info.width(), info.height(), props, flags); | 163 return new SkGpuDevice(rt, info.width(), info.height(), props, flags); |
166 } | 164 } |
167 | 165 |
168 SkGpuDevice::SkGpuDevice(GrRenderTarget* rt, int width, int height, | 166 SkGpuDevice::SkGpuDevice(GrRenderTarget* rt, int width, int height, |
169 const SkSurfaceProps* props, unsigned flags) | 167 const SkSurfaceProps* props, unsigned flags) |
170 : INHERITED(SkSurfacePropsCopyOrDefault(props)) | 168 : INHERITED(SkSurfacePropsCopyOrDefault(props)) |
171 , fContext(SkRef(rt->getContext())) | 169 , fContext(SkRef(rt->getContext())) |
172 , fRenderTarget(SkRef(rt)) { | 170 , fRenderTarget(SkRef(rt)) { |
173 fOpaque = SkToBool(flags & kIsOpaque_Flag); | 171 fOpaque = SkToBool(flags & kIsOpaque_Flag); |
174 | 172 |
175 SkAlphaType at = fOpaque ? kOpaque_SkAlphaType : kPremul_SkAlphaType; | 173 SkAlphaType at = fOpaque ? kOpaque_SkAlphaType : kPremul_SkAlphaType; |
176 SkImageInfo info = rt->surfacePriv().info(at).makeWH(width, height); | 174 SkImageInfo info = rt->surfacePriv().info(at).makeWH(width, height); |
177 SkPixelRef* pr = new SkGrPixelRef(info, rt); | 175 SkPixelRef* pr = new SkGrPixelRef(info, rt); |
178 fLegacyBitmap.setInfo(info); | 176 fLegacyBitmap.setInfo(info); |
179 fLegacyBitmap.setPixelRef(pr)->unref(); | 177 fLegacyBitmap.setPixelRef(pr)->unref(); |
180 | 178 |
181 fDrawContext.reset(this->context()->drawContext(rt, &this->surfaceProps())); | 179 fDrawContext.reset(this->context()->drawContext(rt, &this->surfaceProps())); |
182 if (flags & kNeedClear_Flag) { | 180 if (flags & kNeedClear_Flag) { |
183 this->clearAll(); | 181 this->clearAll(); |
184 } | 182 } |
185 } | 183 } |
186 | 184 |
187 GrRenderTarget* SkGpuDevice::CreateRenderTarget( | 185 GrRenderTarget* SkGpuDevice::CreateRenderTarget(GrContext* context, SkSurface::B
udgeted budgeted, |
188 GrContext* context, SkSurface::Budgeted budgeted, const SkImageInfo& ori
gInfo, | 186 const SkImageInfo& origInfo, int
sampleCount) { |
189 int sampleCount, GrTextureStorageAllocator textureStorageAllocator) { | |
190 if (kUnknown_SkColorType == origInfo.colorType() || | 187 if (kUnknown_SkColorType == origInfo.colorType() || |
191 origInfo.width() < 0 || origInfo.height() < 0) { | 188 origInfo.width() < 0 || origInfo.height() < 0) { |
192 return nullptr; | 189 return nullptr; |
193 } | 190 } |
194 | 191 |
195 if (!context) { | 192 if (!context) { |
196 return nullptr; | 193 return nullptr; |
197 } | 194 } |
198 | 195 |
199 SkColorType ct = origInfo.colorType(); | 196 SkColorType ct = origInfo.colorType(); |
200 SkAlphaType at = origInfo.alphaType(); | 197 SkAlphaType at = origInfo.alphaType(); |
201 if (kRGB_565_SkColorType == ct) { | 198 if (kRGB_565_SkColorType == ct) { |
202 at = kOpaque_SkAlphaType; // force this setting | 199 at = kOpaque_SkAlphaType; // force this setting |
203 } else if (ct != kBGRA_8888_SkColorType && ct != kRGBA_8888_SkColorType) { | 200 } else if (ct != kBGRA_8888_SkColorType && ct != kRGBA_8888_SkColorType) { |
204 // Fall back from whatever ct was to default of kRGBA or kBGRA which is
aliased as kN32 | 201 // Fall back from whatever ct was to default of kRGBA or kBGRA which is
aliased as kN32 |
205 ct = kN32_SkColorType; | 202 ct = kN32_SkColorType; |
206 } | 203 } |
207 if (kOpaque_SkAlphaType != at) { | 204 if (kOpaque_SkAlphaType != at) { |
208 at = kPremul_SkAlphaType; // force this setting | 205 at = kPremul_SkAlphaType; // force this setting |
209 } | 206 } |
210 const SkImageInfo info = SkImageInfo::Make(origInfo.width(), origInfo.height
(), ct, at); | 207 const SkImageInfo info = SkImageInfo::Make(origInfo.width(), origInfo.height
(), ct, at); |
211 | 208 |
212 GrSurfaceDesc desc; | 209 GrSurfaceDesc desc; |
213 desc.fFlags = kRenderTarget_GrSurfaceFlag; | 210 desc.fFlags = kRenderTarget_GrSurfaceFlag; |
214 desc.fWidth = info.width(); | 211 desc.fWidth = info.width(); |
215 desc.fHeight = info.height(); | 212 desc.fHeight = info.height(); |
216 desc.fConfig = SkImageInfo2GrPixelConfig(info); | 213 desc.fConfig = SkImageInfo2GrPixelConfig(info); |
217 desc.fSampleCnt = sampleCount; | 214 desc.fSampleCnt = sampleCount; |
218 desc.fTextureStorageAllocator = textureStorageAllocator; | |
219 GrTexture* texture = context->textureProvider()->createTexture( | 215 GrTexture* texture = context->textureProvider()->createTexture( |
220 desc, SkToBool(budgeted), nullptr, 0); | 216 desc, SkToBool(budgeted), nullptr, 0); |
221 if (nullptr == texture) { | 217 if (nullptr == texture) { |
222 return nullptr; | 218 return nullptr; |
223 } | 219 } |
224 SkASSERT(nullptr != texture->asRenderTarget()); | 220 SkASSERT(nullptr != texture->asRenderTarget()); |
225 return texture->asRenderTarget(); | 221 return texture->asRenderTarget(); |
226 } | 222 } |
227 | 223 |
228 /////////////////////////////////////////////////////////////////////////////// | 224 /////////////////////////////////////////////////////////////////////////////// |
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
319 } | 315 } |
320 | 316 |
321 void SkGpuDevice::replaceRenderTarget(bool shouldRetainContent) { | 317 void SkGpuDevice::replaceRenderTarget(bool shouldRetainContent) { |
322 ASSERT_SINGLE_OWNER | 318 ASSERT_SINGLE_OWNER |
323 | 319 |
324 SkSurface::Budgeted budgeted = | 320 SkSurface::Budgeted budgeted = |
325 fRenderTarget->resourcePriv().isBudgeted() ? SkSurface::kYes_Budgete
d | 321 fRenderTarget->resourcePriv().isBudgeted() ? SkSurface::kYes_Budgete
d |
326 : SkSurface::kNo_Budgeted
; | 322 : SkSurface::kNo_Budgeted
; |
327 | 323 |
328 SkAutoTUnref<GrRenderTarget> newRT(CreateRenderTarget( | 324 SkAutoTUnref<GrRenderTarget> newRT(CreateRenderTarget( |
329 this->context(), budgeted, this->imageInfo(), fRenderTarget->desc().fSam
pleCnt, | 325 this->context(), budgeted, this->imageInfo(), fRenderTarget->desc().fSam
pleCnt)); |
330 fRenderTarget->desc().fTextureStorageAllocator)); | |
331 | 326 |
332 if (nullptr == newRT) { | 327 if (nullptr == newRT) { |
333 return; | 328 return; |
334 } | 329 } |
335 | 330 |
336 if (shouldRetainContent) { | 331 if (shouldRetainContent) { |
337 if (fRenderTarget->wasDestroyed()) { | 332 if (fRenderTarget->wasDestroyed()) { |
338 return; | 333 return; |
339 } | 334 } |
340 this->context()->copySurface(newRT, fRenderTarget); | 335 this->context()->copySurface(newRT, fRenderTarget); |
(...skipping 1131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1472 fRenderTarget->isUnifiedMultisampled(); | 1467 fRenderTarget->isUnifiedMultisampled(); |
1473 bool doBicubic; | 1468 bool doBicubic; |
1474 GrTextureParams::FilterMode textureFilterMode = | 1469 GrTextureParams::FilterMode textureFilterMode = |
1475 GrSkFilterQualityToGrFilterMode(paint.getFilterQuality(), *draw.fMatrix,
SkMatrix::I(), | 1470 GrSkFilterQualityToGrFilterMode(paint.getFilterQuality(), *draw.fMatrix,
SkMatrix::I(), |
1476 &doBicubic); | 1471 &doBicubic); |
1477 if (useFallback || doBicubic || GrTextureParams::kNone_FilterMode != texture
FilterMode) { | 1472 if (useFallback || doBicubic || GrTextureParams::kNone_FilterMode != texture
FilterMode) { |
1478 SkNinePatchIter iter(producer->width(), producer->height(), center, dst)
; | 1473 SkNinePatchIter iter(producer->width(), producer->height(), center, dst)
; |
1479 | 1474 |
1480 SkRect srcR, dstR; | 1475 SkRect srcR, dstR; |
1481 while (iter.next(&srcR, &dstR)) { | 1476 while (iter.next(&srcR, &dstR)) { |
1482 this->drawTextureProducer(producer, &srcR, &dstR, SkCanvas::kStrict_
SrcRectConstraint, | 1477 this->drawTextureProducer(producer, &srcR, &dstR, SkCanvas::kStrict_
SrcRectConstraint, |
1483 *draw.fMatrix, fClip, paint); | 1478 *draw.fMatrix, fClip, paint); |
1484 } | 1479 } |
1485 return; | 1480 return; |
1486 } | 1481 } |
1487 | 1482 |
1488 static const GrTextureParams::FilterMode kMode = GrTextureParams::kNone_Filt
erMode; | 1483 static const GrTextureParams::FilterMode kMode = GrTextureParams::kNone_Filt
erMode; |
1489 SkAutoTUnref<const GrFragmentProcessor> fp( | 1484 SkAutoTUnref<const GrFragmentProcessor> fp( |
1490 producer->createFragmentProcessor(SkMatrix::I(), | 1485 producer->createFragmentProcessor(SkMatrix::I(), |
1491 SkRect::MakeIWH(producer->width(), pro
ducer->height()), | 1486 SkRect::MakeIWH(producer->width(), pro
ducer->height()), |
1492 GrTextureProducer::kNo_FilterConstrain
t, true, | 1487 GrTextureProducer::kNo_FilterConstrain
t, true, |
(...skipping 397 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1890 } | 1885 } |
1891 | 1886 |
1892 SkImageFilter::Cache* SkGpuDevice::getImageFilterCache() { | 1887 SkImageFilter::Cache* SkGpuDevice::getImageFilterCache() { |
1893 ASSERT_SINGLE_OWNER | 1888 ASSERT_SINGLE_OWNER |
1894 // We always return a transient cache, so it is freed after each | 1889 // We always return a transient cache, so it is freed after each |
1895 // filter traversal. | 1890 // filter traversal. |
1896 return SkGpuDevice::NewImageFilterCache(); | 1891 return SkGpuDevice::NewImageFilterCache(); |
1897 } | 1892 } |
1898 | 1893 |
1899 #endif | 1894 #endif |
OLD | NEW |