Update To 11.40.268.0
[platform/framework/web/crosswalk.git] / src / third_party / skia / src / gpu / effects / GrCustomCoordsTextureEffect.cpp
1 /*
2  * Copyright 2013 Google Inc.
3  *
4  * Use of this source code is governed by a BSD-style license that can be
5  * found in the LICENSE file.
6  */
7
8 #include "GrCustomCoordsTextureEffect.h"
9 #include "gl/builders/GrGLProgramBuilder.h"
10 #include "gl/GrGLProcessor.h"
11 #include "gl/GrGLSL.h"
12 #include "gl/GrGLTexture.h"
13 #include "gl/GrGLGeometryProcessor.h"
14 #include "GrTBackendProcessorFactory.h"
15 #include "GrTexture.h"
16
17 class GrGLCustomCoordsTextureEffect : public GrGLGeometryProcessor {
18 public:
19     GrGLCustomCoordsTextureEffect(const GrBackendProcessorFactory& factory, const GrProcessor&)
20         : INHERITED (factory) {}
21
22     virtual void emitCode(const EmitArgs& args) SK_OVERRIDE {
23         const GrCustomCoordsTextureEffect& customCoordsTextureEffect =
24                 args.fGP.cast<GrCustomCoordsTextureEffect>();
25         SkASSERT(1 == customCoordsTextureEffect.getVertexAttribs().count());
26
27         GrGLVertToFrag v(kVec2f_GrSLType);
28         args.fPB->addVarying("TextureCoords", &v);
29
30         GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder();
31         const GrShaderVar& inTextureCoords = customCoordsTextureEffect.inTextureCoords();
32         vsBuilder->codeAppendf("%s = %s;", v.vsOut(), inTextureCoords.c_str());
33
34         GrGLGPFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder();
35         fsBuilder->codeAppendf("%s = ", args.fOutput);
36         fsBuilder->appendTextureLookupAndModulate(args.fInput,
37                                                   args.fSamplers[0],
38                                                   v.fsIn(),
39                                                   kVec2f_GrSLType);
40         fsBuilder->codeAppend(";");
41     }
42
43     virtual void setData(const GrGLProgramDataManager&,
44                          const GrProcessor&) SK_OVERRIDE {}
45
46 private:
47     typedef GrGLGeometryProcessor INHERITED;
48 };
49
50 ///////////////////////////////////////////////////////////////////////////////
51
52 GrCustomCoordsTextureEffect::GrCustomCoordsTextureEffect(GrTexture* texture,
53                                                          const GrTextureParams& params)
54     : fTextureAccess(texture, params)
55     , fInTextureCoords(this->addVertexAttrib(GrShaderVar("inTextureCoords",
56                                                          kVec2f_GrSLType,
57                                                          GrShaderVar::kAttribute_TypeModifier))) {
58     this->addTextureAccess(&fTextureAccess);
59 }
60
61 bool GrCustomCoordsTextureEffect::onIsEqual(const GrGeometryProcessor& other) const {
62     return true;
63 }
64
65 void GrCustomCoordsTextureEffect::onComputeInvariantOutput(InvariantOutput* inout) const {
66     if (GrPixelConfigIsOpaque(this->texture(0)->config())) {
67         inout->mulByUnknownOpaqueColor();
68     } else {
69         inout->mulByUnknownColor();
70     }
71 }
72
73 const GrBackendGeometryProcessorFactory& GrCustomCoordsTextureEffect::getFactory() const {
74     return GrTBackendGeometryProcessorFactory<GrCustomCoordsTextureEffect>::getInstance();
75 }
76
77 ///////////////////////////////////////////////////////////////////////////////
78
79 GR_DEFINE_GEOMETRY_PROCESSOR_TEST(GrCustomCoordsTextureEffect);
80
81 GrGeometryProcessor* GrCustomCoordsTextureEffect::TestCreate(SkRandom* random,
82                                                              GrContext*,
83                                                              const GrDrawTargetCaps&,
84                                                              GrTexture* textures[]) {
85     int texIdx = random->nextBool() ? GrProcessorUnitTest::kSkiaPMTextureIdx :
86                                       GrProcessorUnitTest::kAlphaTextureIdx;
87     static const SkShader::TileMode kTileModes[] = {
88         SkShader::kClamp_TileMode,
89         SkShader::kRepeat_TileMode,
90         SkShader::kMirror_TileMode,
91     };
92     SkShader::TileMode tileModes[] = {
93         kTileModes[random->nextULessThan(SK_ARRAY_COUNT(kTileModes))],
94         kTileModes[random->nextULessThan(SK_ARRAY_COUNT(kTileModes))],
95     };
96     GrTextureParams params(tileModes, random->nextBool() ? GrTextureParams::kBilerp_FilterMode :
97                                                            GrTextureParams::kNone_FilterMode);
98
99     return GrCustomCoordsTextureEffect::Create(textures[texIdx], params);
100 }