168b58c95384dd6c2fd389a5b4bbf8fc468819454bsalomon@google.com/*
268b58c95384dd6c2fd389a5b4bbf8fc468819454bsalomon@google.com * Copyright 2012 Google Inc.
368b58c95384dd6c2fd389a5b4bbf8fc468819454bsalomon@google.com *
468b58c95384dd6c2fd389a5b4bbf8fc468819454bsalomon@google.com * Use of this source code is governed by a BSD-style license that can be
568b58c95384dd6c2fd389a5b4bbf8fc468819454bsalomon@google.com * found in the LICENSE file.
668b58c95384dd6c2fd389a5b4bbf8fc468819454bsalomon@google.com */
768b58c95384dd6c2fd389a5b4bbf8fc468819454bsalomon@google.com
830ba436f04e61d4505fb854d5fc56079636e0788joshualitt#include "gl/builders/GrGLProgramBuilder.h"
968b58c95384dd6c2fd389a5b4bbf8fc468819454bsalomon@google.com#include "GrSimpleTextureEffect.h"
10b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt#include "gl/GrGLProcessor.h"
1168b58c95384dd6c2fd389a5b4bbf8fc468819454bsalomon@google.com#include "gl/GrGLSL.h"
1268b58c95384dd6c2fd389a5b4bbf8fc468819454bsalomon@google.com#include "gl/GrGLTexture.h"
13b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt#include "GrTBackendProcessorFactory.h"
1468b58c95384dd6c2fd389a5b4bbf8fc468819454bsalomon@google.com#include "GrTexture.h"
1568b58c95384dd6c2fd389a5b4bbf8fc468819454bsalomon@google.com
16b0a8a377f832c59cee939ad721e1f87d378b7142joshualittclass GrGLSimpleTextureEffect : public GrGLFragmentProcessor {
1768b58c95384dd6c2fd389a5b4bbf8fc468819454bsalomon@google.compublic:
18b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt    GrGLSimpleTextureEffect(const GrBackendProcessorFactory& factory, const GrProcessor&)
1977af6805e5faea1e2a5c0220098aec9082f3a6e5bsalomon@google.com        : INHERITED (factory) {
20c78188896e28a4ae49e406a7422b345ae177dafebsalomon@google.com    }
2168b58c95384dd6c2fd389a5b4bbf8fc468819454bsalomon@google.com
2230ba436f04e61d4505fb854d5fc56079636e0788joshualitt    virtual void emitCode(GrGLProgramBuilder* builder,
23b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt                          const GrFragmentProcessor& fp,
24b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt                          const GrProcessorKey& key,
2568b58c95384dd6c2fd389a5b4bbf8fc468819454bsalomon@google.com                          const char* outputColor,
2668b58c95384dd6c2fd389a5b4bbf8fc468819454bsalomon@google.com                          const char* inputColor,
2777af6805e5faea1e2a5c0220098aec9082f3a6e5bsalomon@google.com                          const TransformedCoordsArray& coords,
2868b58c95384dd6c2fd389a5b4bbf8fc468819454bsalomon@google.com                          const TextureSamplerArray& samplers) SK_OVERRIDE {
2930ba436f04e61d4505fb854d5fc56079636e0788joshualitt        GrGLFragmentShaderBuilder* fsBuilder = builder->getFragmentShaderBuilder();
3030ba436f04e61d4505fb854d5fc56079636e0788joshualitt        fsBuilder->codeAppendf("\t%s = ", outputColor);
3130ba436f04e61d4505fb854d5fc56079636e0788joshualitt        fsBuilder->appendTextureLookupAndModulate(inputColor,
3274a3a2135ca82ab9324b7e499caa3280348a4fdacommit-bot@chromium.org                                                  samplers[0],
3377af6805e5faea1e2a5c0220098aec9082f3a6e5bsalomon@google.com                                                  coords[0].c_str(),
3423e280d1f227d94f6b3dfd0b47359cca1569e1b4joshualitt                                                  coords[0].getType());
3530ba436f04e61d4505fb854d5fc56079636e0788joshualitt        fsBuilder->codeAppend(";\n");
3668b58c95384dd6c2fd389a5b4bbf8fc468819454bsalomon@google.com    }
3768b58c95384dd6c2fd389a5b4bbf8fc468819454bsalomon@google.com
3868b58c95384dd6c2fd389a5b4bbf8fc468819454bsalomon@google.comprivate:
39b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt    typedef GrGLFragmentProcessor INHERITED;
4068b58c95384dd6c2fd389a5b4bbf8fc468819454bsalomon@google.com};
4168b58c95384dd6c2fd389a5b4bbf8fc468819454bsalomon@google.com
4268b58c95384dd6c2fd389a5b4bbf8fc468819454bsalomon@google.com///////////////////////////////////////////////////////////////////////////////
4368b58c95384dd6c2fd389a5b4bbf8fc468819454bsalomon@google.com
4468b58c95384dd6c2fd389a5b4bbf8fc468819454bsalomon@google.comvoid GrSimpleTextureEffect::getConstantColorComponents(GrColor* color, uint32_t* validFlags) const {
4568b58c95384dd6c2fd389a5b4bbf8fc468819454bsalomon@google.com    this->updateConstantColorComponentsForModulation(color, validFlags);
4668b58c95384dd6c2fd389a5b4bbf8fc468819454bsalomon@google.com}
4768b58c95384dd6c2fd389a5b4bbf8fc468819454bsalomon@google.com
48b0a8a377f832c59cee939ad721e1f87d378b7142joshualittconst GrBackendFragmentProcessorFactory& GrSimpleTextureEffect::getFactory() const {
49b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt    return GrTBackendFragmentProcessorFactory<GrSimpleTextureEffect>::getInstance();
5068b58c95384dd6c2fd389a5b4bbf8fc468819454bsalomon@google.com}
5168b58c95384dd6c2fd389a5b4bbf8fc468819454bsalomon@google.com
5268b58c95384dd6c2fd389a5b4bbf8fc468819454bsalomon@google.com///////////////////////////////////////////////////////////////////////////////
5368b58c95384dd6c2fd389a5b4bbf8fc468819454bsalomon@google.com
54b0a8a377f832c59cee939ad721e1f87d378b7142joshualittGR_DEFINE_FRAGMENT_PROCESSOR_TEST(GrSimpleTextureEffect);
5568b58c95384dd6c2fd389a5b4bbf8fc468819454bsalomon@google.com
56b0a8a377f832c59cee939ad721e1f87d378b7142joshualittGrFragmentProcessor* GrSimpleTextureEffect::TestCreate(SkRandom* random,
57b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt                                                       GrContext*,
58b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt                                                       const GrDrawTargetCaps&,
59b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt                                                       GrTexture* textures[]) {
60b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt    int texIdx = random->nextBool() ? GrProcessorUnitTest::kSkiaPMTextureIdx :
61b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt                                      GrProcessorUnitTest::kAlphaTextureIdx;
62c78188896e28a4ae49e406a7422b345ae177dafebsalomon@google.com    static const SkShader::TileMode kTileModes[] = {
63c78188896e28a4ae49e406a7422b345ae177dafebsalomon@google.com        SkShader::kClamp_TileMode,
64c78188896e28a4ae49e406a7422b345ae177dafebsalomon@google.com        SkShader::kRepeat_TileMode,
65c78188896e28a4ae49e406a7422b345ae177dafebsalomon@google.com        SkShader::kMirror_TileMode,
66c78188896e28a4ae49e406a7422b345ae177dafebsalomon@google.com    };
67c78188896e28a4ae49e406a7422b345ae177dafebsalomon@google.com    SkShader::TileMode tileModes[] = {
68c78188896e28a4ae49e406a7422b345ae177dafebsalomon@google.com        kTileModes[random->nextULessThan(SK_ARRAY_COUNT(kTileModes))],
69c78188896e28a4ae49e406a7422b345ae177dafebsalomon@google.com        kTileModes[random->nextULessThan(SK_ARRAY_COUNT(kTileModes))],
70c78188896e28a4ae49e406a7422b345ae177dafebsalomon@google.com    };
71b86add1ad37776818e1f730359ec587c9fdbff5fhumper@google.com    GrTextureParams params(tileModes, random->nextBool() ? GrTextureParams::kBilerp_FilterMode :
72b86add1ad37776818e1f730359ec587c9fdbff5fhumper@google.com                                                           GrTextureParams::kNone_FilterMode);
73c78188896e28a4ae49e406a7422b345ae177dafebsalomon@google.com
7477af6805e5faea1e2a5c0220098aec9082f3a6e5bsalomon@google.com    static const GrCoordSet kCoordSets[] = {
7577af6805e5faea1e2a5c0220098aec9082f3a6e5bsalomon@google.com        kLocal_GrCoordSet,
7677af6805e5faea1e2a5c0220098aec9082f3a6e5bsalomon@google.com        kPosition_GrCoordSet
77c78188896e28a4ae49e406a7422b345ae177dafebsalomon@google.com    };
78972f9cd7a063d0544f8c919fd12b9a3adbd12b24commit-bot@chromium.org    GrCoordSet coordSet = kCoordSets[random->nextULessThan(SK_ARRAY_COUNT(kCoordSets))];
79c78188896e28a4ae49e406a7422b345ae177dafebsalomon@google.com
80b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt    const SkMatrix& matrix = GrProcessorUnitTest::TestMatrix(random);
8177af6805e5faea1e2a5c0220098aec9082f3a6e5bsalomon@google.com    return GrSimpleTextureEffect::Create(textures[texIdx], matrix, coordSet);
8268b58c95384dd6c2fd389a5b4bbf8fc468819454bsalomon@google.com}
83