Expand SkImage::getTextureHandle call
AFAICT cc/output/gl_renderer.cc only calls SkImage:getTexture to determine the origin of the backing GrTexture. What do y'all think of this CL as a means of removing that call to getTexture? One alternative would be to add a new entry point like: bool SkImage::getBackendTextureDesc(GrBackendTextureDesc* desc) const; which fills in the entire desc and returns whether the image is texture backed. Change-Id: Idd302c0a11d69ad08e0100bcf546b3bbaa7cf27e Reviewed-on: https://skia-review.googlesource.com/7788 Reviewed-by: Mike Reed <reed@google.com> Reviewed-by: Brian Salomon <bsalomon@google.com> Commit-Queue: Robert Phillips <robertphillips@google.com>
This commit is contained in:
parent
77b3f32936
commit
3390e15269
@ -223,8 +223,11 @@ public:
|
|||||||
* Retrieves the backend API handle of the texture. If flushPendingGrContextIO then the
|
* Retrieves the backend API handle of the texture. If flushPendingGrContextIO then the
|
||||||
* GrContext will issue to the backend API any deferred IO operations on the texture before
|
* GrContext will issue to the backend API any deferred IO operations on the texture before
|
||||||
* returning.
|
* returning.
|
||||||
|
* If 'origin' is supplied it will be filled in with the origin of the content drawn
|
||||||
|
* into the image.
|
||||||
*/
|
*/
|
||||||
GrBackendObject getTextureHandle(bool flushPendingGrContextIO) const;
|
GrBackendObject getTextureHandle(bool flushPendingGrContextIO,
|
||||||
|
GrSurfaceOrigin* origin = nullptr) const;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Hints to image calls where the system might cache computed intermediates (e.g. the results
|
* Hints to image calls where the system might cache computed intermediates (e.g. the results
|
||||||
|
@ -164,14 +164,16 @@ GrTexture* SkImage::getTexture() const {
|
|||||||
|
|
||||||
bool SkImage::isTextureBacked() const { return SkToBool(as_IB(this)->peekTexture()); }
|
bool SkImage::isTextureBacked() const { return SkToBool(as_IB(this)->peekTexture()); }
|
||||||
|
|
||||||
GrBackendObject SkImage::getTextureHandle(bool flushPendingGrContextIO) const {
|
GrBackendObject SkImage::getTextureHandle(bool flushPendingGrContextIO,
|
||||||
|
GrSurfaceOrigin* origin) const {
|
||||||
GrTexture* texture = as_IB(this)->peekTexture();
|
GrTexture* texture = as_IB(this)->peekTexture();
|
||||||
if (texture) {
|
if (texture) {
|
||||||
GrContext* context = texture->getContext();
|
GrContext* context = texture->getContext();
|
||||||
if (context) {
|
if (context && flushPendingGrContextIO) {
|
||||||
if (flushPendingGrContextIO) {
|
context->prepareSurfaceForExternalIO(texture);
|
||||||
context->prepareSurfaceForExternalIO(texture);
|
}
|
||||||
}
|
if (origin) {
|
||||||
|
*origin = texture->origin();
|
||||||
}
|
}
|
||||||
return texture->getTextureHandle();
|
return texture->getTextureHandle();
|
||||||
}
|
}
|
||||||
@ -184,7 +186,7 @@ GrTexture* SkImage::getTexture() const { return nullptr; }
|
|||||||
|
|
||||||
bool SkImage::isTextureBacked() const { return false; }
|
bool SkImage::isTextureBacked() const { return false; }
|
||||||
|
|
||||||
GrBackendObject SkImage::getTextureHandle(bool) const { return 0; }
|
GrBackendObject SkImage::getTextureHandle(bool, GrSurfaceOrigin*) const { return 0; }
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -199,17 +199,37 @@ DEF_GPUTEST_FOR_RENDERING_CONTEXTS(ImageFilterCache_ImageBackedGPU, reporter, ct
|
|||||||
}
|
}
|
||||||
|
|
||||||
GrBackendTextureDesc backendDesc;
|
GrBackendTextureDesc backendDesc;
|
||||||
backendDesc.fConfig = kRGBA_8888_GrPixelConfig;
|
|
||||||
backendDesc.fFlags = kNone_GrBackendTextureFlag;
|
backendDesc.fFlags = kNone_GrBackendTextureFlag;
|
||||||
|
backendDesc.fOrigin = kTopLeft_GrSurfaceOrigin;
|
||||||
|
backendDesc.fConfig = kRGBA_8888_GrPixelConfig;
|
||||||
backendDesc.fWidth = kFullSize;
|
backendDesc.fWidth = kFullSize;
|
||||||
backendDesc.fHeight = kFullSize;
|
backendDesc.fHeight = kFullSize;
|
||||||
backendDesc.fSampleCnt = 0;
|
backendDesc.fSampleCnt = 0;
|
||||||
backendDesc.fTextureHandle = srcTexture->getTextureHandle();
|
backendDesc.fTextureHandle = srcTexture->getTextureHandle();
|
||||||
sk_sp<SkImage> srcImage(SkImage::MakeFromTexture(ctxInfo.grContext(), backendDesc, kPremul_SkAlphaType));
|
sk_sp<SkImage> srcImage(SkImage::MakeFromTexture(ctxInfo.grContext(),
|
||||||
|
backendDesc,
|
||||||
|
kPremul_SkAlphaType));
|
||||||
if (!srcImage) {
|
if (!srcImage) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
GrSurfaceOrigin readBackOrigin;
|
||||||
|
GrBackendObject readBackHandle = srcImage->getTextureHandle(false, &readBackOrigin);
|
||||||
|
// TODO: Make it so we can check this (see skbug.com/5019)
|
||||||
|
#if 0
|
||||||
|
if (readBackHandle != backendDesc.fTextureHandle) {
|
||||||
|
ERRORF(reporter, "backend mismatch %d %d\n",
|
||||||
|
(int)readBackHandle, (int)backendDesc.fTextureHandle);
|
||||||
|
}
|
||||||
|
REPORTER_ASSERT(reporter, readBackHandle == backendDesc.fTextureHandle);
|
||||||
|
#else
|
||||||
|
REPORTER_ASSERT(reporter, SkToBool(readBackHandle));
|
||||||
|
#endif
|
||||||
|
if (readBackOrigin != backendDesc.fOrigin) {
|
||||||
|
ERRORF(reporter, "origin mismatch %d %d\n", readBackOrigin, backendDesc.fOrigin);
|
||||||
|
}
|
||||||
|
REPORTER_ASSERT(reporter, readBackOrigin == backendDesc.fOrigin);
|
||||||
|
|
||||||
test_image_backed(reporter, srcImage);
|
test_image_backed(reporter, srcImage);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -740,8 +740,9 @@ DEF_GPUTEST_FOR_GL_RENDERING_CONTEXTS(SkImage_NewFromTextureRelease, reporter, c
|
|||||||
const int kHeight = 10;
|
const int kHeight = 10;
|
||||||
std::unique_ptr<uint32_t[]> pixels(new uint32_t[kWidth * kHeight]);
|
std::unique_ptr<uint32_t[]> pixels(new uint32_t[kWidth * kHeight]);
|
||||||
GrBackendTextureDesc backendDesc;
|
GrBackendTextureDesc backendDesc;
|
||||||
backendDesc.fConfig = kRGBA_8888_GrPixelConfig;
|
|
||||||
backendDesc.fFlags = kRenderTarget_GrBackendTextureFlag;
|
backendDesc.fFlags = kRenderTarget_GrBackendTextureFlag;
|
||||||
|
backendDesc.fOrigin = kBottomLeft_GrSurfaceOrigin;
|
||||||
|
backendDesc.fConfig = kRGBA_8888_GrPixelConfig;
|
||||||
backendDesc.fWidth = kWidth;
|
backendDesc.fWidth = kWidth;
|
||||||
backendDesc.fHeight = kHeight;
|
backendDesc.fHeight = kHeight;
|
||||||
backendDesc.fSampleCnt = 0;
|
backendDesc.fSampleCnt = 0;
|
||||||
@ -753,6 +754,23 @@ DEF_GPUTEST_FOR_GL_RENDERING_CONTEXTS(SkImage_NewFromTextureRelease, reporter, c
|
|||||||
SkImage::MakeFromTexture(ctxInfo.grContext(), backendDesc, kPremul_SkAlphaType,
|
SkImage::MakeFromTexture(ctxInfo.grContext(), backendDesc, kPremul_SkAlphaType,
|
||||||
TextureReleaseChecker::Release, &releaseChecker));
|
TextureReleaseChecker::Release, &releaseChecker));
|
||||||
|
|
||||||
|
GrSurfaceOrigin readBackOrigin;
|
||||||
|
GrBackendObject readBackHandle = refImg->getTextureHandle(false, &readBackOrigin);
|
||||||
|
// TODO: Make it so we can check this (see skbug.com/5019)
|
||||||
|
#if 0
|
||||||
|
if (*readBackHandle != *(backendDesc.fTextureHandle)) {
|
||||||
|
ERRORF(reporter, "backend mismatch %d %d\n",
|
||||||
|
(int)readBackHandle, (int)backendDesc.fTextureHandle);
|
||||||
|
}
|
||||||
|
REPORTER_ASSERT(reporter, readBackHandle == backendDesc.fTextureHandle);
|
||||||
|
#else
|
||||||
|
REPORTER_ASSERT(reporter, SkToBool(readBackHandle));
|
||||||
|
#endif
|
||||||
|
if (readBackOrigin != backendDesc.fOrigin) {
|
||||||
|
ERRORF(reporter, "origin mismatch %d %d\n", readBackOrigin, backendDesc.fOrigin);
|
||||||
|
}
|
||||||
|
REPORTER_ASSERT(reporter, readBackOrigin == backendDesc.fOrigin);
|
||||||
|
|
||||||
// Now exercise the release proc
|
// Now exercise the release proc
|
||||||
REPORTER_ASSERT(reporter, 0 == releaseChecker.fReleaseCount);
|
REPORTER_ASSERT(reporter, 0 == releaseChecker.fReleaseCount);
|
||||||
refImg.reset(nullptr); // force a release of the image
|
refImg.reset(nullptr); // force a release of the image
|
||||||
|
Loading…
Reference in New Issue
Block a user