18 int numTextureSamplers,
19 const char* inTexCoordsName,
20 const char* atlasDimensionsInvName,
29 if (
args.fShaderCaps->fIntegerSupport) {
30 if (numTextureSamplers <= 1) {
31 args.fVertBuilder->codeAppendf(
33 "float2 unormTexCoords = float2(%s.x, %s.y);"
34 , inTexCoordsName, inTexCoordsName);
36 args.fVertBuilder->codeAppendf(
37 "int2 coords = int2(%s.x, %s.y);"
38 "int texIdx = coords.x >> 13;"
39 "float2 unormTexCoords = float2(coords.x & 0x1FFF, coords.y);"
40 , inTexCoordsName, inTexCoordsName);
43 if (numTextureSamplers <= 1) {
44 args.fVertBuilder->codeAppendf(
46 "float2 unormTexCoords = float2(%s.x, %s.y);"
47 , inTexCoordsName, inTexCoordsName);
49 args.fVertBuilder->codeAppendf(
50 "float2 coord = float2(%s.x, %s.y);"
51 "float texIdx = floor(coord.x * exp2(-13));"
52 "float2 unormTexCoords = float2(coord.x - texIdx * exp2(13), coord.y);"
53 , inTexCoordsName, inTexCoordsName);
59 args.fVaryingHandler->addVarying(
"TextureCoords", uv);
60 args.fVertBuilder->codeAppendf(
61 "%s = unormTexCoords * %s;", uv->
vsOut(), atlasDimensionsInvName);
67 const char*
cast =
args.fShaderCaps->fIntegerSupport ?
"float" :
"";
68 args.fVaryingHandler->addVarying(
"TexIndex", texIdx, Interpolation::kCanBeFlat);
69 args.fVertBuilder->codeAppendf(
"%s = %s(texIdx);", texIdx->
vsOut(),
cast);
73 args.fVaryingHandler->addVarying(
"IntTextureCoords", st);
74 args.fVertBuilder->codeAppendf(
"%s = unormTexCoords;", st->
vsOut());
79 int numTextureSamplers,
81 const char* coordName,
82 const char* colorName) {
85 if (numTextureSamplers <= 0) {
86 args.fFragBuilder->codeAppendf(
"%s = float4(1, 1, 1, 1);", colorName);
91 for (
int i = 0; i < numTextureSamplers-1; ++i) {
92 args.fFragBuilder->codeAppendf(
"if (%s == %d) { %s = ", texIdx.
fsIn(), i, colorName);
93 args.fFragBuilder->appendTextureLookup(
args.fTexSamplers[i],
95 args.fFragBuilder->codeAppend(
"; } else ");
97 args.fFragBuilder->codeAppendf(
"{ %s = ", colorName);
98 args.fFragBuilder->appendTextureLookup(
args.fTexSamplers[numTextureSamplers - 1],
100 args.fFragBuilder->codeAppend(
"; }");
static void append_index_uv_varyings(GrGeometryProcessor::ProgramImpl::EmitArgs &args, int numTextureSamplers, const char *inTexCoordsName, const char *atlasDimensionsInvName, GrGLSLVarying *uv, GrGLSLVarying *texIdx, GrGLSLVarying *st)
static void append_multitexture_lookup(GrGeometryProcessor::ProgramImpl::EmitArgs &args, int numTextureSamplers, const GrGLSLVarying &texIdx, const char *coordName, const char *colorName)