Update To 11.40.268.0
[platform/framework/web/crosswalk.git] / src / third_party / skia / src / gpu / gl / builders / GrGLGeometryShaderBuilder.cpp
1 /*
2  * Copyright 2014 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 "GrGLGeometryShaderBuilder.h"
9 #include "GrGLShaderStringBuilder.h"
10 #include "GrGLProgramBuilder.h"
11 #include "../GrGpuGL.h"
12
13 GrGLGeometryBuilder::GrGLGeometryBuilder(GrGLProgramBuilder* program)
14     : INHERITED(program) {
15
16 }
17
18 void GrGLGeometryBuilder::addVarying(const char* name, GrGLVarying* v) {
19     // if we have a GS take each varying in as an array
20     // and output as non-array.
21     if (v->vsVarying()) {
22         fInputs.push_back();
23         fInputs.back().setType(v->fType);
24         fInputs.back().setTypeModifier(GrGLShaderVar::kVaryingIn_TypeModifier);
25         fInputs.back().setUnsizedArray();
26         *fInputs.back().accessName() = v->fVsOut;
27         v->fGsIn = v->fVsOut;
28     }
29
30     if (v->fsVarying()) {
31         fOutputs.push_back();
32         fOutputs.back().setType(v->fType);
33         fOutputs.back().setTypeModifier(GrGLShaderVar::kVaryingOut_TypeModifier);
34         fProgramBuilder->nameVariable(fOutputs.back().accessName(), 'g', name);
35         v->fGsOut = fOutputs.back().getName().c_str();
36     }
37 }
38
39 bool GrGLGeometryBuilder::compileAndAttachShaders(GrGLuint programId,
40         SkTDArray<GrGLuint>* shaderIds) const {
41     const GrGLContext& glCtx = fProgramBuilder->gpu()->glContext();
42     SkASSERT(fProgramBuilder->ctxInfo().glslGeneration() >= k150_GrGLSLGeneration);
43     SkString geomShaderSrc(GrGetGLSLVersionDecl(fProgramBuilder->ctxInfo()));
44     geomShaderSrc.append("layout(triangles) in;\n"
45                          "layout(triangle_strip, max_vertices = 6) out;\n");
46     this->appendDecls(fInputs, &geomShaderSrc);
47     this->appendDecls(fOutputs, &geomShaderSrc);
48     geomShaderSrc.append("void main() {\n");
49     geomShaderSrc.append("\tfor (int i = 0; i < 3; ++i) {\n"
50                          "\t\tgl_Position = gl_in[i].gl_Position;\n");
51     if (fProgramBuilder->desc().header().fEmitsPointSize) {
52         geomShaderSrc.append("\t\tgl_PointSize = 1.0;\n");
53     }
54     SkASSERT(fInputs.count() == fOutputs.count());
55     for (int i = 0; i < fInputs.count(); ++i) {
56         geomShaderSrc.appendf("\t\t%s = %s[i];\n",
57                               fOutputs[i].getName().c_str(),
58                               fInputs[i].getName().c_str());
59     }
60     geomShaderSrc.append("\t\tEmitVertex();\n"
61                          "\t}\n"
62                          "\tEndPrimitive();\n");
63     geomShaderSrc.append("}\n");
64     GrGLuint geomShaderId =
65         GrGLCompileAndAttachShader(glCtx, programId,
66                                    GR_GL_GEOMETRY_SHADER, geomShaderSrc,
67                                    fProgramBuilder->gpu()->gpuStats());
68     if (!geomShaderId) {
69         return false;
70     }
71     *shaderIds->append() = geomShaderId;
72     return true;
73 }