aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/gpu
diff options
context:
space:
mode:
authorGravatar Jim Van Verth <jvanverth@google.com>2017-11-20 22:11:30 +0000
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2017-11-20 22:11:39 +0000
commitc02cb8a86ce801f471a8cf7bd46880648c48f089 (patch)
tree2c11e8b9a9e8f53dd0582dcbacf3dd3e34ae5f5c /src/gpu
parent575e06cd9b9f1e73a319d38f78f4b368df6024a3 (diff)
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>
Diffstat (limited to 'src/gpu')
-rw-r--r--src/gpu/GrContext.cpp20
-rw-r--r--src/gpu/effects/GrAtlasedShaderHelpers.h20
-rw-r--r--src/gpu/effects/GrBitmapTextGeoProc.cpp3
-rw-r--r--src/gpu/effects/GrDistanceFieldGeoProc.cpp9
-rw-r--r--src/gpu/text/GrAtlasTextBlobVertexRegenerator.cpp38
5 files changed, 24 insertions, 66 deletions
diff --git a/src/gpu/GrContext.cpp b/src/gpu/GrContext.cpp
index 69acd15cb2..68cf42ef2a 100644
--- a/src/gpu/GrContext.cpp
+++ b/src/gpu/GrContext.cpp
@@ -211,12 +211,20 @@ bool GrContext::init(const GrContextOptions& options) {
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 7fc321daa2..ad901411db 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 @@ static void append_index_uv_varyings(GrGLSLPrimitiveProcessor::EmitArgs& args,
// 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 4193f1d24c..d5f930fec4 100644
--- a/src/gpu/effects/GrBitmapTextGeoProc.cpp
+++ b/src/gpu/effects/GrBitmapTextGeoProc.cpp
@@ -38,8 +38,7 @@ public:
&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 3e9addef6d..aafabdeb60 100644
--- a/src/gpu/effects/GrDistanceFieldGeoProc.cpp
+++ b/src/gpu/effects/GrDistanceFieldGeoProc.cpp
@@ -78,8 +78,7 @@ public:
// 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 @@ public:
&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 @@ public:
// 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 81ae09a6f5..28b2e0f0c0 100644
--- a/src/gpu/text/GrAtlasTextBlobVertexRegenerator.cpp
+++ b/src/gpu/text/GrAtlasTextBlobVertexRegenerator.cpp
@@ -38,9 +38,6 @@ inline void regen_vertices(char* vertex, const GrGlyph* glyph, size_t vertexStri
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 @@ inline void regen_vertices(char* vertex, const GrGlyph* glyph, size_t vertexStri
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 @@ inline void regen_vertices(char* vertex, const GrGlyph* glyph, size_t vertexStri
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 @@ inline void regen_vertices(char* vertex, const GrGlyph* glyph, size_t vertexStri
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 @@ inline void regen_vertices(char* vertex, const GrGlyph* glyph, size_t vertexStri
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 @@ inline void regen_vertices(char* vertex, const GrGlyph* glyph, size_t vertexStri
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
}
}