Add GrSurfaceProxyView to the various draw atlas ops.
Bug: skia:9556
Change-Id: I9eb825ab241fd0d0d4e63408af270a89e872d1c9
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/258802
Commit-Queue: Greg Daniel <egdaniel@google.com>
Reviewed-by: Michael Ludwig <michaelludwig@google.com>
diff --git a/src/gpu/effects/GrDistanceFieldGeoProc.cpp b/src/gpu/effects/GrDistanceFieldGeoProc.cpp
index 1122d0e..2ecbdce 100644
--- a/src/gpu/effects/GrDistanceFieldGeoProc.cpp
+++ b/src/gpu/effects/GrDistanceFieldGeoProc.cpp
@@ -209,8 +209,8 @@
///////////////////////////////////////////////////////////////////////////////
GrDistanceFieldA8TextGeoProc::GrDistanceFieldA8TextGeoProc(const GrShaderCaps& caps,
- const sk_sp<GrTextureProxy>* proxies,
- int numProxies,
+ const GrSurfaceProxyView* views,
+ int numViews,
const GrSamplerState& params,
#ifdef SK_GAMMA_APPLY_TO_A8
float distanceAdjust,
@@ -224,7 +224,7 @@
, fDistanceAdjust(distanceAdjust)
#endif
{
- SkASSERT(numProxies <= kMaxTextures);
+ SkASSERT(numViews <= kMaxTextures);
SkASSERT(!(flags & ~kNonLCD_DistanceFieldEffectMask));
if (flags & kPerspective_DistanceFieldEffectFlag) {
@@ -237,38 +237,38 @@
caps.integerSupport() ? kUShort2_GrSLType : kFloat2_GrSLType};
this->setVertexAttributes(&fInPosition, 3);
- if (numProxies) {
- fAtlasDimensions = proxies[0]->dimensions();
+ if (numViews) {
+ fAtlasDimensions = views[0].proxy()->dimensions();
}
- for (int i = 0; i < numProxies; ++i) {
- SkASSERT(proxies[i]);
- SkASSERT(proxies[i]->dimensions() == fAtlasDimensions);
- fTextureSamplers[i].reset(params, proxies[i]->backendFormat(),
- proxies[i]->textureSwizzle());
+ for (int i = 0; i < numViews; ++i) {
+ const GrSurfaceProxy* proxy = views[i].proxy();
+ SkASSERT(proxy);
+ SkASSERT(proxy->dimensions() == fAtlasDimensions);
+ fTextureSamplers[i].reset(params, proxy->backendFormat(), views[i].swizzle());
}
- this->setTextureSamplerCnt(numProxies);
+ this->setTextureSamplerCnt(numViews);
}
-void GrDistanceFieldA8TextGeoProc::addNewProxies(const sk_sp<GrTextureProxy>* proxies,
- int numProxies,
- const GrSamplerState& params) {
- SkASSERT(numProxies <= kMaxTextures);
+void GrDistanceFieldA8TextGeoProc::addNewViews(const GrSurfaceProxyView* views,
+ int numViews,
+ const GrSamplerState& params) {
+ SkASSERT(numViews <= kMaxTextures);
// Just to make sure we don't try to add too many proxies
- numProxies = SkTMin(numProxies, kMaxTextures);
+ numViews = SkTMin(numViews, kMaxTextures);
if (!fTextureSamplers[0].isInitialized()) {
- fAtlasDimensions = proxies[0]->dimensions();
+ fAtlasDimensions = views[0].proxy()->dimensions();
}
- for (int i = 0; i < numProxies; ++i) {
- SkASSERT(proxies[i]);
- SkASSERT(proxies[i]->dimensions() == fAtlasDimensions);
+ for (int i = 0; i < numViews; ++i) {
+ const GrSurfaceProxy* proxy = views[i].proxy();
+ SkASSERT(proxy);
+ SkASSERT(proxy->dimensions() == fAtlasDimensions);
if (!fTextureSamplers[i].isInitialized()) {
- fTextureSamplers[i].reset(params, proxies[i]->backendFormat(),
- proxies[i]->textureSwizzle());
+ fTextureSamplers[i].reset(params, proxy->backendFormat(), views[i].swizzle());
}
}
- this->setTextureSamplerCnt(numProxies);
+ this->setTextureSamplerCnt(numViews);
}
void GrDistanceFieldA8TextGeoProc::getGLSLProcessorKey(const GrShaderCaps& caps,
@@ -289,12 +289,7 @@
GrGeometryProcessor* GrDistanceFieldA8TextGeoProc::TestCreate(GrProcessorTestData* d) {
int texIdx = d->fRandom->nextBool() ? GrProcessorUnitTest::kSkiaPMTextureIdx
: GrProcessorUnitTest::kAlphaTextureIdx;
- sk_sp<GrTextureProxy> proxies[kMaxTextures] = {
- d->textureProxy(texIdx),
- nullptr,
- nullptr,
- nullptr
- };
+ sk_sp<GrTextureProxy> proxy = d->textureProxy(texIdx);
GrSamplerState::WrapMode wrapModes[2];
GrTest::TestWrapModes(d->fRandom, wrapModes);
@@ -311,8 +306,12 @@
#ifdef SK_GAMMA_APPLY_TO_A8
float lum = d->fRandom->nextF();
#endif
+ GrSurfaceOrigin origin = proxy->origin();
+ const GrSwizzle& swizzle = proxy->textureSwizzle();
+ GrSurfaceProxyView view(std::move(proxy), origin, swizzle);
+
return GrDistanceFieldA8TextGeoProc::Make(d->allocator(), *d->caps()->shaderCaps(),
- proxies, 1,
+ &view, 1,
samplerState,
#ifdef SK_GAMMA_APPLY_TO_A8
lum,
@@ -516,14 +515,14 @@
GrDistanceFieldPathGeoProc::GrDistanceFieldPathGeoProc(const GrShaderCaps& caps,
const SkMatrix& matrix,
bool wideColor,
- const sk_sp<GrTextureProxy>* proxies,
- int numProxies,
+ const GrSurfaceProxyView* views,
+ int numViews,
const GrSamplerState& params,
uint32_t flags)
: INHERITED(kGrDistanceFieldPathGeoProc_ClassID)
, fMatrix(matrix)
, fFlags(flags & kNonLCD_DistanceFieldEffectMask) {
- SkASSERT(numProxies <= kMaxTextures);
+ SkASSERT(numViews <= kMaxTextures);
SkASSERT(!(flags & ~kNonLCD_DistanceFieldEffectMask));
fInPosition = {"inPosition", kFloat2_GrVertexAttribType, kFloat2_GrSLType};
@@ -532,40 +531,39 @@
caps.integerSupport() ? kUShort2_GrSLType : kFloat2_GrSLType};
this->setVertexAttributes(&fInPosition, 3);
- if (numProxies) {
- fAtlasDimensions = proxies[0]->dimensions();
+ if (numViews) {
+ fAtlasDimensions = views[0].proxy()->dimensions();
}
- for (int i = 0; i < numProxies; ++i) {
- SkASSERT(proxies[i]);
- SkASSERT(proxies[i]->dimensions() == fAtlasDimensions);
- fTextureSamplers[i].reset(params, proxies[i]->backendFormat(),
- proxies[i]->textureSwizzle());
+ for (int i = 0; i < numViews; ++i) {
+ const GrSurfaceProxy* proxy = views[i].proxy();
+ SkASSERT(proxy);
+ SkASSERT(proxy->dimensions() == fAtlasDimensions);
+ fTextureSamplers[i].reset(params, proxy->backendFormat(), views[i].swizzle());
}
- this->setTextureSamplerCnt(numProxies);
+ this->setTextureSamplerCnt(numViews);
}
-void GrDistanceFieldPathGeoProc::addNewProxies(const sk_sp<GrTextureProxy>* proxies,
- int numProxies,
- const GrSamplerState& params) {
- SkASSERT(numProxies <= kMaxTextures);
+void GrDistanceFieldPathGeoProc::addNewViews(const GrSurfaceProxyView* views,
+ int numViews,
+ const GrSamplerState& params) {
+ SkASSERT(numViews <= kMaxTextures);
// Just to make sure we don't try to add too many proxies
- numProxies = SkTMin(numProxies, kMaxTextures);
+ numViews = SkTMin(numViews, kMaxTextures);
if (!fTextureSamplers[0].isInitialized()) {
- fAtlasDimensions = proxies[0]->dimensions();
+ fAtlasDimensions = views[0].proxy()->dimensions();
}
- for (int i = 0; i < numProxies; ++i) {
- SkASSERT(proxies[i]);
- SkASSERT(proxies[i]->dimensions() == fAtlasDimensions);
-
+ for (int i = 0; i < numViews; ++i) {
+ const GrSurfaceProxy* proxy = views[i].proxy();
+ SkASSERT(proxy);
+ SkASSERT(proxy->dimensions() == fAtlasDimensions);
if (!fTextureSamplers[i].isInitialized()) {
- fTextureSamplers[i].reset(params, proxies[i]->backendFormat(),
- proxies[i]->textureSwizzle());
+ fTextureSamplers[i].reset(params, proxy->backendFormat(), views[i].swizzle());
}
}
- this->setTextureSamplerCnt(numProxies);
+ this->setTextureSamplerCnt(numViews);
}
void GrDistanceFieldPathGeoProc::getGLSLProcessorKey(const GrShaderCaps& caps,
@@ -586,12 +584,7 @@
GrGeometryProcessor* GrDistanceFieldPathGeoProc::TestCreate(GrProcessorTestData* d) {
int texIdx = d->fRandom->nextBool() ? GrProcessorUnitTest::kSkiaPMTextureIdx
: GrProcessorUnitTest::kAlphaTextureIdx;
- sk_sp<GrTextureProxy> proxies[kMaxTextures] = {
- d->textureProxy(texIdx),
- nullptr,
- nullptr,
- nullptr
- };
+ sk_sp<GrTextureProxy> proxy = d->textureProxy(texIdx);
GrSamplerState::WrapMode wrapModes[2];
GrTest::TestWrapModes(d->fRandom, wrapModes);
@@ -604,11 +597,14 @@
if (flags & kSimilarity_DistanceFieldEffectFlag) {
flags |= d->fRandom->nextBool() ? kScaleOnly_DistanceFieldEffectFlag : 0;
}
+ GrSurfaceOrigin origin = proxy->origin();
+ const GrSwizzle& swizzle = proxy->textureSwizzle();
+ GrSurfaceProxyView view(std::move(proxy), origin, swizzle);
return GrDistanceFieldPathGeoProc::Make(d->allocator(), *d->caps()->shaderCaps(),
GrTest::TestMatrix(d->fRandom),
d->fRandom->nextBool(),
- proxies, 1,
+ &view, 1,
samplerState,
flags);
}
@@ -837,8 +833,8 @@
///////////////////////////////////////////////////////////////////////////////
GrDistanceFieldLCDTextGeoProc::GrDistanceFieldLCDTextGeoProc(const GrShaderCaps& caps,
- const sk_sp<GrTextureProxy>* proxies,
- int numProxies,
+ const GrSurfaceProxyView* views,
+ int numViews,
const GrSamplerState& params,
DistanceAdjust distanceAdjust,
uint32_t flags,
@@ -847,7 +843,7 @@
, fLocalMatrix(localMatrix)
, fDistanceAdjust(distanceAdjust)
, fFlags(flags & kLCD_DistanceFieldEffectMask) {
- SkASSERT(numProxies <= kMaxTextures);
+ SkASSERT(numViews <= kMaxTextures);
SkASSERT(!(flags & ~kLCD_DistanceFieldEffectMask) && (flags & kUseLCD_DistanceFieldEffectFlag));
if (fFlags & kPerspective_DistanceFieldEffectFlag) {
@@ -860,40 +856,39 @@
caps.integerSupport() ? kUShort2_GrSLType : kFloat2_GrSLType};
this->setVertexAttributes(&fInPosition, 3);
- if (numProxies) {
- fAtlasDimensions = proxies[0]->dimensions();
+ if (numViews) {
+ fAtlasDimensions = views[0].proxy()->dimensions();
}
- for (int i = 0; i < numProxies; ++i) {
- SkASSERT(proxies[i]);
- SkASSERT(proxies[i]->dimensions() == fAtlasDimensions);
- fTextureSamplers[i].reset(params, proxies[i]->backendFormat(),
- proxies[i]->textureSwizzle());
+ for (int i = 0; i < numViews; ++i) {
+ const GrSurfaceProxy* proxy = views[i].proxy();
+ SkASSERT(proxy);
+ SkASSERT(proxy->dimensions() == fAtlasDimensions);
+ fTextureSamplers[i].reset(params, proxy->backendFormat(), views[i].swizzle());
}
- this->setTextureSamplerCnt(numProxies);
+ this->setTextureSamplerCnt(numViews);
}
-void GrDistanceFieldLCDTextGeoProc::addNewProxies(const sk_sp<GrTextureProxy>* proxies,
- int numProxies,
- const GrSamplerState& params) {
- SkASSERT(numProxies <= kMaxTextures);
+void GrDistanceFieldLCDTextGeoProc::addNewViews(const GrSurfaceProxyView* views,
+ int numViews,
+ const GrSamplerState& params) {
+ SkASSERT(numViews <= kMaxTextures);
// Just to make sure we don't try to add too many proxies
- numProxies = SkTMin(numProxies, kMaxTextures);
+ numViews = SkTMin(numViews, kMaxTextures);
if (!fTextureSamplers[0].isInitialized()) {
- fAtlasDimensions = proxies[0]->dimensions();
+ fAtlasDimensions = views[0].proxy()->dimensions();
}
- for (int i = 0; i < numProxies; ++i) {
- SkASSERT(proxies[i]);
- SkASSERT(proxies[i]->dimensions() == fAtlasDimensions);
-
+ for (int i = 0; i < numViews; ++i) {
+ const GrSurfaceProxy* proxy = views[i].proxy();
+ SkASSERT(proxy);
+ SkASSERT(proxy->dimensions() == fAtlasDimensions);
if (!fTextureSamplers[i].isInitialized()) {
- fTextureSamplers[i].reset(params, proxies[i]->backendFormat(),
- proxies[i]->textureSwizzle());
+ fTextureSamplers[i].reset(params, proxy->backendFormat(), views[i].swizzle());
}
}
- this->setTextureSamplerCnt(numProxies);
+ this->setTextureSamplerCnt(numViews);
}
void GrDistanceFieldLCDTextGeoProc::getGLSLProcessorKey(const GrShaderCaps& caps,
@@ -913,12 +908,7 @@
GrGeometryProcessor* GrDistanceFieldLCDTextGeoProc::TestCreate(GrProcessorTestData* d) {
int texIdx = d->fRandom->nextBool() ? GrProcessorUnitTest::kSkiaPMTextureIdx :
GrProcessorUnitTest::kAlphaTextureIdx;
- sk_sp<GrTextureProxy> proxies[kMaxTextures] = {
- d->textureProxy(texIdx),
- nullptr,
- nullptr,
- nullptr
- };
+ sk_sp<GrTextureProxy> proxy = d->textureProxy(texIdx);
GrSamplerState::WrapMode wrapModes[2];
GrTest::TestWrapModes(d->fRandom, wrapModes);
@@ -933,7 +923,12 @@
}
flags |= d->fRandom->nextBool() ? kBGR_DistanceFieldEffectFlag : 0;
SkMatrix localMatrix = GrTest::TestMatrix(d->fRandom);
- return GrDistanceFieldLCDTextGeoProc::Make(d->allocator(), *d->caps()->shaderCaps(), proxies,
+
+ GrSurfaceOrigin origin = proxy->origin();
+ const GrSwizzle& swizzle = proxy->textureSwizzle();
+ GrSurfaceProxyView view(std::move(proxy), origin, swizzle);
+
+ return GrDistanceFieldLCDTextGeoProc::Make(d->allocator(), *d->caps()->shaderCaps(), &view,
1, samplerState, wa, flags, localMatrix);
}
#endif