Revert "Use int when possible to calculate atlas indices in shaders."
This reverts commit 999ec57291dc7cf1d8e3a745627670e6cadc1c12.
Reason for revert: Causing issues with NexusPlayer Vulkan.
Original change's description:
> Use int when possible to calculate atlas indices in shaders.
>
> On certain iOS devices half has a mantissa of only 10 bits, which is not
> enough to perform the floating point trickery to get the lower bits
> out of the "texture coordinates". Instead we use int if available, and
> float if not available.
>
> Also re-enables multitexturing for iOS and adds a sample which
> stresses the issue.
>
> Bug: skia:7285
> Change-Id: I365532c7cbbcca7c7753af209bef46e05be49e11
> Reviewed-on: https://skia-review.googlesource.com/71181
> Reviewed-by: Brian Salomon <bsalomon@google.com>
> Commit-Queue: Jim Van Verth <jvanverth@google.com>
TBR=jvanverth@google.com,bsalomon@google.com,robertphillips@google.com
Change-Id: I82801a73a2a8067588049b213f010ff25f4014f3
No-Presubmit: true
No-Tree-Checks: true
No-Try: true
Bug: skia:7285
Reviewed-on: https://skia-review.googlesource.com/74001
Reviewed-by: Jim Van Verth <jvanverth@google.com>
Commit-Queue: Jim Van Verth <jvanverth@google.com>
diff --git a/src/gpu/GrContext.cpp b/src/gpu/GrContext.cpp
index 69acd15..68cf42e 100644
--- a/src/gpu/GrContext.cpp
+++ b/src/gpu/GrContext.cpp
@@ -211,12 +211,20 @@
new GrDrawingManager(this, prcOptions, atlasTextContextOptions, &fSingleOwner));
GrDrawOpAtlas::AllowMultitexturing allowMultitexturing;
- if (GrContextOptions::Enable::kNo == options.fAllowMultipleGlyphCacheTextures ||
- // multitexturing supported only if range can represent the index + texcoords fully
- !(fCaps->shaderCaps()->floatIs32Bits() || fCaps->shaderCaps()->integerSupport())) {
- allowMultitexturing = GrDrawOpAtlas::AllowMultitexturing::kNo;
- } else {
- allowMultitexturing = GrDrawOpAtlas::AllowMultitexturing::kYes;
+ switch (options.fAllowMultipleGlyphCacheTextures) {
+ case GrContextOptions::Enable::kDefault:
+#ifdef SK_BUILD_FOR_IOS
+ allowMultitexturing = GrDrawOpAtlas::AllowMultitexturing::kNo;
+#else
+ allowMultitexturing = GrDrawOpAtlas::AllowMultitexturing::kYes;
+#endif
+ break;
+ case GrContextOptions::Enable::kNo:
+ allowMultitexturing = GrDrawOpAtlas::AllowMultitexturing::kNo;
+ break;
+ case GrContextOptions::Enable::kYes:
+ allowMultitexturing = GrDrawOpAtlas::AllowMultitexturing::kYes;
+ break;
}
fAtlasGlyphCache = new GrAtlasGlyphCache(this, options.fGlyphCacheTextureMaximumBytes,
allowMultitexturing);
diff --git a/src/gpu/effects/GrAtlasedShaderHelpers.h b/src/gpu/effects/GrAtlasedShaderHelpers.h
index 7fc321d..ad90141 100644
--- a/src/gpu/effects/GrAtlasedShaderHelpers.h
+++ b/src/gpu/effects/GrAtlasedShaderHelpers.h
@@ -8,7 +8,6 @@
#ifndef GrAtlasedShaderHelpers_DEFINED
#define GrAtlasedShaderHelpers_DEFINED
-#include "GrShaderCaps.h"
#include "glsl/GrGLSLPrimitiveProcessor.h"
#include "glsl/GrGLSLFragmentShaderBuilder.h"
#include "glsl/GrGLSLVarying.h"
@@ -23,24 +22,17 @@
// This extracts the texture index and texel coordinates from the same variable
// Packing structure: texel coordinates are multiplied by 2 (or shifted left 1)
// texture index is stored as lower bits of both x and y
- if (args.fShaderCaps->integerSupport()) {
- args.fVertBuilder->codeAppendf("int2 signedCoords = int2(%s);", inTexCoordsName);
- args.fVertBuilder->codeAppend("int texIdx = 2*(signedCoords.x & 0x1) + (signedCoords.y & 0x1);");
- args.fVertBuilder->codeAppend("signedCoords >>= 1;");
- args.fVertBuilder->codeAppend("float2 intCoords = float2(signedCoords);");
- } else {
- args.fVertBuilder->codeAppendf("float2 indexTexCoords = float2(%s.x, %s.y);",
- inTexCoordsName, inTexCoordsName);
- args.fVertBuilder->codeAppend("float2 intCoords = floor(0.5*indexTexCoords);");
- args.fVertBuilder->codeAppend("float2 diff = indexTexCoords - 2.0*intCoords;");
- args.fVertBuilder->codeAppend("float texIdx = 2.0*diff.x + diff.y;");
- }
+ args.fVertBuilder->codeAppendf("half2 indexTexCoords = half2(%s.x, %s.y);",
+ inTexCoordsName, inTexCoordsName);
+ args.fVertBuilder->codeAppend("half2 intCoords = floor(0.5*indexTexCoords);");
+ args.fVertBuilder->codeAppend("half2 diff = indexTexCoords - 2.0*intCoords;");
+ args.fVertBuilder->codeAppend("half texIdx = 2.0*diff.x + diff.y;");
// Multiply by 1/atlasSize to get normalized texture coordinates
args.fVaryingHandler->addVarying("TextureCoords", uv);
args.fVertBuilder->codeAppendf("%s = intCoords * %s;", uv->vsOut(), atlasSizeInvName);
- args.fVaryingHandler->addFlatVarying("TexIndex", texIdx);
+ args.fVaryingHandler->addVarying("TexIndex", texIdx);
args.fVertBuilder->codeAppendf("%s = texIdx;", texIdx->vsOut());
if (st) {
diff --git a/src/gpu/effects/GrBitmapTextGeoProc.cpp b/src/gpu/effects/GrBitmapTextGeoProc.cpp
index 4193f1d..d5f930f 100644
--- a/src/gpu/effects/GrBitmapTextGeoProc.cpp
+++ b/src/gpu/effects/GrBitmapTextGeoProc.cpp
@@ -38,8 +38,7 @@
&atlasSizeInvName);
GrGLSLVertToFrag uv(kFloat2_GrSLType);
- GrSLType texIdxType = args.fShaderCaps->integerSupport() ? kInt_GrSLType : kFloat_GrSLType;
- GrGLSLVertToFrag texIdx(texIdxType);
+ GrGLSLVertToFrag texIdx(kHalf_GrSLType);
append_index_uv_varyings(args, btgp.inTextureCoords()->fName, atlasSizeInvName,
&uv, &texIdx, nullptr);
diff --git a/src/gpu/effects/GrDistanceFieldGeoProc.cpp b/src/gpu/effects/GrDistanceFieldGeoProc.cpp
index 3e9adde..aafabde 100644
--- a/src/gpu/effects/GrDistanceFieldGeoProc.cpp
+++ b/src/gpu/effects/GrDistanceFieldGeoProc.cpp
@@ -78,8 +78,7 @@
// add varyings
GrGLSLVertToFrag uv(kFloat2_GrSLType);
- GrSLType texIdxType = args.fShaderCaps->integerSupport() ? kInt_GrSLType : kFloat_GrSLType;
- GrGLSLVertToFrag texIdx(texIdxType);
+ GrGLSLVertToFrag texIdx(kHalf_GrSLType);
GrGLSLVertToFrag st(kFloat2_GrSLType);
append_index_uv_varyings(args, dfTexEffect.inTextureCoords()->fName, atlasSizeInvName,
&uv, &texIdx, &st);
@@ -345,8 +344,7 @@
&atlasSizeInvName);
GrGLSLVertToFrag uv(kFloat2_GrSLType);
- GrSLType texIdxType = args.fShaderCaps->integerSupport() ? kInt_GrSLType : kFloat_GrSLType;
- GrGLSLVertToFrag texIdx(texIdxType);
+ GrGLSLVertToFrag texIdx(kHalf_GrSLType);
GrGLSLVertToFrag st(kFloat2_GrSLType);
append_index_uv_varyings(args, dfTexEffect.inTextureCoords()->fName, atlasSizeInvName,
&uv, &texIdx, &st);
@@ -641,8 +639,7 @@
// set up varyings
GrGLSLVertToFrag uv(kFloat2_GrSLType);
- GrSLType texIdxType = args.fShaderCaps->integerSupport() ? kInt_GrSLType : kFloat_GrSLType;
- GrGLSLVertToFrag texIdx(texIdxType);
+ GrGLSLVertToFrag texIdx(kHalf_GrSLType);
GrGLSLVertToFrag st(kFloat2_GrSLType);
append_index_uv_varyings(args, dfTexEffect.inTextureCoords()->fName, atlasSizeInvName,
&uv, &texIdx, &st);
diff --git a/src/gpu/text/GrAtlasTextBlobVertexRegenerator.cpp b/src/gpu/text/GrAtlasTextBlobVertexRegenerator.cpp
index 81ae09a..28b2e0f 100644
--- a/src/gpu/text/GrAtlasTextBlobVertexRegenerator.cpp
+++ b/src/gpu/text/GrAtlasTextBlobVertexRegenerator.cpp
@@ -38,9 +38,6 @@
bool useDistanceFields, SkScalar transX, SkScalar transY,
GrColor color) {
uint16_t u0, v0, u1, v1;
-#ifdef DISPLAY_PAGE_INDEX
- SkColor hackColor;
-#endif
if (regenTexCoords) {
SkASSERT(glyph);
int width = glyph->fBounds.width();
@@ -70,25 +67,6 @@
u1 |= uBit;
v1 <<= 1;
v1 |= vBit;
-#ifdef DISPLAY_PAGE_INDEX
- switch (pageIndex) {
- case 0:
- hackColor = SK_ColorGREEN;
- break;
- case 1:
- hackColor = SK_ColorRED;
- break;
- case 2:
- hackColor = SK_ColorMAGENTA;
- break;
- case 3:
- hackColor = SK_ColorCYAN;
- break;
- default:
- hackColor = SK_ColorBLACK;
- break;
- }
-#endif
}
// This is a bit wonky, but sometimes we have LCD text, in which case we won't have color
@@ -112,10 +90,6 @@
uint16_t* textureCoords = reinterpret_cast<uint16_t*>(vertex + texCoordOffset);
textureCoords[0] = u0;
textureCoords[1] = v0;
-#ifdef DISPLAY_PAGE_INDEX
- SkColor* vcolor = reinterpret_cast<SkColor*>(vertex + colorOffset);
- *vcolor = hackColor;
-#endif
}
vertex += vertexStride;
@@ -135,10 +109,6 @@
uint16_t* textureCoords = reinterpret_cast<uint16_t*>(vertex + texCoordOffset);
textureCoords[0] = u0;
textureCoords[1] = v1;
-#ifdef DISPLAY_PAGE_INDEX
- SkColor* vcolor = reinterpret_cast<SkColor*>(vertex + colorOffset);
- *vcolor = hackColor;
-#endif
}
vertex += vertexStride;
@@ -158,10 +128,6 @@
uint16_t* textureCoords = reinterpret_cast<uint16_t*>(vertex + texCoordOffset);
textureCoords[0] = u1;
textureCoords[1] = v0;
-#ifdef DISPLAY_PAGE_INDEX
- SkColor* vcolor = reinterpret_cast<SkColor*>(vertex + colorOffset);
- *vcolor = hackColor;
-#endif
}
vertex += vertexStride;
@@ -181,10 +147,6 @@
uint16_t* textureCoords = reinterpret_cast<uint16_t*>(vertex + texCoordOffset);
textureCoords[0] = u1;
textureCoords[1] = v1;
-#ifdef DISPLAY_PAGE_INDEX
- SkColor* vcolor = reinterpret_cast<SkColor*>(vertex + colorOffset);
- *vcolor = hackColor;
-#endif
}
}