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

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

Issue 1249543003: Creating functions for uploading a mipmapped texture. (Closed) Base URL: https://chromium.googlesource.com/skia.git@master
Patch Set: Removing the concept of a dirty mipmap. It is expected that the texture upload provides the mipmaps. Created 5 years, 3 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 /* 2 /*
3 * Copyright 2011 Google Inc. 3 * Copyright 2011 Google Inc.
4 * 4 *
5 * Use of this source code is governed by a BSD-style license that can be 5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file. 6 * found in the LICENSE file.
7 */ 7 */
8 8
9 #include "GrContext.h" 9 #include "GrContext.h"
10 10
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
98 fDrawTarget->reset(); 98 fDrawTarget->reset();
99 } 99 }
100 } 100 }
101 101
102 void GrContext::DrawingMgr::flush() { 102 void GrContext::DrawingMgr::flush() {
103 if (fDrawTarget) { 103 if (fDrawTarget) {
104 fDrawTarget->flush(); 104 fDrawTarget->flush();
105 } 105 }
106 } 106 }
107 107
108 GrDrawContext* GrContext::DrawingMgr::drawContext(const SkSurfaceProps* surfaceP rops) { 108 GrDrawContext* GrContext::DrawingMgr::drawContext(const SkSurfaceProps* surfaceP rops) {
109 if (this->abandoned()) { 109 if (this->abandoned()) {
110 return nullptr; 110 return nullptr;
111 } 111 }
112 112
113 const SkSurfaceProps props(SkSurfacePropsCopyOrDefault(surfaceProps)); 113 const SkSurfaceProps props(SkSurfacePropsCopyOrDefault(surfaceProps));
114 114
115 SkASSERT(props.pixelGeometry() < kNumPixelGeometries); 115 SkASSERT(props.pixelGeometry() < kNumPixelGeometries);
116 if (!fDrawContext[props.pixelGeometry()][props.isUseDeviceIndependentFonts() ]) { 116 if (!fDrawContext[props.pixelGeometry()][props.isUseDeviceIndependentFonts() ]) {
117 fDrawContext[props.pixelGeometry()][props.isUseDeviceIndependentFonts()] = 117 fDrawContext[props.pixelGeometry()][props.isUseDeviceIndependentFonts()] =
118 new GrDrawContext(fContext, fDrawTarget, props); 118 new GrDrawContext(fContext, fDrawTarget, props);
(...skipping 194 matching lines...) Expand 10 before | Expand all | Expand 10 after
313 dstPI.fColorType = srcPI.fColorType; 313 dstPI.fColorType = srcPI.fColorType;
314 dstPI.fAlphaType = kPremul_SkAlphaType; 314 dstPI.fAlphaType = kPremul_SkAlphaType;
315 dstPI.fPixels = outPixels; 315 dstPI.fPixels = outPixels;
316 dstPI.fRowBytes = outRowBytes; 316 dstPI.fRowBytes = outRowBytes;
317 317
318 return srcPI.convertPixelsTo(&dstPI, width, height); 318 return srcPI.convertPixelsTo(&dstPI, width, height);
319 } 319 }
320 320
321 bool GrContext::writeSurfacePixels(GrSurface* surface, 321 bool GrContext::writeSurfacePixels(GrSurface* surface,
322 int left, int top, int width, int height, 322 int left, int top, int width, int height,
323 GrPixelConfig srcConfig, const void* buffer, size_t rowBytes, 323 GrPixelConfig srcConfig, const SkTArray<SkMip MapLevel>& texels,
324 uint32_t pixelOpsFlags) { 324 uint32_t pixelOpsFlags) {
325 RETURN_FALSE_IF_ABANDONED 325 RETURN_FALSE_IF_ABANDONED
326 ASSERT_OWNED_RESOURCE(surface); 326 ASSERT_OWNED_RESOURCE(surface);
327 SkASSERT(surface); 327 SkASSERT(surface);
328 328
329 SkTArray<SkMipMapLevel> texelsCopy(texels);
bsalomon 2015/09/15 13:14:11 Why do we need to copy the mip array?
cblume 2015/09/16 18:40:46 Further down there is a call to GrSurfacePriv::Adj
330
329 this->testPMConversionsIfNecessary(pixelOpsFlags); 331 this->testPMConversionsIfNecessary(pixelOpsFlags);
330 332
331 // Trim the params here so that if we wind up making a temporary surface it can be as small as 333 // Trim the params here so that if we wind up making a temporary surface it can be as small as
332 // necessary and because GrGpu::getWritePixelsInfo requires it. 334 // necessary and because GrGpu::getWritePixelsInfo requires it.
333 if (!GrSurfacePriv::AdjustWritePixelParams(surface->width(), surface->height (), 335 auto currentMipHeight = height;
334 GrBytesPerPixel(srcConfig), &left , &top, &width, 336 auto currentMipWidth = width;
335 &height, &buffer, &rowBytes)) { 337 for (auto currentMipLevel = texelsCopy.count() - 1; currentMipLevel >= 0; cu rrentMipLevel--) {
336 return false; 338 auto& currentMipMap = texelsCopy[currentMipLevel];
339 if (!GrSurfacePriv::AdjustWritePixelParams(surface->width(), surface->he ight(),
340 GrBytesPerPixel(srcConfig), & left, &top,
341 &currentMipWidth, &currentMip Height,
342 &currentMipMap.fTexels,
343 &currentMipMap.fRowBytes)) {
344 return false;
345 }
346 currentMipHeight /= 2;
347 currentMipWidth /= 2;
337 } 348 }
338 349
339 bool applyPremulToSrc = false; 350 bool applyPremulToSrc = false;
340 if (kUnpremul_PixelOpsFlag & pixelOpsFlags) { 351 if (kUnpremul_PixelOpsFlag & pixelOpsFlags) {
341 if (!GrPixelConfigIs8888(srcConfig)) { 352 if (!GrPixelConfigIs8888(srcConfig)) {
342 return false; 353 return false;
343 } 354 }
344 applyPremulToSrc = true; 355 applyPremulToSrc = true;
345 } 356 }
346 357
347 GrGpu::DrawPreference drawPreference = GrGpu::kNoDraw_DrawPreference; 358 GrGpu::DrawPreference drawPreference = GrGpu::kNoDraw_DrawPreference;
348 // Don't prefer to draw for the conversion (and thereby access a texture fro m the cache) when 359 // Don't prefer to draw for the conversion (and thereby access a texture fro m the cache) when
349 // we've already determined that there isn't a roundtrip preserving conversi on processor pair. 360 // we've already determined that there isn't a roundtrip preserving conversi on processor pair.
350 if (applyPremulToSrc && !this->didFailPMUPMConversionTest()) { 361 if (applyPremulToSrc && !this->didFailPMUPMConversionTest()) {
351 drawPreference = GrGpu::kCallerPrefersDraw_DrawPreference; 362 drawPreference = GrGpu::kCallerPrefersDraw_DrawPreference;
352 } 363 }
353 364
354 GrGpu::WritePixelTempDrawInfo tempDrawInfo; 365 GrGpu::WritePixelTempDrawInfo tempDrawInfo;
355 if (!fGpu->getWritePixelsInfo(surface, width, height, rowBytes, srcConfig, & drawPreference, 366 if (!fGpu->getWritePixelsInfo(surface, width, height, srcConfig, &drawPrefer ence,
356 &tempDrawInfo)) { 367 &tempDrawInfo)) {
357 return false; 368 return false;
358 } 369 }
359 370
360 if (!(kDontFlush_PixelOpsFlag & pixelOpsFlags) && surface->surfacePriv().has PendingIO()) { 371 if (!(kDontFlush_PixelOpsFlag & pixelOpsFlags) && surface->surfacePriv().has PendingIO()) {
361 this->flush(); 372 this->flush();
362 } 373 }
363 374
364 SkAutoTUnref<GrTexture> tempTexture; 375 SkAutoTUnref<GrTexture> tempTexture;
365 if (GrGpu::kNoDraw_DrawPreference != drawPreference) { 376 if (GrGpu::kNoDraw_DrawPreference != drawPreference) {
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
397 if (!fp) { 408 if (!fp) {
398 return false; 409 return false;
399 } 410 }
400 } 411 }
401 GrRenderTarget* renderTarget = surface->asRenderTarget(); 412 GrRenderTarget* renderTarget = surface->asRenderTarget();
402 SkASSERT(renderTarget); 413 SkASSERT(renderTarget);
403 if (tempTexture->surfacePriv().hasPendingIO()) { 414 if (tempTexture->surfacePriv().hasPendingIO()) {
404 this->flush(); 415 this->flush();
405 } 416 }
406 if (applyPremulToSrc) { 417 if (applyPremulToSrc) {
407 size_t tmpRowBytes = 4 * width; 418 auto currentWidth = width;
408 tmpPixels.reset(width * height); 419 auto currentHeight = height;
409 if (!sw_convert_to_premul(srcConfig, width, height, rowBytes, bu ffer, tmpRowBytes, 420 for (auto currentMipLevel = texelsCopy.count() - 1; currentMipLe vel >= 0; currentMipLevel--) {
410 tmpPixels.get())) { 421 size_t tmpRowBytes = 4 * currentWidth;
411 return false; 422 tmpPixels.reset(currentWidth * currentHeight);
423 auto& currentMipMap = texelsCopy[currentMipLevel];
424 if (!sw_convert_to_premul(srcConfig, currentWidth, currentHe ight,
425 currentMipMap.fRowBytes,
426 currentMipMap.fTexels, tmpRowBytes ,
427 tmpPixels.get())) {
428 return false;
429 }
430 currentMipMap.fRowBytes = tmpRowBytes;
431 currentMipMap.fTexels = tmpPixels.get();
432 currentWidth /= 2;
433 currentHeight /= 2;
412 } 434 }
413 rowBytes = tmpRowBytes;
414 buffer = tmpPixels.get();
415 applyPremulToSrc = false; 435 applyPremulToSrc = false;
416 } 436 }
417 if (!fGpu->writePixels(tempTexture, 0, 0, width, height, 437 if (!fGpu->writePixels(tempTexture, 0, 0, width, height,
418 tempDrawInfo.fTempSurfaceDesc.fConfig, buffer , 438 tempDrawInfo.fTempSurfaceDesc.fConfig, texels Copy)) {
419 rowBytes)) {
420 return false; 439 return false;
421 } 440 }
422 SkMatrix matrix; 441 SkMatrix matrix;
423 matrix.setTranslate(SkIntToScalar(left), SkIntToScalar(top)); 442 matrix.setTranslate(SkIntToScalar(left), SkIntToScalar(top));
424 SkAutoTUnref<GrDrawContext> drawContext(this->drawContext()); 443 SkAutoTUnref<GrDrawContext> drawContext(this->drawContext());
425 if (!drawContext) { 444 if (!drawContext) {
426 return false; 445 return false;
427 } 446 }
428 paint.addColorFragmentProcessor(fp); 447 paint.addColorFragmentProcessor(fp);
429 SkRect rect = SkRect::MakeWH(SkIntToScalar(width), SkIntToScalar(hei ght)); 448 SkRect rect = SkRect::MakeWH(SkIntToScalar(width), SkIntToScalar(hei ght));
430 drawContext->drawRect(renderTarget, GrClip::WideOpen(), paint, matri x, rect, nullptr); 449 drawContext->drawRect(renderTarget, GrClip::WideOpen(), paint, matri x, rect, nullptr);
431 450
432 if (kFlushWrites_PixelOp & pixelOpsFlags) { 451 if (kFlushWrites_PixelOp & pixelOpsFlags) {
433 this->flushSurfaceWrites(surface); 452 this->flushSurfaceWrites(surface);
434 } 453 }
435 } 454 }
436 } 455 }
437 if (!tempTexture) { 456 if (!tempTexture) {
438 if (applyPremulToSrc) { 457 if (applyPremulToSrc) {
439 size_t tmpRowBytes = 4 * width; 458 auto currentWidth = width;
440 tmpPixels.reset(width * height); 459 auto currentHeight = height;
441 if (!sw_convert_to_premul(srcConfig, width, height, rowBytes, buffer , tmpRowBytes, 460 for (auto currentMipLevel = texelsCopy.count() - 1; currentMipLevel >= 0; currentMipLevel--) {
442 tmpPixels.get())) { 461 size_t tmpRowBytes = 4 * currentWidth;
443 return false; 462 tmpPixels.reset(currentWidth * currentHeight);
463 auto& currentMipMap = texelsCopy[currentMipLevel];
464 if (!sw_convert_to_premul(srcConfig, currentWidth, currentHeight ,
465 currentMipMap.fRowBytes, currentMipMap .fTexels,
466 tmpRowBytes, tmpPixels.get())) {
467 return false;
468 }
469 currentMipMap.fRowBytes = tmpRowBytes;
470 currentMipMap.fTexels = tmpPixels.get();
471 currentWidth /= 2;
472 currentHeight /= 2;
444 } 473 }
445 rowBytes = tmpRowBytes;
446 buffer = tmpPixels.get();
447 applyPremulToSrc = false; 474 applyPremulToSrc = false;
448 } 475 }
449 return fGpu->writePixels(surface, left, top, width, height, srcConfig, b uffer, rowBytes); 476 return fGpu->writePixels(surface, left, top, width, height, srcConfig, t exelsCopy);
450 } 477 }
451 return true; 478 return true;
452 } 479 }
453 480
481 bool GrContext::writeSurfacePixels(GrSurface* surface,
482 int left, int top, int width, int height,
483 GrPixelConfig srcConfig, const void* buffer, size_t rowBytes,
484 uint32_t pixelOpsFlags) {
485 SkMipMapLevel level(buffer, rowBytes);
486 const int mipLevelCount = 1;
487 SkTArray<SkMipMapLevel> texels(mipLevelCount);
488 texels.push_back(level);
489
490 return this->writeSurfacePixels(surface, left, top, width, height, srcConfig , texels,
491 pixelOpsFlags);
492 }
493
454 bool GrContext::readSurfacePixels(GrSurface* src, 494 bool GrContext::readSurfacePixels(GrSurface* src,
455 int left, int top, int width, int height, 495 int left, int top, int width, int height,
456 GrPixelConfig dstConfig, void* buffer, size_t rowBytes, 496 GrPixelConfig dstConfig, void* buffer, size_t rowBytes,
457 uint32_t flags) { 497 uint32_t flags) {
458 RETURN_FALSE_IF_ABANDONED 498 RETURN_FALSE_IF_ABANDONED
459 ASSERT_OWNED_RESOURCE(src); 499 ASSERT_OWNED_RESOURCE(src);
460 SkASSERT(src); 500 SkASSERT(src);
461 501
462 this->testPMConversionsIfNecessary(flags); 502 this->testPMConversionsIfNecessary(flags);
463 SkAutoMutexAcquire ama(fReadPixelsMutex); 503 SkAutoMutexAcquire ama(fReadPixelsMutex);
(...skipping 288 matching lines...) Expand 10 before | Expand all | Expand 10 after
752 } 792 }
753 if (maxTextureBytes) { 793 if (maxTextureBytes) {
754 *maxTextureBytes = fResourceCache->getMaxResourceBytes(); 794 *maxTextureBytes = fResourceCache->getMaxResourceBytes();
755 } 795 }
756 } 796 }
757 797
758 void GrContext::setResourceCacheLimits(int maxTextures, size_t maxTextureBytes) { 798 void GrContext::setResourceCacheLimits(int maxTextures, size_t maxTextureBytes) {
759 fResourceCache->setLimits(maxTextures, maxTextureBytes); 799 fResourceCache->setLimits(maxTextures, maxTextureBytes);
760 } 800 }
761 801
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698