GrSingleTextureEffect.cpp revision 1ce49fc91714ce8974d11246d29ebe7b97b5fe98
1d0c1a06cb98dd4a009dfa79e37ba6ca23a8c180btomhudson@google.com/*
2d0c1a06cb98dd4a009dfa79e37ba6ca23a8c180btomhudson@google.com * Copyright 2012 Google Inc.
3d0c1a06cb98dd4a009dfa79e37ba6ca23a8c180btomhudson@google.com *
4d0c1a06cb98dd4a009dfa79e37ba6ca23a8c180btomhudson@google.com * Use of this source code is governed by a BSD-style license that can be
5d0c1a06cb98dd4a009dfa79e37ba6ca23a8c180btomhudson@google.com * found in the LICENSE file.
6d0c1a06cb98dd4a009dfa79e37ba6ca23a8c180btomhudson@google.com */
7d0c1a06cb98dd4a009dfa79e37ba6ca23a8c180btomhudson@google.com
8d0c1a06cb98dd4a009dfa79e37ba6ca23a8c180btomhudson@google.com#include "effects/GrSingleTextureEffect.h"
9aa72eab5d82d4c2aa9f6f41755a001282443b042tomhudson@google.com#include "gl/GrGLProgramStage.h"
10aa72eab5d82d4c2aa9f6f41755a001282443b042tomhudson@google.com#include "gl/GrGLSL.h"
11aa72eab5d82d4c2aa9f6f41755a001282443b042tomhudson@google.com#include "gl/GrGLTexture.h"
12aa72eab5d82d4c2aa9f6f41755a001282443b042tomhudson@google.com#include "GrProgramStageFactory.h"
13d0c1a06cb98dd4a009dfa79e37ba6ca23a8c180btomhudson@google.com#include "GrTexture.h"
14d0c1a06cb98dd4a009dfa79e37ba6ca23a8c180btomhudson@google.com
15aa72eab5d82d4c2aa9f6f41755a001282443b042tomhudson@google.comclass GrGLSingleTextureEffect : public GrGLProgramStage {
16aa72eab5d82d4c2aa9f6f41755a001282443b042tomhudson@google.compublic:
17aa72eab5d82d4c2aa9f6f41755a001282443b042tomhudson@google.com    GrGLSingleTextureEffect(const GrProgramStageFactory& factory,
18aa72eab5d82d4c2aa9f6f41755a001282443b042tomhudson@google.com                            const GrCustomStage& stage) : INHERITED (factory) { }
19aa72eab5d82d4c2aa9f6f41755a001282443b042tomhudson@google.com
20aa72eab5d82d4c2aa9f6f41755a001282443b042tomhudson@google.com    virtual void emitVS(GrGLShaderBuilder* builder,
21aa72eab5d82d4c2aa9f6f41755a001282443b042tomhudson@google.com                        const char* vertexCoords) SK_OVERRIDE { }
22aa72eab5d82d4c2aa9f6f41755a001282443b042tomhudson@google.com    virtual void emitFS(GrGLShaderBuilder* builder,
23aa72eab5d82d4c2aa9f6f41755a001282443b042tomhudson@google.com                        const char* outputColor,
24aa72eab5d82d4c2aa9f6f41755a001282443b042tomhudson@google.com                        const char* inputColor,
25f06df1bb9ab201a78bfc906a9e95326c6e15a119bsalomon@google.com                        const TextureSamplerArray& samplers) SK_OVERRIDE {
26868a8e7fc83e9ac6ee1418e75b84a0595605626cbsalomon@google.com        builder->fFSCode.appendf("\t%s = ", outputColor);
27f06df1bb9ab201a78bfc906a9e95326c6e15a119bsalomon@google.com        builder->appendTextureLookupAndModulate(&builder->fFSCode, inputColor, samplers[0]);
28868a8e7fc83e9ac6ee1418e75b84a0595605626cbsalomon@google.com        builder->fFSCode.append(";\n");
29aa72eab5d82d4c2aa9f6f41755a001282443b042tomhudson@google.com    }
30aa72eab5d82d4c2aa9f6f41755a001282443b042tomhudson@google.com
31a5e65ec434fed44dc616e4f64950b835b541181btwiz@google.com    static inline StageKey GenKey(const GrCustomStage&, const GrGLCaps&) { return 0; }
32aa72eab5d82d4c2aa9f6f41755a001282443b042tomhudson@google.com
33aa72eab5d82d4c2aa9f6f41755a001282443b042tomhudson@google.comprivate:
34aa72eab5d82d4c2aa9f6f41755a001282443b042tomhudson@google.com
35aa72eab5d82d4c2aa9f6f41755a001282443b042tomhudson@google.com    typedef GrGLProgramStage INHERITED;
36aa72eab5d82d4c2aa9f6f41755a001282443b042tomhudson@google.com};
37aa72eab5d82d4c2aa9f6f41755a001282443b042tomhudson@google.com
38aa72eab5d82d4c2aa9f6f41755a001282443b042tomhudson@google.com///////////////////////////////////////////////////////////////////////////////
39aa72eab5d82d4c2aa9f6f41755a001282443b042tomhudson@google.com
40d0c1a06cb98dd4a009dfa79e37ba6ca23a8c180btomhudson@google.comGrSingleTextureEffect::GrSingleTextureEffect(GrTexture* texture)
416d003d1ddced3e71684b8b3785d1e5a16255688dbsalomon@google.com    : fTextureAccess(texture) {
42d0c1a06cb98dd4a009dfa79e37ba6ca23a8c180btomhudson@google.com}
43d0c1a06cb98dd4a009dfa79e37ba6ca23a8c180btomhudson@google.com
441ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.comGrSingleTextureEffect::GrSingleTextureEffect(GrTexture* texture, bool bilerp)
451ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com    : fTextureAccess(texture, bilerp) {
461ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com}
471ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com
481ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.comGrSingleTextureEffect::GrSingleTextureEffect(GrTexture* texture, const GrTextureParams& params)
491ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com    : fTextureAccess(texture, params) {
501ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com}
511ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com
52d0c1a06cb98dd4a009dfa79e37ba6ca23a8c180btomhudson@google.comGrSingleTextureEffect::~GrSingleTextureEffect() {
53d0c1a06cb98dd4a009dfa79e37ba6ca23a8c180btomhudson@google.com}
54d0c1a06cb98dd4a009dfa79e37ba6ca23a8c180btomhudson@google.com
556d003d1ddced3e71684b8b3785d1e5a16255688dbsalomon@google.comint GrSingleTextureEffect::numTextures() const {
56d0c1a06cb98dd4a009dfa79e37ba6ca23a8c180btomhudson@google.com    return 1;
57d0c1a06cb98dd4a009dfa79e37ba6ca23a8c180btomhudson@google.com}
58d0c1a06cb98dd4a009dfa79e37ba6ca23a8c180btomhudson@google.com
596d003d1ddced3e71684b8b3785d1e5a16255688dbsalomon@google.comconst GrTextureAccess& GrSingleTextureEffect::textureAccess(int index) const {
60d0c1a06cb98dd4a009dfa79e37ba6ca23a8c180btomhudson@google.com    GrAssert(0 == index);
616d003d1ddced3e71684b8b3785d1e5a16255688dbsalomon@google.com    return fTextureAccess;
62d0c1a06cb98dd4a009dfa79e37ba6ca23a8c180btomhudson@google.com}
63d0c1a06cb98dd4a009dfa79e37ba6ca23a8c180btomhudson@google.com
64aa72eab5d82d4c2aa9f6f41755a001282443b042tomhudson@google.comconst GrProgramStageFactory& GrSingleTextureEffect::getFactory() const {
65aa72eab5d82d4c2aa9f6f41755a001282443b042tomhudson@google.com    return GrTProgramStageFactory<GrSingleTextureEffect>::getInstance();
66aa72eab5d82d4c2aa9f6f41755a001282443b042tomhudson@google.com}
670a7672f85ef7655b343679609d02018f83fcfc23bsalomon@google.com
680a7672f85ef7655b343679609d02018f83fcfc23bsalomon@google.com///////////////////////////////////////////////////////////////////////////////
690a7672f85ef7655b343679609d02018f83fcfc23bsalomon@google.com
700a7672f85ef7655b343679609d02018f83fcfc23bsalomon@google.comGR_DEFINE_CUSTOM_STAGE_TEST(GrSingleTextureEffect);
710a7672f85ef7655b343679609d02018f83fcfc23bsalomon@google.com
720a7672f85ef7655b343679609d02018f83fcfc23bsalomon@google.comGrCustomStage* GrSingleTextureEffect::TestCreate(SkRandom* random,
730a7672f85ef7655b343679609d02018f83fcfc23bsalomon@google.com                                                 GrContext* context,
740a7672f85ef7655b343679609d02018f83fcfc23bsalomon@google.com                                                 GrTexture* textures[]) {
758d3d210e74e3058f28eb2e59b71cae717ed65996bsalomon@google.com    int texIdx = random->nextBool() ? GrCustomStageUnitTest::kSkiaPMTextureIdx :
768d3d210e74e3058f28eb2e59b71cae717ed65996bsalomon@google.com                                      GrCustomStageUnitTest::kAlphaTextureIdx;
770a7672f85ef7655b343679609d02018f83fcfc23bsalomon@google.com    return SkNEW_ARGS(GrSingleTextureEffect, (textures[texIdx]));
780a7672f85ef7655b343679609d02018f83fcfc23bsalomon@google.com}
79