2 * Copyright 2014 Google Inc.
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
8 #include "GrGLGeometryShaderBuilder.h"
9 #include "GrGLShaderStringBuilder.h"
10 #include "GrGLProgramBuilder.h"
11 #include "../GrGpuGL.h"
13 GrGLGeometryBuilder::GrGLGeometryBuilder(GrGLProgramBuilder* program)
14 : INHERITED(program) {
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.
23 fInputs.back().setType(v->fType);
24 fInputs.back().setTypeModifier(GrGLShaderVar::kVaryingIn_TypeModifier);
25 fInputs.back().setUnsizedArray();
26 *fInputs.back().accessName() = v->fVsOut;
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();
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");
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());
60 geomShaderSrc.append("\t\tEmitVertex();\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());
71 *shaderIds->append() = geomShaderId;