12f68e7684bb2ecdf0c03a513c31d0626d2caf752tomhudson@google.com/* 22f68e7684bb2ecdf0c03a513c31d0626d2caf752tomhudson@google.com * Copyright 2012 Google Inc. 32f68e7684bb2ecdf0c03a513c31d0626d2caf752tomhudson@google.com * 42f68e7684bb2ecdf0c03a513c31d0626d2caf752tomhudson@google.com * Use of this source code is governed by a BSD-style license that can be 52f68e7684bb2ecdf0c03a513c31d0626d2caf752tomhudson@google.com * found in the LICENSE file. 62f68e7684bb2ecdf0c03a513c31d0626d2caf752tomhudson@google.com */ 72f68e7684bb2ecdf0c03a513c31d0626d2caf752tomhudson@google.com 830ba436f04e61d4505fb854d5fc56079636e0788joshualitt#include "gl/builders/GrGLProgramBuilder.h" 9907fbd53c5e5dd4cbde7b72f9242b51febd7ef95commit-bot@chromium.org#include "GrTextureDomain.h" 1068b58c95384dd6c2fd389a5b4bbf8fc468819454bsalomon@google.com#include "GrSimpleTextureEffect.h" 11b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt#include "GrTBackendProcessorFactory.h" 12b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt#include "gl/GrGLProcessor.h" 1392b6a94ac103ea3f37a8f9f02072ef884cc17a7cbsalomon@google.com#include "SkFloatingPoint.h" 142f68e7684bb2ecdf0c03a513c31d0626d2caf752tomhudson@google.com 15907fbd53c5e5dd4cbde7b72f9242b51febd7ef95commit-bot@chromium.org 16907fbd53c5e5dd4cbde7b72f9242b51febd7ef95commit-bot@chromium.orgGrTextureDomain::GrTextureDomain(const SkRect& domain, Mode mode, int index) 17907fbd53c5e5dd4cbde7b72f9242b51febd7ef95commit-bot@chromium.org : fIndex(index) { 18907fbd53c5e5dd4cbde7b72f9242b51febd7ef95commit-bot@chromium.org 19907fbd53c5e5dd4cbde7b72f9242b51febd7ef95commit-bot@chromium.org static const SkRect kFullRect = {0, 0, SK_Scalar1, SK_Scalar1}; 2026632630fdf17f5a11d9aed6d8766e22842fec14commit-bot@chromium.org if (domain.contains(kFullRect) && kClamp_Mode == mode) { 21907fbd53c5e5dd4cbde7b72f9242b51febd7ef95commit-bot@chromium.org fMode = kIgnore_Mode; 22907fbd53c5e5dd4cbde7b72f9242b51febd7ef95commit-bot@chromium.org } else { 23907fbd53c5e5dd4cbde7b72f9242b51febd7ef95commit-bot@chromium.org fMode = mode; 24907fbd53c5e5dd4cbde7b72f9242b51febd7ef95commit-bot@chromium.org } 25907fbd53c5e5dd4cbde7b72f9242b51febd7ef95commit-bot@chromium.org 26907fbd53c5e5dd4cbde7b72f9242b51febd7ef95commit-bot@chromium.org if (fMode != kIgnore_Mode) { 27907fbd53c5e5dd4cbde7b72f9242b51febd7ef95commit-bot@chromium.org // We don't currently handle domains that are empty or don't intersect the texture. 28907fbd53c5e5dd4cbde7b72f9242b51febd7ef95commit-bot@chromium.org // It is OK if the domain rect is a line or point, but it should not be inverted. We do not 29907fbd53c5e5dd4cbde7b72f9242b51febd7ef95commit-bot@chromium.org // handle rects that do not intersect the [0..1]x[0..1] rect. 30907fbd53c5e5dd4cbde7b72f9242b51febd7ef95commit-bot@chromium.org SkASSERT(domain.fLeft <= domain.fRight); 31907fbd53c5e5dd4cbde7b72f9242b51febd7ef95commit-bot@chromium.org SkASSERT(domain.fTop <= domain.fBottom); 32907fbd53c5e5dd4cbde7b72f9242b51febd7ef95commit-bot@chromium.org fDomain.fLeft = SkMaxScalar(domain.fLeft, kFullRect.fLeft); 33907fbd53c5e5dd4cbde7b72f9242b51febd7ef95commit-bot@chromium.org fDomain.fRight = SkMinScalar(domain.fRight, kFullRect.fRight); 34907fbd53c5e5dd4cbde7b72f9242b51febd7ef95commit-bot@chromium.org fDomain.fTop = SkMaxScalar(domain.fTop, kFullRect.fTop); 35907fbd53c5e5dd4cbde7b72f9242b51febd7ef95commit-bot@chromium.org fDomain.fBottom = SkMinScalar(domain.fBottom, kFullRect.fBottom); 36907fbd53c5e5dd4cbde7b72f9242b51febd7ef95commit-bot@chromium.org SkASSERT(fDomain.fLeft <= fDomain.fRight); 37907fbd53c5e5dd4cbde7b72f9242b51febd7ef95commit-bot@chromium.org SkASSERT(fDomain.fTop <= fDomain.fBottom); 38907fbd53c5e5dd4cbde7b72f9242b51febd7ef95commit-bot@chromium.org } 39907fbd53c5e5dd4cbde7b72f9242b51febd7ef95commit-bot@chromium.org} 40907fbd53c5e5dd4cbde7b72f9242b51febd7ef95commit-bot@chromium.org 41907fbd53c5e5dd4cbde7b72f9242b51febd7ef95commit-bot@chromium.org////////////////////////////////////////////////////////////////////////////// 42907fbd53c5e5dd4cbde7b72f9242b51febd7ef95commit-bot@chromium.org 43907fbd53c5e5dd4cbde7b72f9242b51febd7ef95commit-bot@chromium.orgvoid GrTextureDomain::GLDomain::sampleTexture(GrGLShaderBuilder* builder, 44907fbd53c5e5dd4cbde7b72f9242b51febd7ef95commit-bot@chromium.org const GrTextureDomain& textureDomain, 45907fbd53c5e5dd4cbde7b72f9242b51febd7ef95commit-bot@chromium.org const char* outColor, 46907fbd53c5e5dd4cbde7b72f9242b51febd7ef95commit-bot@chromium.org const SkString& inCoords, 47b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt const GrGLProcessor::TextureSampler sampler, 48907fbd53c5e5dd4cbde7b72f9242b51febd7ef95commit-bot@chromium.org const char* inModulateColor) { 49d7b1af68deefe6e4ca5fa635625154c1e4f2eae6reed@google.com SkASSERT((Mode)-1 == fMode || textureDomain.mode() == fMode); 50907fbd53c5e5dd4cbde7b72f9242b51febd7ef95commit-bot@chromium.org SkDEBUGCODE(fMode = textureDomain.mode();) 51907fbd53c5e5dd4cbde7b72f9242b51febd7ef95commit-bot@chromium.org 5230ba436f04e61d4505fb854d5fc56079636e0788joshualitt GrGLProgramBuilder* program = builder->getProgramBuilder(); 5330ba436f04e61d4505fb854d5fc56079636e0788joshualitt 545ae5fc59b27a48711e514b3ede548b228e393e9bjoshualitt if (textureDomain.mode() != kIgnore_Mode && !fDomainUni.isValid()) { 55907fbd53c5e5dd4cbde7b72f9242b51febd7ef95commit-bot@chromium.org const char* name; 56907fbd53c5e5dd4cbde7b72f9242b51febd7ef95commit-bot@chromium.org SkString uniName("TexDom"); 57907fbd53c5e5dd4cbde7b72f9242b51febd7ef95commit-bot@chromium.org if (textureDomain.fIndex >= 0) { 58907fbd53c5e5dd4cbde7b72f9242b51febd7ef95commit-bot@chromium.org uniName.appendS32(textureDomain.fIndex); 59907fbd53c5e5dd4cbde7b72f9242b51febd7ef95commit-bot@chromium.org } 6030ba436f04e61d4505fb854d5fc56079636e0788joshualitt fDomainUni = program->addUniform(GrGLProgramBuilder::kFragment_Visibility, kVec4f_GrSLType, 6130ba436f04e61d4505fb854d5fc56079636e0788joshualitt uniName.c_str(), &name); 62907fbd53c5e5dd4cbde7b72f9242b51febd7ef95commit-bot@chromium.org fDomainName = name; 63907fbd53c5e5dd4cbde7b72f9242b51febd7ef95commit-bot@chromium.org } 64907fbd53c5e5dd4cbde7b72f9242b51febd7ef95commit-bot@chromium.org 655ae5fc59b27a48711e514b3ede548b228e393e9bjoshualitt switch (textureDomain.mode()) { 665ae5fc59b27a48711e514b3ede548b228e393e9bjoshualitt case kIgnore_Mode: { 6730ba436f04e61d4505fb854d5fc56079636e0788joshualitt builder->codeAppendf("\t%s = ", outColor); 6830ba436f04e61d4505fb854d5fc56079636e0788joshualitt builder->appendTextureLookupAndModulate(inModulateColor, sampler, 695ae5fc59b27a48711e514b3ede548b228e393e9bjoshualitt inCoords.c_str()); 7030ba436f04e61d4505fb854d5fc56079636e0788joshualitt builder->codeAppend(";\n"); 715ae5fc59b27a48711e514b3ede548b228e393e9bjoshualitt break; 725ae5fc59b27a48711e514b3ede548b228e393e9bjoshualitt } 735ae5fc59b27a48711e514b3ede548b228e393e9bjoshualitt case kClamp_Mode: { 745ae5fc59b27a48711e514b3ede548b228e393e9bjoshualitt SkString clampedCoords; 755ae5fc59b27a48711e514b3ede548b228e393e9bjoshualitt clampedCoords.appendf("\tclamp(%s, %s.xy, %s.zw)", 765ae5fc59b27a48711e514b3ede548b228e393e9bjoshualitt inCoords.c_str(), fDomainName.c_str(), fDomainName.c_str()); 775ae5fc59b27a48711e514b3ede548b228e393e9bjoshualitt 7830ba436f04e61d4505fb854d5fc56079636e0788joshualitt builder->codeAppendf("\t%s = ", outColor); 7930ba436f04e61d4505fb854d5fc56079636e0788joshualitt builder->appendTextureLookupAndModulate(inModulateColor, sampler, 805ae5fc59b27a48711e514b3ede548b228e393e9bjoshualitt clampedCoords.c_str()); 8130ba436f04e61d4505fb854d5fc56079636e0788joshualitt builder->codeAppend(";\n"); 825ae5fc59b27a48711e514b3ede548b228e393e9bjoshualitt break; 835ae5fc59b27a48711e514b3ede548b228e393e9bjoshualitt } 845ae5fc59b27a48711e514b3ede548b228e393e9bjoshualitt case kDecal_Mode: { 855ae5fc59b27a48711e514b3ede548b228e393e9bjoshualitt // Add a block since we're going to declare variables. 8630ba436f04e61d4505fb854d5fc56079636e0788joshualitt GrGLShaderBuilder::ShaderBlock block(builder); 875ae5fc59b27a48711e514b3ede548b228e393e9bjoshualitt 885ae5fc59b27a48711e514b3ede548b228e393e9bjoshualitt const char* domain = fDomainName.c_str(); 8930ba436f04e61d4505fb854d5fc56079636e0788joshualitt if (kImagination_GrGLVendor == program->ctxInfo().vendor()) { 905ae5fc59b27a48711e514b3ede548b228e393e9bjoshualitt // On the NexusS and GalaxyNexus, the other path (with the 'any' 915ae5fc59b27a48711e514b3ede548b228e393e9bjoshualitt // call) causes the compilation error "Calls to any function that 925ae5fc59b27a48711e514b3ede548b228e393e9bjoshualitt // may require a gradient calculation inside a conditional block 935ae5fc59b27a48711e514b3ede548b228e393e9bjoshualitt // may return undefined results". This appears to be an issue with 945ae5fc59b27a48711e514b3ede548b228e393e9bjoshualitt // the 'any' call since even the simple "result=black; if (any()) 955ae5fc59b27a48711e514b3ede548b228e393e9bjoshualitt // result=white;" code fails to compile. 9630ba436f04e61d4505fb854d5fc56079636e0788joshualitt builder->codeAppend("\tvec4 outside = vec4(0.0, 0.0, 0.0, 0.0);\n"); 9730ba436f04e61d4505fb854d5fc56079636e0788joshualitt builder->codeAppend("\tvec4 inside = "); 9830ba436f04e61d4505fb854d5fc56079636e0788joshualitt builder->appendTextureLookupAndModulate(inModulateColor, sampler, 995ae5fc59b27a48711e514b3ede548b228e393e9bjoshualitt inCoords.c_str()); 10030ba436f04e61d4505fb854d5fc56079636e0788joshualitt builder->codeAppend(";\n"); 10130ba436f04e61d4505fb854d5fc56079636e0788joshualitt builder->codeAppendf("\tfloat x = (%s).x;\n", inCoords.c_str()); 10230ba436f04e61d4505fb854d5fc56079636e0788joshualitt builder->codeAppendf("\tfloat y = (%s).y;\n", inCoords.c_str()); 1035ae5fc59b27a48711e514b3ede548b228e393e9bjoshualitt 10430ba436f04e61d4505fb854d5fc56079636e0788joshualitt builder->codeAppendf("\tx = abs(2.0*(x - %s.x)/(%s.z - %s.x) - 1.0);\n", 105d9e183fce58061daf316dfb3ce0c7744232b17f9joshualitt domain, domain, domain); 10630ba436f04e61d4505fb854d5fc56079636e0788joshualitt builder->codeAppendf("\ty = abs(2.0*(y - %s.y)/(%s.w - %s.y) - 1.0);\n", 107d9e183fce58061daf316dfb3ce0c7744232b17f9joshualitt domain, domain, domain); 10830ba436f04e61d4505fb854d5fc56079636e0788joshualitt builder->codeAppend("\tfloat blend = step(1.0, max(x, y));\n"); 10930ba436f04e61d4505fb854d5fc56079636e0788joshualitt builder->codeAppendf("\t%s = mix(inside, outside, blend);\n", outColor); 1105ae5fc59b27a48711e514b3ede548b228e393e9bjoshualitt } else { 11130ba436f04e61d4505fb854d5fc56079636e0788joshualitt builder->codeAppend("\tbvec4 outside;\n"); 11230ba436f04e61d4505fb854d5fc56079636e0788joshualitt builder->codeAppendf("\toutside.xy = lessThan(%s, %s.xy);\n", inCoords.c_str(), 1135ae5fc59b27a48711e514b3ede548b228e393e9bjoshualitt domain); 11430ba436f04e61d4505fb854d5fc56079636e0788joshualitt builder->codeAppendf("\toutside.zw = greaterThan(%s, %s.zw);\n", inCoords.c_str(), 1155ae5fc59b27a48711e514b3ede548b228e393e9bjoshualitt domain); 11630ba436f04e61d4505fb854d5fc56079636e0788joshualitt builder->codeAppendf("\t%s = any(outside) ? vec4(0.0, 0.0, 0.0, 0.0) : ", 1175ae5fc59b27a48711e514b3ede548b228e393e9bjoshualitt outColor); 11830ba436f04e61d4505fb854d5fc56079636e0788joshualitt builder->appendTextureLookupAndModulate(inModulateColor, sampler, 1195ae5fc59b27a48711e514b3ede548b228e393e9bjoshualitt inCoords.c_str()); 12030ba436f04e61d4505fb854d5fc56079636e0788joshualitt builder->codeAppend(";\n"); 1215ae5fc59b27a48711e514b3ede548b228e393e9bjoshualitt } 1225ae5fc59b27a48711e514b3ede548b228e393e9bjoshualitt break; 1235ae5fc59b27a48711e514b3ede548b228e393e9bjoshualitt } 1245ae5fc59b27a48711e514b3ede548b228e393e9bjoshualitt case kRepeat_Mode: { 1255ae5fc59b27a48711e514b3ede548b228e393e9bjoshualitt SkString clampedCoords; 1265ae5fc59b27a48711e514b3ede548b228e393e9bjoshualitt clampedCoords.printf("\tmod(%s - %s.xy, %s.zw - %s.xy) + %s.xy", 1275ae5fc59b27a48711e514b3ede548b228e393e9bjoshualitt inCoords.c_str(), fDomainName.c_str(), fDomainName.c_str(), 1285ae5fc59b27a48711e514b3ede548b228e393e9bjoshualitt fDomainName.c_str(), fDomainName.c_str()); 1295ae5fc59b27a48711e514b3ede548b228e393e9bjoshualitt 13030ba436f04e61d4505fb854d5fc56079636e0788joshualitt builder->codeAppendf("\t%s = ", outColor); 13130ba436f04e61d4505fb854d5fc56079636e0788joshualitt builder->appendTextureLookupAndModulate(inModulateColor, sampler, 1325ae5fc59b27a48711e514b3ede548b228e393e9bjoshualitt clampedCoords.c_str()); 13330ba436f04e61d4505fb854d5fc56079636e0788joshualitt builder->codeAppend(";\n"); 1345ae5fc59b27a48711e514b3ede548b228e393e9bjoshualitt break; 135907fbd53c5e5dd4cbde7b72f9242b51febd7ef95commit-bot@chromium.org } 136907fbd53c5e5dd4cbde7b72f9242b51febd7ef95commit-bot@chromium.org } 137907fbd53c5e5dd4cbde7b72f9242b51febd7ef95commit-bot@chromium.org} 138907fbd53c5e5dd4cbde7b72f9242b51febd7ef95commit-bot@chromium.org 1397510b224e52b9518a8ddf7418db0e9c258f79539kkinnunenvoid GrTextureDomain::GLDomain::setData(const GrGLProgramDataManager& pdman, 140907fbd53c5e5dd4cbde7b72f9242b51febd7ef95commit-bot@chromium.org const GrTextureDomain& textureDomain, 141907fbd53c5e5dd4cbde7b72f9242b51febd7ef95commit-bot@chromium.org GrSurfaceOrigin textureOrigin) { 142907fbd53c5e5dd4cbde7b72f9242b51febd7ef95commit-bot@chromium.org SkASSERT(textureDomain.mode() == fMode); 143907fbd53c5e5dd4cbde7b72f9242b51febd7ef95commit-bot@chromium.org if (kIgnore_Mode != textureDomain.mode()) { 144907fbd53c5e5dd4cbde7b72f9242b51febd7ef95commit-bot@chromium.org GrGLfloat values[4] = { 145907fbd53c5e5dd4cbde7b72f9242b51febd7ef95commit-bot@chromium.org SkScalarToFloat(textureDomain.domain().left()), 146907fbd53c5e5dd4cbde7b72f9242b51febd7ef95commit-bot@chromium.org SkScalarToFloat(textureDomain.domain().top()), 147907fbd53c5e5dd4cbde7b72f9242b51febd7ef95commit-bot@chromium.org SkScalarToFloat(textureDomain.domain().right()), 148907fbd53c5e5dd4cbde7b72f9242b51febd7ef95commit-bot@chromium.org SkScalarToFloat(textureDomain.domain().bottom()) 149907fbd53c5e5dd4cbde7b72f9242b51febd7ef95commit-bot@chromium.org }; 150907fbd53c5e5dd4cbde7b72f9242b51febd7ef95commit-bot@chromium.org // vertical flip if necessary 151907fbd53c5e5dd4cbde7b72f9242b51febd7ef95commit-bot@chromium.org if (kBottomLeft_GrSurfaceOrigin == textureOrigin) { 152907fbd53c5e5dd4cbde7b72f9242b51febd7ef95commit-bot@chromium.org values[1] = 1.0f - values[1]; 153907fbd53c5e5dd4cbde7b72f9242b51febd7ef95commit-bot@chromium.org values[3] = 1.0f - values[3]; 154907fbd53c5e5dd4cbde7b72f9242b51febd7ef95commit-bot@chromium.org // The top and bottom were just flipped, so correct the ordering 155907fbd53c5e5dd4cbde7b72f9242b51febd7ef95commit-bot@chromium.org // of elements so that values = (l, t, r, b). 156907fbd53c5e5dd4cbde7b72f9242b51febd7ef95commit-bot@chromium.org SkTSwap(values[1], values[3]); 157907fbd53c5e5dd4cbde7b72f9242b51febd7ef95commit-bot@chromium.org } 158907fbd53c5e5dd4cbde7b72f9242b51febd7ef95commit-bot@chromium.org if (0 != memcmp(values, fPrevDomain, 4 * sizeof(GrGLfloat))) { 1597510b224e52b9518a8ddf7418db0e9c258f79539kkinnunen pdman.set4fv(fDomainUni, 1, values); 160907fbd53c5e5dd4cbde7b72f9242b51febd7ef95commit-bot@chromium.org memcpy(fPrevDomain, values, 4 * sizeof(GrGLfloat)); 161907fbd53c5e5dd4cbde7b72f9242b51febd7ef95commit-bot@chromium.org } 162907fbd53c5e5dd4cbde7b72f9242b51febd7ef95commit-bot@chromium.org } 163907fbd53c5e5dd4cbde7b72f9242b51febd7ef95commit-bot@chromium.org} 164907fbd53c5e5dd4cbde7b72f9242b51febd7ef95commit-bot@chromium.org 165907fbd53c5e5dd4cbde7b72f9242b51febd7ef95commit-bot@chromium.org 166907fbd53c5e5dd4cbde7b72f9242b51febd7ef95commit-bot@chromium.org////////////////////////////////////////////////////////////////////////////// 167907fbd53c5e5dd4cbde7b72f9242b51febd7ef95commit-bot@chromium.org 168b0a8a377f832c59cee939ad721e1f87d378b7142joshualittclass GrGLTextureDomainEffect : public GrGLFragmentProcessor { 1692f68e7684bb2ecdf0c03a513c31d0626d2caf752tomhudson@google.compublic: 170b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt GrGLTextureDomainEffect(const GrBackendProcessorFactory&, const GrProcessor&); 1712f68e7684bb2ecdf0c03a513c31d0626d2caf752tomhudson@google.com 17230ba436f04e61d4505fb854d5fc56079636e0788joshualitt virtual void emitCode(GrGLProgramBuilder*, 173b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt const GrFragmentProcessor&, 174b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt const GrProcessorKey&, 17522a800a2578564a8b66bd4d9903ef4186c37f35cbsalomon@google.com const char* outputColor, 17622a800a2578564a8b66bd4d9903ef4186c37f35cbsalomon@google.com const char* inputColor, 17777af6805e5faea1e2a5c0220098aec9082f3a6e5bsalomon@google.com const TransformedCoordsArray&, 17822a800a2578564a8b66bd4d9903ef4186c37f35cbsalomon@google.com const TextureSamplerArray&) SK_OVERRIDE; 1792f68e7684bb2ecdf0c03a513c31d0626d2caf752tomhudson@google.com 180b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt virtual void setData(const GrGLProgramDataManager&, const GrProcessor&) SK_OVERRIDE; 1812f68e7684bb2ecdf0c03a513c31d0626d2caf752tomhudson@google.com 182b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt static inline void GenKey(const GrProcessor&, const GrGLCaps&, GrProcessorKeyBuilder*); 1832f68e7684bb2ecdf0c03a513c31d0626d2caf752tomhudson@google.com 1842f68e7684bb2ecdf0c03a513c31d0626d2caf752tomhudson@google.comprivate: 185907fbd53c5e5dd4cbde7b72f9242b51febd7ef95commit-bot@chromium.org GrTextureDomain::GLDomain fGLDomain; 186b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt typedef GrGLFragmentProcessor INHERITED; 1872f68e7684bb2ecdf0c03a513c31d0626d2caf752tomhudson@google.com}; 1882f68e7684bb2ecdf0c03a513c31d0626d2caf752tomhudson@google.com 189b0a8a377f832c59cee939ad721e1f87d378b7142joshualittGrGLTextureDomainEffect::GrGLTextureDomainEffect(const GrBackendProcessorFactory& factory, 190b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt const GrProcessor&) 19177af6805e5faea1e2a5c0220098aec9082f3a6e5bsalomon@google.com : INHERITED(factory) { 1922f68e7684bb2ecdf0c03a513c31d0626d2caf752tomhudson@google.com} 1932f68e7684bb2ecdf0c03a513c31d0626d2caf752tomhudson@google.com 19430ba436f04e61d4505fb854d5fc56079636e0788joshualittvoid GrGLTextureDomainEffect::emitCode(GrGLProgramBuilder* builder, 195b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt const GrFragmentProcessor& fp, 196b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt const GrProcessorKey& key, 19722a800a2578564a8b66bd4d9903ef4186c37f35cbsalomon@google.com const char* outputColor, 19822a800a2578564a8b66bd4d9903ef4186c37f35cbsalomon@google.com const char* inputColor, 19977af6805e5faea1e2a5c0220098aec9082f3a6e5bsalomon@google.com const TransformedCoordsArray& coords, 20022a800a2578564a8b66bd4d9903ef4186c37f35cbsalomon@google.com const TextureSamplerArray& samplers) { 201b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt const GrTextureDomainEffect& textureDomainEffect = fp.cast<GrTextureDomainEffect>(); 20249586bec7383d4ccb81f85f8e2dc4162e2d4f6a8joshualitt const GrTextureDomain& domain = textureDomainEffect.textureDomain(); 2037b7cdd147f5528865238e5ed98c79e6d319fde9bbsalomon@google.com 20430ba436f04e61d4505fb854d5fc56079636e0788joshualitt GrGLFragmentShaderBuilder* fsBuilder = builder->getFragmentShaderBuilder(); 20530ba436f04e61d4505fb854d5fc56079636e0788joshualitt SkString coords2D = fsBuilder->ensureFSCoords2D(coords, 0); 20630ba436f04e61d4505fb854d5fc56079636e0788joshualitt fGLDomain.sampleTexture(fsBuilder, domain, outputColor, coords2D, samplers[0], inputColor); 2072f68e7684bb2ecdf0c03a513c31d0626d2caf752tomhudson@google.com} 2082f68e7684bb2ecdf0c03a513c31d0626d2caf752tomhudson@google.com 2097510b224e52b9518a8ddf7418db0e9c258f79539kkinnunenvoid GrGLTextureDomainEffect::setData(const GrGLProgramDataManager& pdman, 210b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt const GrProcessor& processor) { 211b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt const GrTextureDomainEffect& textureDomainEffect = processor.cast<GrTextureDomainEffect>(); 21249586bec7383d4ccb81f85f8e2dc4162e2d4f6a8joshualitt const GrTextureDomain& domain = textureDomainEffect.textureDomain(); 213b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt fGLDomain.setData(pdman, domain, processor.texture(0)->origin()); 2141aa90cf11e136a722bce71dd77f4bb03cc2b56f8skia.committer@gmail.com} 21592b6a94ac103ea3f37a8f9f02072ef884cc17a7cbsalomon@google.com 216b0a8a377f832c59cee939ad721e1f87d378b7142joshualittvoid GrGLTextureDomainEffect::GenKey(const GrProcessor& processor, const GrGLCaps&, 217b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt GrProcessorKeyBuilder* b) { 218b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt const GrTextureDomain& domain = processor.cast<GrTextureDomainEffect>().textureDomain(); 21963e99f7a03b2ac90ae7a00232674fd39c0bdcc68bsalomon b->add32(GrTextureDomain::GLDomain::DomainKey(domain)); 2202f68e7684bb2ecdf0c03a513c31d0626d2caf752tomhudson@google.com} 2212f68e7684bb2ecdf0c03a513c31d0626d2caf752tomhudson@google.com 2222f68e7684bb2ecdf0c03a513c31d0626d2caf752tomhudson@google.com 2232f68e7684bb2ecdf0c03a513c31d0626d2caf752tomhudson@google.com/////////////////////////////////////////////////////////////////////////////// 2242f68e7684bb2ecdf0c03a513c31d0626d2caf752tomhudson@google.com 225b0a8a377f832c59cee939ad721e1f87d378b7142joshualittGrFragmentProcessor* GrTextureDomainEffect::Create(GrTexture* texture, 226b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt const SkMatrix& matrix, 227b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt const SkRect& domain, 228b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt GrTextureDomain::Mode mode, 229b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt GrTextureParams::FilterMode filterMode, 230b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt GrCoordSet coordSet) { 2317b7cdd147f5528865238e5ed98c79e6d319fde9bbsalomon@google.com static const SkRect kFullRect = {0, 0, SK_Scalar1, SK_Scalar1}; 232907fbd53c5e5dd4cbde7b72f9242b51febd7ef95commit-bot@chromium.org if (GrTextureDomain::kIgnore_Mode == mode || 233907fbd53c5e5dd4cbde7b72f9242b51febd7ef95commit-bot@chromium.org (GrTextureDomain::kClamp_Mode == mode && domain.contains(kFullRect))) { 234b86add1ad37776818e1f730359ec587c9fdbff5fhumper@google.com return GrSimpleTextureEffect::Create(texture, matrix, filterMode); 2357b7cdd147f5528865238e5ed98c79e6d319fde9bbsalomon@google.com } else { 2360ac6af49975c54c2debf41e9200af416ecd2d973bsalomon@google.com 23755fad7af61c21d502acb9891d631e8aa29e3628cbsalomon return SkNEW_ARGS(GrTextureDomainEffect, (texture, 23855fad7af61c21d502acb9891d631e8aa29e3628cbsalomon matrix, 23955fad7af61c21d502acb9891d631e8aa29e3628cbsalomon domain, 24055fad7af61c21d502acb9891d631e8aa29e3628cbsalomon mode, 24155fad7af61c21d502acb9891d631e8aa29e3628cbsalomon filterMode, 24255fad7af61c21d502acb9891d631e8aa29e3628cbsalomon coordSet)); 2437b7cdd147f5528865238e5ed98c79e6d319fde9bbsalomon@google.com } 2442f68e7684bb2ecdf0c03a513c31d0626d2caf752tomhudson@google.com} 2452f68e7684bb2ecdf0c03a513c31d0626d2caf752tomhudson@google.com 2461ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.comGrTextureDomainEffect::GrTextureDomainEffect(GrTexture* texture, 2477b7cdd147f5528865238e5ed98c79e6d319fde9bbsalomon@google.com const SkMatrix& matrix, 248fd03d4a829efe2d77a712fd991927c55f59a2ffecommit-bot@chromium.org const SkRect& domain, 249907fbd53c5e5dd4cbde7b72f9242b51febd7ef95commit-bot@chromium.org GrTextureDomain::Mode mode, 250b86add1ad37776818e1f730359ec587c9fdbff5fhumper@google.com GrTextureParams::FilterMode filterMode, 25177af6805e5faea1e2a5c0220098aec9082f3a6e5bsalomon@google.com GrCoordSet coordSet) 25277af6805e5faea1e2a5c0220098aec9082f3a6e5bsalomon@google.com : GrSingleTextureEffect(texture, matrix, filterMode, coordSet) 253907fbd53c5e5dd4cbde7b72f9242b51febd7ef95commit-bot@chromium.org , fTextureDomain(domain, mode) { 2545ae5fc59b27a48711e514b3ede548b228e393e9bjoshualitt SkASSERT(mode != GrTextureDomain::kRepeat_Mode || 2555ae5fc59b27a48711e514b3ede548b228e393e9bjoshualitt filterMode == GrTextureParams::kNone_FilterMode); 2561ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com} 2571ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com 2582f68e7684bb2ecdf0c03a513c31d0626d2caf752tomhudson@google.comGrTextureDomainEffect::~GrTextureDomainEffect() { 2592f68e7684bb2ecdf0c03a513c31d0626d2caf752tomhudson@google.com 2602f68e7684bb2ecdf0c03a513c31d0626d2caf752tomhudson@google.com} 2612f68e7684bb2ecdf0c03a513c31d0626d2caf752tomhudson@google.com 262b0a8a377f832c59cee939ad721e1f87d378b7142joshualittconst GrBackendFragmentProcessorFactory& GrTextureDomainEffect::getFactory() const { 263b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt return GrTBackendFragmentProcessorFactory<GrTextureDomainEffect>::getInstance(); 2642f68e7684bb2ecdf0c03a513c31d0626d2caf752tomhudson@google.com} 2652f68e7684bb2ecdf0c03a513c31d0626d2caf752tomhudson@google.com 266b0a8a377f832c59cee939ad721e1f87d378b7142joshualittbool GrTextureDomainEffect::onIsEqual(const GrProcessor& sBase) const { 26749586bec7383d4ccb81f85f8e2dc4162e2d4f6a8joshualitt const GrTextureDomainEffect& s = sBase.cast<GrTextureDomainEffect>(); 26877af6805e5faea1e2a5c0220098aec9082f3a6e5bsalomon@google.com return this->hasSameTextureParamsMatrixAndSourceCoords(s) && 269c78188896e28a4ae49e406a7422b345ae177dafebsalomon@google.com this->fTextureDomain == s.fTextureDomain; 27068b58c95384dd6c2fd389a5b4bbf8fc468819454bsalomon@google.com} 27168b58c95384dd6c2fd389a5b4bbf8fc468819454bsalomon@google.com 27268b58c95384dd6c2fd389a5b4bbf8fc468819454bsalomon@google.comvoid GrTextureDomainEffect::getConstantColorComponents(GrColor* color, uint32_t* validFlags) const { 273907fbd53c5e5dd4cbde7b72f9242b51febd7ef95commit-bot@chromium.org if (GrTextureDomain::kDecal_Mode == fTextureDomain.mode()) { // TODO: helper 27468b58c95384dd6c2fd389a5b4bbf8fc468819454bsalomon@google.com *validFlags = 0; 27568b58c95384dd6c2fd389a5b4bbf8fc468819454bsalomon@google.com } else { 27668b58c95384dd6c2fd389a5b4bbf8fc468819454bsalomon@google.com this->updateConstantColorComponentsForModulation(color, validFlags); 27768b58c95384dd6c2fd389a5b4bbf8fc468819454bsalomon@google.com } 2782f68e7684bb2ecdf0c03a513c31d0626d2caf752tomhudson@google.com} 2790a7672f85ef7655b343679609d02018f83fcfc23bsalomon@google.com 2800a7672f85ef7655b343679609d02018f83fcfc23bsalomon@google.com/////////////////////////////////////////////////////////////////////////////// 2810a7672f85ef7655b343679609d02018f83fcfc23bsalomon@google.com 282b0a8a377f832c59cee939ad721e1f87d378b7142joshualittGR_DEFINE_FRAGMENT_PROCESSOR_TEST(GrTextureDomainEffect); 2830a7672f85ef7655b343679609d02018f83fcfc23bsalomon@google.com 284b0a8a377f832c59cee939ad721e1f87d378b7142joshualittGrFragmentProcessor* GrTextureDomainEffect::TestCreate(SkRandom* random, 285b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt GrContext*, 286b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt const GrDrawTargetCaps&, 287b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt GrTexture* textures[]) { 288b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt int texIdx = random->nextBool() ? GrProcessorUnitTest::kSkiaPMTextureIdx : 289b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt GrProcessorUnitTest::kAlphaTextureIdx; 290fd03d4a829efe2d77a712fd991927c55f59a2ffecommit-bot@chromium.org SkRect domain; 2910a7672f85ef7655b343679609d02018f83fcfc23bsalomon@google.com domain.fLeft = random->nextUScalar1(); 2920a7672f85ef7655b343679609d02018f83fcfc23bsalomon@google.com domain.fRight = random->nextRangeScalar(domain.fLeft, SK_Scalar1); 2930a7672f85ef7655b343679609d02018f83fcfc23bsalomon@google.com domain.fTop = random->nextUScalar1(); 2940a7672f85ef7655b343679609d02018f83fcfc23bsalomon@google.com domain.fBottom = random->nextRangeScalar(domain.fTop, SK_Scalar1); 295907fbd53c5e5dd4cbde7b72f9242b51febd7ef95commit-bot@chromium.org GrTextureDomain::Mode mode = 296907fbd53c5e5dd4cbde7b72f9242b51febd7ef95commit-bot@chromium.org (GrTextureDomain::Mode) random->nextULessThan(GrTextureDomain::kModeCount); 297b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt const SkMatrix& matrix = GrProcessorUnitTest::TestMatrix(random); 2985ae5fc59b27a48711e514b3ede548b228e393e9bjoshualitt bool bilerp = mode != GrTextureDomain::kRepeat_Mode ? random->nextBool() : false; 29977af6805e5faea1e2a5c0220098aec9082f3a6e5bsalomon@google.com GrCoordSet coords = random->nextBool() ? kLocal_GrCoordSet : kPosition_GrCoordSet; 300c78188896e28a4ae49e406a7422b345ae177dafebsalomon@google.com return GrTextureDomainEffect::Create(textures[texIdx], 301c78188896e28a4ae49e406a7422b345ae177dafebsalomon@google.com matrix, 302c78188896e28a4ae49e406a7422b345ae177dafebsalomon@google.com domain, 303907fbd53c5e5dd4cbde7b72f9242b51febd7ef95commit-bot@chromium.org mode, 304b86add1ad37776818e1f730359ec587c9fdbff5fhumper@google.com bilerp ? GrTextureParams::kBilerp_FilterMode : GrTextureParams::kNone_FilterMode, 305c78188896e28a4ae49e406a7422b345ae177dafebsalomon@google.com coords); 3060a7672f85ef7655b343679609d02018f83fcfc23bsalomon@google.com} 307