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

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

Issue 1594483003: Texturing support for RECTANGLE textures. (Closed) Base URL: https://skia.googlesource.com/skia.git@rectangle
Patch Set: fix float->int warnings Created 4 years, 11 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
« no previous file with comments | « src/gpu/GrTextureParamsAdjuster.h ('k') | src/gpu/gl/GrGLCaps.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 115 matching lines...) Expand 10 before | Expand all | Expand 10 after
126 bool isAlphaOnly) 126 bool isAlphaOnly)
127 : INHERITED(contentArea.width(), contentArea.height(), isAlphaOnly) 127 : INHERITED(contentArea.width(), contentArea.height(), isAlphaOnly)
128 , fOriginal(original) { 128 , fOriginal(original) {
129 SkASSERT(SkIRect::MakeWH(original->width(), original->height()).contains(con tentArea)); 129 SkASSERT(SkIRect::MakeWH(original->width(), original->height()).contains(con tentArea));
130 if (contentArea.fLeft > 0 || contentArea.fTop > 0 || 130 if (contentArea.fLeft > 0 || contentArea.fTop > 0 ||
131 contentArea.fRight < original->width() || contentArea.fBottom < original ->height()) { 131 contentArea.fRight < original->width() || contentArea.fBottom < original ->height()) {
132 fContentArea.set(contentArea); 132 fContentArea.set(contentArea);
133 } 133 }
134 } 134 }
135 135
136 GrTexture* GrTextureAdjuster::refCopy(const CopyParams& copyParams) {
137 GrTexture* texture = this->originalTexture();
138 GrContext* context = texture->getContext();
139 const SkIRect* contentArea = this->contentAreaOrNull();
140 GrUniqueKey key;
141 this->makeCopyKey(copyParams, &key);
142 if (key.isValid()) {
143 GrTexture* cachedCopy = context->textureProvider()->findAndRefTextureByU niqueKey(key);
144 if (cachedCopy) {
145 return cachedCopy;
146 }
147 }
148 GrTexture* copy = copy_on_gpu(texture, contentArea, copyParams);
149 if (copy) {
150 if (key.isValid()) {
151 copy->resourcePriv().setUniqueKey(key);
152 this->didCacheCopy(key);
153 }
154 }
155 return copy;
156 }
157
136 GrTexture* GrTextureAdjuster::refTextureSafeForParams(const GrTextureParams& par ams, 158 GrTexture* GrTextureAdjuster::refTextureSafeForParams(const GrTextureParams& par ams,
137 SkIPoint* outOffset) { 159 SkIPoint* outOffset) {
138 GrTexture* texture = this->originalTexture(); 160 GrTexture* texture = this->originalTexture();
139 GrContext* context = texture->getContext(); 161 GrContext* context = texture->getContext();
140 CopyParams copyParams; 162 CopyParams copyParams;
141 const SkIRect* contentArea = this->contentAreaOrNull(); 163 const SkIRect* contentArea = this->contentAreaOrNull();
142 164
143 if (contentArea && GrTextureParams::kMipMap_FilterMode == params.filterMode( )) { 165 if (contentArea && GrTextureParams::kMipMap_FilterMode == params.filterMode( )) {
144 // If we generate a MIP chain for texture it will read pixel values from outside the content 166 // If we generate a MIP chain for texture it will read pixel values from outside the content
145 // area. 167 // area.
146 copyParams.fWidth = contentArea->width(); 168 copyParams.fWidth = contentArea->width();
147 copyParams.fHeight = contentArea->height(); 169 copyParams.fHeight = contentArea->height();
148 copyParams.fFilter = GrTextureParams::kBilerp_FilterMode; 170 copyParams.fFilter = GrTextureParams::kBilerp_FilterMode;
149 } else if (!context->getGpu()->makeCopyForTextureParams(texture->width(), te xture->height(), 171 } else if (!context->getGpu()->makeCopyForTextureParams(texture, params, &co pyParams)) {
150 params, &copyParams) ) {
151 if (outOffset) { 172 if (outOffset) {
152 if (contentArea) { 173 if (contentArea) {
153 outOffset->set(contentArea->fLeft, contentArea->fRight); 174 outOffset->set(contentArea->fLeft, contentArea->fRight);
154 } else { 175 } else {
155 outOffset->set(0, 0); 176 outOffset->set(0, 0);
156 } 177 }
157 } 178 }
158 return SkRef(texture); 179 return SkRef(texture);
159 } 180 }
160 GrUniqueKey key; 181
161 this->makeCopyKey(copyParams, &key); 182 GrTexture* copy = this->refCopy(copyParams);
162 if (key.isValid()) { 183 if (copy && outOffset) {
163 GrTexture* result = context->textureProvider()->findAndRefTextureByUniqu eKey(key); 184 outOffset->set(0, 0);
164 if (result) {
165 return result;
166 }
167 } 185 }
168 GrTexture* result = copy_on_gpu(texture, contentArea, copyParams); 186 return copy;
169 if (result) {
170 if (key.isValid()) {
171 result->resourcePriv().setUniqueKey(key);
172 this->didCacheCopy(key);
173 }
174 if (outOffset) {
175 outOffset->set(0, 0);
176 }
177 }
178 return result;
179 } 187 }
180 188
181 enum DomainMode { 189 enum DomainMode {
182 kNoDomain_DomainMode, 190 kNoDomain_DomainMode,
183 kDomain_DomainMode, 191 kDomain_DomainMode,
184 kTightCopy_DomainMode 192 kTightCopy_DomainMode
185 }; 193 };
186 194
187 /** Determines whether a texture domain is necessary and if so what domain to us e. There are two 195 /** Determines whether a texture domain is necessary and if so what domain to us e. There are two
188 * rectangles to consider: 196 * rectangles to consider:
(...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after
345 *filterOrNullForBicubic); 353 *filterOrNullForBicubic);
346 } else { 354 } else {
347 GrTextureParams params(SkShader::kClamp_TileMode, *filterOrNullForBi cubic); 355 GrTextureParams params(SkShader::kClamp_TileMode, *filterOrNullForBi cubic);
348 return GrSimpleTextureEffect::Create(texture, textureMatrix, params) ; 356 return GrSimpleTextureEffect::Create(texture, textureMatrix, params) ;
349 } 357 }
350 } else { 358 } else {
351 if (kDomain_DomainMode == domainMode) { 359 if (kDomain_DomainMode == domainMode) {
352 return GrBicubicEffect::Create(texture, textureMatrix, domain); 360 return GrBicubicEffect::Create(texture, textureMatrix, domain);
353 } else { 361 } else {
354 static const SkShader::TileMode kClampClamp[] = 362 static const SkShader::TileMode kClampClamp[] =
355 { SkShader::kClamp_TileMode, SkShader::kClamp_TileMode }; 363 { SkShader::kClamp_TileMode, SkShader::kClamp_TileMode };
356 return GrBicubicEffect::Create(texture, textureMatrix, kClampClamp); 364 return GrBicubicEffect::Create(texture, textureMatrix, kClampClamp);
357 } 365 }
358 } 366 }
359 } 367 }
360 368
361 const GrFragmentProcessor* GrTextureAdjuster::createFragmentProcessor( 369 const GrFragmentProcessor* GrTextureAdjuster::createFragmentProcessor(
362 const SkMatrix& origTextureMatrix, 370 const SkMatrix& origTextureMatrix,
363 const SkRect& origConstraintRect, 371 const SkRect& origConstraintRect,
364 FilterConstraint filterConstraint, 372 FilterConstraint filterConstraint,
365 bool coordsLimitedToConstraintRect, 373 bool coordsLimitedToConstraintRect,
366 const GrTextureParams::FilterMode* filte rOrNullForBicubic) { 374 const GrTextureParams::FilterMode* filte rOrNullForBicubic) {
367 375
368 SkMatrix textureMatrix = origTextureMatrix; 376 SkMatrix textureMatrix = origTextureMatrix;
369 const SkIRect* contentArea = this->contentAreaOrNull(); 377 const SkIRect* contentArea = this->contentAreaOrNull();
370 // Convert the constraintRect to be relative to the texture rather than the content area so 378 // Convert the constraintRect to be relative to the texture rather than the content area so
371 // that both rects are in the same coordinate system. 379 // that both rects are in the same coordinate system.
372 SkTCopyOnFirstWrite<SkRect> constraintRect(origConstraintRect); 380 SkTCopyOnFirstWrite<SkRect> constraintRect(origConstraintRect);
373 if (contentArea) { 381 if (contentArea) {
374 SkScalar l = SkIntToScalar(contentArea->fLeft); 382 SkScalar l = SkIntToScalar(contentArea->fLeft);
375 SkScalar t = SkIntToScalar(contentArea->fTop); 383 SkScalar t = SkIntToScalar(contentArea->fTop);
376 constraintRect.writable()->offset(l, t); 384 constraintRect.writable()->offset(l, t);
377 textureMatrix.postTranslate(l, t); 385 textureMatrix.postTranslate(l, t);
378 } 386 }
379 387
380 SkRect domain; 388 SkRect domain;
381 GrTexture* texture = this->originalTexture(); 389 GrTextureParams params;
390 if (filterOrNullForBicubic) {
391 params.setFilterMode(*filterOrNullForBicubic);
392 }
393 SkAutoTUnref<GrTexture> texture(this->refTextureSafeForParams(params, nullpt r));
394 if (!texture) {
395 return nullptr;
396 }
397 // If we made a copy then we only copied the contentArea, in which case the new texture is all
398 // content.
399 if (texture != this->originalTexture()) {
400 contentArea = nullptr;
401 }
402
382 DomainMode domainMode = 403 DomainMode domainMode =
383 determine_domain_mode(*constraintRect, filterConstraint, coordsLimitedTo ConstraintRect, 404 determine_domain_mode(*constraintRect, filterConstraint, coordsLimitedTo ConstraintRect,
384 texture->width(), texture->height(), 405 texture->width(), texture->height(),
385 contentArea, filterOrNullForBicubic, 406 contentArea, filterOrNullForBicubic,
386 &domain); 407 &domain);
387 if (kTightCopy_DomainMode == domainMode) { 408 if (kTightCopy_DomainMode == domainMode) {
388 // TODO: Copy the texture and adjust the texture matrix (both parts need to consider 409 // TODO: Copy the texture and adjust the texture matrix (both parts need to consider
389 // non-int constraint rect) 410 // non-int constraint rect)
390 // For now: treat as bilerp and ignore what goes on above level 0. 411 // For now: treat as bilerp and ignore what goes on above level 0.
391 412
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after
477 filterOrNullForBicubic); 498 filterOrNullForBicubic);
478 } 499 }
479 500
480 GrTexture* GrTextureMaker::generateTextureForParams(const CopyParams& copyParams ) { 501 GrTexture* GrTextureMaker::generateTextureForParams(const CopyParams& copyParams ) {
481 SkAutoTUnref<GrTexture> original(this->refOriginalTexture()); 502 SkAutoTUnref<GrTexture> original(this->refOriginalTexture());
482 if (!original) { 503 if (!original) {
483 return nullptr; 504 return nullptr;
484 } 505 }
485 return copy_on_gpu(original, nullptr, copyParams); 506 return copy_on_gpu(original, nullptr, copyParams);
486 } 507 }
OLDNEW
« no previous file with comments | « src/gpu/GrTextureParamsAdjuster.h ('k') | src/gpu/gl/GrGLCaps.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698