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

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

Issue 1459433002: Convert SkGpuDevice::drawTextureAdjuster to SkGpuDevice::drawTextureProducer (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: move domain opt Created 5 years, 1 month 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 2015 Google Inc. 2 * Copyright 2015 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 "GrTextureParamsAdjuster.h" 8 #include "GrTextureParamsAdjuster.h"
9 9
10 #include "GrCaps.h" 10 #include "GrCaps.h"
(...skipping 195 matching lines...) Expand 10 before | Expand all | Expand 10 after
206 SkASSERT(!textureContentArea || 206 SkASSERT(!textureContentArea ||
207 (!textureContentArea->contains(SkIRect::MakeWH(texW, texH)) && 207 (!textureContentArea->contains(SkIRect::MakeWH(texW, texH)) &&
208 SkRect::Make(*textureContentArea).contains(constraintRect))); 208 SkRect::Make(*textureContentArea).contains(constraintRect)));
209 209
210 SkRect textureBounds = SkRect::MakeIWH(texW, texH); 210 SkRect textureBounds = SkRect::MakeIWH(texW, texH);
211 // If the src rectangle contains the whole texture then no need for a domain . 211 // If the src rectangle contains the whole texture then no need for a domain .
212 if (constraintRect.contains(textureBounds)) { 212 if (constraintRect.contains(textureBounds)) {
213 return kNoDomain_DomainMode; 213 return kNoDomain_DomainMode;
214 } 214 }
215 215
216 bool restrictFilterToRect = (filterConstraint == GrTextureAdjuster::kYes_Fil terConstraint); 216 bool restrictFilterToRect = (filterConstraint == GrTextureProducer::kYes_Fil terConstraint);
217 217
218 // If we can filter outside the constraint rect, and there is no non-content area of the 218 // If we can filter outside the constraint rect, and there is no non-content area of the
219 // texture, and we aren't going to generate sample coords outside the constr aint rect then we 219 // texture, and we aren't going to generate sample coords outside the constr aint rect then we
220 // don't need a domain. 220 // don't need a domain.
221 if (!restrictFilterToRect && !textureContentArea && coordsLimitedToConstrain tRect) { 221 if (!restrictFilterToRect && !textureContentArea && coordsLimitedToConstrain tRect) {
222 return kNoDomain_DomainMode; 222 return kNoDomain_DomainMode;
223 } 223 }
224 224
225 // Get the domain inset based on sampling mode (or bail if mipped) 225 // Get the domain inset based on sampling mode (or bail if mipped)
226 SkScalar filterHalfWidth = 0.f; 226 SkScalar filterHalfWidth = 0.f;
227 if (filterModeOrNullForBicubic) { 227 if (filterModeOrNullForBicubic) {
228 switch (*filterModeOrNullForBicubic) { 228 switch (*filterModeOrNullForBicubic) {
229 case GrTextureParams::kNone_FilterMode: 229 case GrTextureParams::kNone_FilterMode:
230 if (coordsLimitedToConstraintRect) { 230 if (coordsLimitedToConstraintRect) {
231 return kNoDomain_DomainMode; 231 return kNoDomain_DomainMode;
232 } else { 232 } else {
233 filterHalfWidth = 0.f; 233 filterHalfWidth = 0.f;
234 } 234 }
235 break; 235 break;
236 case GrTextureParams::kBilerp_FilterMode: 236 case GrTextureParams::kBilerp_FilterMode:
237 filterHalfWidth = .5f; 237 filterHalfWidth = .5f;
238 break; 238 break;
239 case GrTextureParams::kMipMap_FilterMode: 239 case GrTextureParams::kMipMap_FilterMode:
240 // No domain can save use here. 240 if (restrictFilterToRect || textureContentArea) {
bsalomon 2015/11/17 23:15:57 this check should have been here all along.
robertphillips 2015/11/18 13:58:35 use -> us ?
bsalomon 2015/11/18 18:05:37 Done
241 return kTightCopy_DomainMode; 241 // No domain can save use here.
242 return kTightCopy_DomainMode;
243 }
244 return kNoDomain_DomainMode;
242 } 245 }
243 } else { 246 } else {
244 // bicubic does nearest filtering internally. 247 // bicubic does nearest filtering internally.
245 filterHalfWidth = 1.5f; 248 filterHalfWidth = 1.5f;
246 } 249 }
247 250
248 // Both bilerp and bicubic use bilinear filtering and so need to be clamped to the center 251 // Both bilerp and bicubic use bilinear filtering and so need to be clamped to the center
249 // of the edge texel. Pinning to the texel center has no impact on nearest m ode and MIP-maps 252 // of the edge texel. Pinning to the texel center has no impact on nearest m ode and MIP-maps
250 253
251 static const SkScalar kDomainInset = 0.5f; 254 static const SkScalar kDomainInset = 0.5f;
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
314 if (domainRect->fLeft > domainRect->fRight) { 317 if (domainRect->fLeft > domainRect->fRight) {
315 domainRect->fLeft = domainRect->fRight = SkScalarAve(domainRect->fLeft, domainRect->fRight); 318 domainRect->fLeft = domainRect->fRight = SkScalarAve(domainRect->fLeft, domainRect->fRight);
316 } 319 }
317 if (domainRect->fTop > domainRect->fBottom) { 320 if (domainRect->fTop > domainRect->fBottom) {
318 domainRect->fTop = domainRect->fBottom = SkScalarAve(domainRect->fTop, d omainRect->fBottom); 321 domainRect->fTop = domainRect->fBottom = SkScalarAve(domainRect->fTop, d omainRect->fBottom);
319 } 322 }
320 domainRect->fLeft /= texW; 323 domainRect->fLeft /= texW;
321 domainRect->fTop /= texH; 324 domainRect->fTop /= texH;
322 domainRect->fRight /= texW; 325 domainRect->fRight /= texW;
323 domainRect->fBottom /= texH; 326 domainRect->fBottom /= texH;
324 return kDomain_DomainMode; 327 return kDomain_DomainMode;
robertphillips 2015/11/18 13:58:35 rm ';' ?
bsalomon 2015/11/18 18:05:38 Done.
328 };
329
robertphillips 2015/11/18 13:58:35 static ?
bsalomon 2015/11/18 18:05:38 Done.
330 const GrFragmentProcessor* create_fp_for_domain_and_filter(
331 GrTexture* texture,
332 const SkMatrix& textureMatrix,
333 DomainMode domainMode,
334 const SkRect& domain,
335 const GrTextureParams::FilterMode* filte rOrNullForBicubic) {
336 SkASSERT(kTightCopy_DomainMode != domainMode);
337 if (filterOrNullForBicubic) {
338 if (kDomain_DomainMode == domainMode) {
339 return GrTextureDomainEffect::Create(texture, textureMatrix, domain,
340 GrTextureDomain::kClamp_Mode,
341 *filterOrNullForBicubic);
342 } else {
343 GrTextureParams params(SkShader::kClamp_TileMode, *filterOrNullForBi cubic);
344 return GrSimpleTextureEffect::Create(texture, textureMatrix, params) ;
345 }
346 } else {
347 if (kDomain_DomainMode == domainMode) {
348 return GrBicubicEffect::Create(texture, textureMatrix, domain);
349 } else {
350 static const SkShader::TileMode kClampClamp[] =
351 { SkShader::kClamp_TileMode, SkShader::kClamp_TileMode };
352 return GrBicubicEffect::Create(texture, textureMatrix, kClampClamp);
353 }
354 }
325 } 355 }
326 356
327 const GrFragmentProcessor* GrTextureAdjuster::createFragmentProcessor( 357 const GrFragmentProcessor* GrTextureAdjuster::createFragmentProcessor(
328 const SkMatrix& origTextureMatrix, 358 const SkMatrix& origTextureMatrix,
329 const SkRect& origConstraintRect, 359 const SkRect& origConstraintRect,
330 FilterConstraint filterConstraint, 360 FilterConstraint filterConstraint,
331 bool coordsLimitedToConstraintRect, 361 bool coordsLimitedToConstraintRect,
332 const GrTextureParams::FilterMode* filte rOrNullForBicubic) { 362 const GrTextureParams::FilterMode* filte rOrNullForBicubic) {
333 363
334 SkMatrix textureMatrix = origTextureMatrix; 364 SkMatrix textureMatrix = origTextureMatrix;
(...skipping 26 matching lines...) Expand all
361 static const GrTextureParams::FilterMode kBilerp = GrTextureParams::kBil erp_FilterMode; 391 static const GrTextureParams::FilterMode kBilerp = GrTextureParams::kBil erp_FilterMode;
362 domainMode = 392 domainMode =
363 determine_domain_mode(*constraintRect, filterConstraint, coordsLimit edToConstraintRect, 393 determine_domain_mode(*constraintRect, filterConstraint, coordsLimit edToConstraintRect,
364 texture->width(), texture->height(), 394 texture->width(), texture->height(),
365 contentArea, &kBilerp, &domain); 395 contentArea, &kBilerp, &domain);
366 SkASSERT(kTightCopy_DomainMode != domainMode); 396 SkASSERT(kTightCopy_DomainMode != domainMode);
367 } 397 }
368 SkASSERT(kNoDomain_DomainMode == domainMode || 398 SkASSERT(kNoDomain_DomainMode == domainMode ||
369 (domain.fLeft <= domain.fRight && domain.fTop <= domain.fBottom)); 399 (domain.fLeft <= domain.fRight && domain.fTop <= domain.fBottom));
370 textureMatrix.postIDiv(texture->width(), texture->height()); 400 textureMatrix.postIDiv(texture->width(), texture->height());
371 if (filterOrNullForBicubic) { 401 return create_fp_for_domain_and_filter(texture, textureMatrix, domainMode, d omain,
372 if (kDomain_DomainMode == domainMode) { 402 filterOrNullForBicubic);
373 return GrTextureDomainEffect::Create(texture, textureMatrix, domain,
374 GrTextureDomain::kClamp_Mode,
375 *filterOrNullForBicubic);
376 } else {
377 GrTextureParams params(SkShader::kClamp_TileMode, *filterOrNullForBi cubic);
378 return GrSimpleTextureEffect::Create(texture, textureMatrix, params) ;
379 }
380 } else {
381 if (kDomain_DomainMode == domainMode) {
382 return GrBicubicEffect::Create(texture, textureMatrix, domain);
383 } else {
384 static const SkShader::TileMode kClampClamp[] =
385 { SkShader::kClamp_TileMode, SkShader::kClamp_TileMode };
386 return GrBicubicEffect::Create(texture, textureMatrix, kClampClamp);
387 }
388 }
389 } 403 }
390 404
391 ////////////////////////////////////////////////////////////////////////////// 405 //////////////////////////////////////////////////////////////////////////////
392 406
393 GrTexture* GrTextureMaker::refTextureForParams(GrContext* ctx, const GrTexturePa rams& params) { 407 GrTexture* GrTextureMaker::refTextureForParams(const GrTextureParams& params) {
394 CopyParams copyParams; 408 CopyParams copyParams;
395 if (!ctx->getGpu()->makeCopyForTextureParams(this->width(), this->height(), params, 409 if (!fContext->getGpu()->makeCopyForTextureParams(this->width(), this->heigh t(), params,
396 &copyParams)) { 410 &copyParams)) {
397 return this->refOriginalTexture(ctx); 411 return this->refOriginalTexture();
398 } 412 }
399 GrUniqueKey copyKey; 413 GrUniqueKey copyKey;
400 this->makeCopyKey(copyParams, &copyKey); 414 this->makeCopyKey(copyParams, &copyKey);
401 if (copyKey.isValid()) { 415 if (copyKey.isValid()) {
402 GrTexture* result = ctx->textureProvider()->findAndRefTextureByUniqueKey (copyKey); 416 GrTexture* result = fContext->textureProvider()->findAndRefTextureByUniq ueKey(copyKey);
403 if (result) { 417 if (result) {
404 return result; 418 return result;
405 } 419 }
406 } 420 }
407 421
408 GrTexture* result = this->generateTextureForParams(ctx, copyParams); 422 GrTexture* result = this->generateTextureForParams(copyParams);
409 if (!result) { 423 if (!result) {
410 return nullptr; 424 return nullptr;
411 } 425 }
412 426
413 if (copyKey.isValid()) { 427 if (copyKey.isValid()) {
robertphillips 2015/11/18 13:58:35 Why not fContext ?
bsalomon 2015/11/18 18:05:37 Done.
414 ctx->textureProvider()->assignUniqueKeyToTexture(copyKey, result); 428 this->context()->textureProvider()->assignUniqueKeyToTexture(copyKey, re sult);
415 this->didCacheCopy(copyKey); 429 this->didCacheCopy(copyKey);
416 } 430 }
417 return result; 431 return result;
418 } 432 }
419 433
420 GrTexture* GrTextureMaker::generateTextureForParams(GrContext* ctx, const CopyPa rams& copyParams) { 434 const GrFragmentProcessor* GrTextureMaker::createFragmentProcessor(
421 SkAutoTUnref<GrTexture> original(this->refOriginalTexture(ctx)); 435 const SkMatrix& textureMatrix,
436 const SkRect& constraintRect,
437 FilterConstraint filterConstraint,
438 bool coordsLimitedToConstraintRect,
439 const GrTextureParams::FilterMode* filte rOrNullForBicubic) {
440
robertphillips 2015/11/18 13:58:35 // The filter mode used to determine the domain di
bsalomon 2015/11/18 18:05:38 The explanation is two lines below
441 const GrTextureParams::FilterMode* fmForDetermineDomain = filterOrNullForBic ubic;
442 if (filterOrNullForBicubic && GrTextureParams::kMipMap_FilterMode == *filter OrNullForBicubic &&
443 kYes_FilterConstraint == filterConstraint) {
444 // TOOD: Here we should force a copy restricted to the constraintRect si nce MIP maps will
445 // read outside the constraint rect. However, as in the adjuster case, w e aren't currently
446 // doing that.
447 static const GrTextureParams::FilterMode kBilerp = GrTextureParams::kBil erp_FilterMode;
448 fmForDetermineDomain = &kBilerp;
449 }
450
451 GrTextureParams params;
452 if (filterOrNullForBicubic) {
453 params.reset(SkShader::kClamp_TileMode, *filterOrNullForBicubic);
454 } else {
455 // Bicubic doesn't use filtering for it's texture accesses.
456 params.reset(SkShader::kClamp_TileMode, GrTextureParams::kNone_FilterMod e);
457 }
458 SkAutoTUnref<GrTexture> texture(this->refTextureForParams(params));
459 if (!texture) {
460 return nullptr;
461 }
462 SkRect domain;
463 DomainMode domainMode =
464 determine_domain_mode(constraintRect, filterConstraint, coordsLimitedToC onstraintRect,
465 texture->width(), texture->height(), nullptr, fmFo rDetermineDomain,
466 &domain);
467 SkASSERT(kTightCopy_DomainMode != domainMode);
468 SkMatrix normalizedTextureMatrix = textureMatrix;
469 normalizedTextureMatrix.postIDiv(texture->width(), texture->height());
470 return create_fp_for_domain_and_filter(texture, normalizedTextureMatrix, dom ainMode, domain,
471 filterOrNullForBicubic);
472 }
473
474 GrTexture* GrTextureMaker::generateTextureForParams(const CopyParams& copyParams ) {
475 SkAutoTUnref<GrTexture> original(this->refOriginalTexture());
422 if (!original) { 476 if (!original) {
423 return nullptr; 477 return nullptr;
424 } 478 }
425 return copy_on_gpu(original, nullptr, copyParams); 479 return copy_on_gpu(original, nullptr, copyParams);
426 } 480 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698