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#ifndef GrGLProgramBuilder_DEFINED
9#define GrGLProgramBuilder_DEFINED
10
11#include "GrPipeline.h"
12#include "gl/GrGLProgramDataManager.h"
13#include "gl/GrGLUniformHandler.h"
14#include "gl/GrGLVaryingHandler.h"
15#include "glsl/GrGLSLProgramBuilder.h"
16#include "glsl/GrGLSLProgramDataManager.h"
17
18class GrFragmentProcessor;
19class GrGLContextInfo;
20class GrGLSLShaderBuilder;
21class GrGLSLCaps;
22
23class GrGLProgramBuilder : public GrGLSLProgramBuilder {
24public:
25    /** Generates a shader program.
26     *
27     * The program implements what is specified in the stages given as input.
28     * After successful generation, the builder result objects are available
29     * to be used.
30     * @return true if generation was successful.
31     */
32    static GrGLProgram* CreateProgram(const DrawArgs&, GrGLGpu*);
33
34    const GrCaps* caps() const override;
35    const GrGLSLCaps* glslCaps() const override;
36
37    GrGLGpu* gpu() const { return fGpu; }
38
39private:
40    GrGLProgramBuilder(GrGLGpu*, const DrawArgs&);
41
42    void emitSamplers(const GrProcessor&,
43                      GrGLSLTextureSampler::TextureSamplerArray* outSamplers) override;
44
45    bool compileAndAttachShaders(GrGLSLShaderBuilder& shader,
46                                 GrGLuint programId,
47                                 GrGLenum type,
48                                 SkTDArray<GrGLuint>* shaderIds);
49    GrGLProgram* finalize();
50    void bindProgramResourceLocations(GrGLuint programID);
51    bool checkLinkStatus(GrGLuint programID);
52    void resolveProgramResourceLocations(GrGLuint programID);
53    void cleanupProgram(GrGLuint programID, const SkTDArray<GrGLuint>& shaderIDs);
54    void cleanupShaders(const SkTDArray<GrGLuint>& shaderIDs);
55
56    // Subclasses create different programs
57    GrGLProgram* createProgram(GrGLuint programID);
58
59    GrGLSLUniformHandler* uniformHandler() override { return &fUniformHandler; }
60    const GrGLSLUniformHandler* uniformHandler() const override { return &fUniformHandler; }
61    GrGLSLVaryingHandler* varyingHandler() override { return &fVaryingHandler; }
62
63
64    GrGLGpu* fGpu;
65    typedef GrGLSLUniformHandler::UniformHandle UniformHandle;
66    SkTArray<UniformHandle> fSamplerUniforms;
67
68    GrGLVaryingHandler        fVaryingHandler;
69    GrGLUniformHandler        fUniformHandler;
70
71    typedef GrGLSLProgramBuilder INHERITED;
72};
73#endif
74