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