Towards removing getTexture() on SkImage

Review URL: https://codereview.chromium.org/1166993002
This commit is contained in:
bsalomon 2015-06-10 08:49:28 -07:00 committed by Commit bot
parent 519580553a
commit 55812362f1
10 changed files with 68 additions and 25 deletions

View File

@ -27,6 +27,7 @@
'../include/utils/unix', '../include/utils/unix',
'../include/utils/win', '../include/utils/win',
'../src/core', '../src/core',
'../src/image',
'../src/opts', '../src/opts',
'../src/utils', '../src/utils',
], ],

View File

@ -97,13 +97,6 @@ public:
uint32_t uniqueID() const { return fUniqueID; } uint32_t uniqueID() const { return fUniqueID; }
virtual bool isOpaque() const { return false; } virtual bool isOpaque() const { return false; }
/**
* Return the GrTexture that stores the image pixels. Calling getTexture
* does not affect the reference count of the GrTexture object.
* Will return NULL if the image does not use a texture.
*/
GrTexture* getTexture() const;
virtual SkShader* newShader(SkShader::TileMode, virtual SkShader* newShader(SkShader::TileMode,
SkShader::TileMode, SkShader::TileMode,
const SkMatrix* localMatrix = NULL) const; const SkMatrix* localMatrix = NULL) const;
@ -119,6 +112,21 @@ public:
*/ */
const void* peekPixels(SkImageInfo* info, size_t* rowBytes) const; const void* peekPixels(SkImageInfo* info, size_t* rowBytes) const;
// DEPRECATED
GrTexture* getTexture() const;
/**
* Returns true if the image is texture backed.
*/
bool isTextureBacked() const;
/**
* Retrieves the backend API handle of the texture. If flushPendingGrContextReads then the
* GrContext will issue to the backend API any deferred read operations on the texture before
* returning.
*/
GrBackendObject getTextureHandle(bool flushPendingGrContextReads) const;
/** /**
* Copy the pixels from the image into the specified buffer (pixels + rowBytes), * Copy the pixels from the image into the specified buffer (pixels + rowBytes),
* converting them into the requested format (dstInfo). The image pixels are read * converting them into the requested format (dstInfo). The image pixels are read

View File

@ -1474,7 +1474,7 @@ bool SkGpuDevice::filterImage(const SkImageFilter* filter, const SkBitmap& src,
} }
static bool wrap_as_bm(const SkImage* image, SkBitmap* bm) { static bool wrap_as_bm(const SkImage* image, SkBitmap* bm) {
GrTexture* tex = image->getTexture(); GrTexture* tex = as_IB(image)->getTexture();
if (tex) { if (tex) {
GrWrapTextureInBitmap(tex, image->width(), image->height(), image->isOpaque(), bm); GrWrapTextureInBitmap(tex, image->width(), image->height(), image->isOpaque(), bm);
return true; return true;

View File

@ -13,6 +13,10 @@
#include "SkReadPixelsRec.h" #include "SkReadPixelsRec.h"
#include "SkString.h" #include "SkString.h"
#include "SkSurface.h" #include "SkSurface.h"
#if SK_SUPPORT_GPU
#include "GrTexture.h"
#include "GrContext.h"
#endif
uint32_t SkImage::NextUniqueID() { uint32_t SkImage::NextUniqueID() {
static int32_t gUniqueID; static int32_t gUniqueID;
@ -46,10 +50,6 @@ bool SkImage::readPixels(const SkImageInfo& dstInfo, void* dstPixels, size_t dst
return as_IB(this)->onReadPixels(rec.fInfo, rec.fPixels, rec.fRowBytes, rec.fX, rec.fY); return as_IB(this)->onReadPixels(rec.fInfo, rec.fPixels, rec.fRowBytes, rec.fX, rec.fY);
} }
GrTexture* SkImage::getTexture() const {
return as_IB(this)->onGetTexture();
}
SkShader* SkImage::newShader(SkShader::TileMode tileX, SkShader* SkImage::newShader(SkShader::TileMode tileX,
SkShader::TileMode tileY, SkShader::TileMode tileY,
const SkMatrix* localMatrix) const { const SkMatrix* localMatrix) const {
@ -109,6 +109,38 @@ SkImage* SkImage::newImage(int newWidth, int newHeight, const SkIRect* subset,
return as_IB(this)->onNewImage(newWidth, newHeight, subset, quality); return as_IB(this)->onNewImage(newWidth, newHeight, subset, quality);
} }
#if SK_SUPPORT_GPU
GrTexture* SkImage::getTexture() const {
return as_IB(this)->getTexture();
}
bool SkImage::isTextureBacked() const { return SkToBool(as_IB(this)->getTexture()); }
GrBackendObject SkImage::getTextureHandle(bool flushPendingGrContextReads) const {
GrTexture* texture = as_IB(this)->getTexture();
if (texture) {
GrContext* context = texture->getContext();
if (context) {
if (flushPendingGrContextReads) {
context->prepareSurfaceForExternalRead(texture);
}
}
return texture->getTextureHandle();
}
return 0;
}
#else
GrTexture* SkImage::getTexture() const { return NULL; }
bool SkImage::isTextureBacked() const { return false; }
GrBackendObject SkImage::getTextureHandle(bool flushPendingGrContextReads) const { return 0; }
#endif
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
static bool raster_canvas_supports(const SkImageInfo& info) { static bool raster_canvas_supports(const SkImageInfo& info) {

View File

@ -46,7 +46,7 @@ public:
virtual bool onReadPixels(const SkImageInfo& dstInfo, void* dstPixels, size_t dstRowBytes, virtual bool onReadPixels(const SkImageInfo& dstInfo, void* dstPixels, size_t dstRowBytes,
int srcX, int srcY) const; int srcX, int srcY) const;
virtual GrTexture* onGetTexture() const { return NULL; } virtual GrTexture* getTexture() const { return NULL; }
// return a read-only copy of the pixels. We promise to not modify them, // return a read-only copy of the pixels. We promise to not modify them,
// but only inspect them (or encode them). // but only inspect them (or encode them).

View File

@ -36,7 +36,7 @@ SkSurface* SkImage_Gpu::onNewSurface(const SkImageInfo& info, const SkSurfacePro
} }
extern void SkTextureImageApplyBudgetedDecision(SkImage* image) { extern void SkTextureImageApplyBudgetedDecision(SkImage* image) {
if (image->getTexture()) { if (as_IB(image)->getTexture()) {
((SkImage_Gpu*)image)->applyBudgetDecision(); ((SkImage_Gpu*)image)->applyBudgetDecision();
} }
} }

View File

@ -37,7 +37,7 @@ public:
} }
bool getROPixels(SkBitmap*) const override; bool getROPixels(SkBitmap*) const override;
GrTexture* onGetTexture() const override { return fTexture; } GrTexture* getTexture() const override { return fTexture; }
SkShader* onNewShader(SkShader::TileMode, SkShader* onNewShader(SkShader::TileMode,
SkShader::TileMode, SkShader::TileMode,
const SkMatrix* localMatrix) const override; const SkMatrix* localMatrix) const override;

View File

@ -69,7 +69,7 @@ void SkSurface_Gpu::onCopyOnWrite(ContentChangeMode mode) {
// image because onCopyOnWrite is only called when there is a cached image. // image because onCopyOnWrite is only called when there is a cached image.
SkImage* image = this->getCachedImage(kNo_Budgeted); SkImage* image = this->getCachedImage(kNo_Budgeted);
SkASSERT(image); SkASSERT(image);
if (rt->asTexture() == image->getTexture()) { if (rt->asTexture() == as_IB(image)->getTexture()) {
this->fDevice->replaceRenderTarget(SkSurface::kRetain_ContentChangeMode == mode); this->fDevice->replaceRenderTarget(SkSurface::kRetain_ContentChangeMode == mode);
SkTextureImageApplyBudgetedDecision(image); SkTextureImageApplyBudgetedDecision(image);
} else if (kDiscard_ContentChangeMode == mode) { } else if (kDiscard_ContentChangeMode == mode) {

View File

@ -13,6 +13,7 @@
#include "SkColorFilter.h" #include "SkColorFilter.h"
#include "SkDrawFilter.h" #include "SkDrawFilter.h"
#include "SkGPipe.h" #include "SkGPipe.h"
#include "SkImage_Base.h"
#include "SkPaint.h" #include "SkPaint.h"
#include "SkPaintPriv.h" #include "SkPaintPriv.h"
#include "SkRRect.h" #include "SkRRect.h"
@ -43,7 +44,7 @@ static uint64_t image_area(const SkImage* image) {
// mutable for now (at least for the purposes of deferred canvas) // mutable for now (at least for the purposes of deferred canvas)
// //
static bool should_draw_gpu_image_immediately(const SkImage* image) { static bool should_draw_gpu_image_immediately(const SkImage* image) {
return image->getTexture() != NULL; return as_IB(image)->getTexture() != NULL;
} }
static bool should_draw_immediately(const SkBitmap* bitmap, const SkImage* image, static bool should_draw_immediately(const SkBitmap* bitmap, const SkImage* image,

View File

@ -9,6 +9,7 @@
#include "SkData.h" #include "SkData.h"
#include "SkDevice.h" #include "SkDevice.h"
#include "SkImageEncoder.h" #include "SkImageEncoder.h"
#include "SkImage_Base.h"
#include "SkRRect.h" #include "SkRRect.h"
#include "SkSurface.h" #include "SkSurface.h"
#include "SkUtils.h" #include "SkUtils.h"
@ -528,13 +529,13 @@ static void Test_crbug263329(skiatest::Reporter* reporter,
// be recycling a texture that is held by an existing image. // be recycling a texture that is held by an existing image.
canvas2->clear(5); canvas2->clear(5);
SkAutoTUnref<SkImage> image4(surface2->newImageSnapshot()); SkAutoTUnref<SkImage> image4(surface2->newImageSnapshot());
REPORTER_ASSERT(reporter, image4->getTexture() != image3->getTexture()); REPORTER_ASSERT(reporter, as_IB(image4)->getTexture() != as_IB(image3)->getTexture());
// The following assertion checks crbug.com/263329 // The following assertion checks crbug.com/263329
REPORTER_ASSERT(reporter, image4->getTexture() != image2->getTexture()); REPORTER_ASSERT(reporter, as_IB(image4)->getTexture() != as_IB(image2)->getTexture());
REPORTER_ASSERT(reporter, image4->getTexture() != image1->getTexture()); REPORTER_ASSERT(reporter, as_IB(image4)->getTexture() != as_IB(image1)->getTexture());
REPORTER_ASSERT(reporter, image3->getTexture() != image2->getTexture()); REPORTER_ASSERT(reporter, as_IB(image3)->getTexture() != as_IB(image2)->getTexture());
REPORTER_ASSERT(reporter, image3->getTexture() != image1->getTexture()); REPORTER_ASSERT(reporter, as_IB(image3)->getTexture() != as_IB(image1)->getTexture());
REPORTER_ASSERT(reporter, image2->getTexture() != image1->getTexture()); REPORTER_ASSERT(reporter, as_IB(image2)->getTexture() != as_IB(image1)->getTexture());
} }
static void TestGetTexture(skiatest::Reporter* reporter, static void TestGetTexture(skiatest::Reporter* reporter,
@ -542,7 +543,7 @@ static void TestGetTexture(skiatest::Reporter* reporter,
GrContext* context) { GrContext* context) {
SkAutoTUnref<SkSurface> surface(createSurface(surfaceType, context)); SkAutoTUnref<SkSurface> surface(createSurface(surfaceType, context));
SkAutoTUnref<SkImage> image(surface->newImageSnapshot()); SkAutoTUnref<SkImage> image(surface->newImageSnapshot());
GrTexture* texture = image->getTexture(); GrTexture* texture = as_IB(image)->getTexture();
if (surfaceType == kGpu_SurfaceType || surfaceType == kGpuScratch_SurfaceType) { if (surfaceType == kGpu_SurfaceType || surfaceType == kGpuScratch_SurfaceType) {
REPORTER_ASSERT(reporter, texture); REPORTER_ASSERT(reporter, texture);
REPORTER_ASSERT(reporter, 0 != texture->getTextureHandle()); REPORTER_ASSERT(reporter, 0 != texture->getTextureHandle());
@ -550,7 +551,7 @@ static void TestGetTexture(skiatest::Reporter* reporter,
REPORTER_ASSERT(reporter, NULL == texture); REPORTER_ASSERT(reporter, NULL == texture);
} }
surface->notifyContentWillChange(SkSurface::kDiscard_ContentChangeMode); surface->notifyContentWillChange(SkSurface::kDiscard_ContentChangeMode);
REPORTER_ASSERT(reporter, image->getTexture() == texture); REPORTER_ASSERT(reporter, as_IB(image)->getTexture() == texture);
} }
#include "GrGpuResourcePriv.h" #include "GrGpuResourcePriv.h"