| /* |
| * Copyright 2014 Google Inc. |
| * |
| * Use of this source code is governed by a BSD-style license that can be |
| * found in the LICENSE file. |
| */ |
| |
| #ifndef GrGLProgramBuilder_DEFINED |
| #define GrGLProgramBuilder_DEFINED |
| |
| #include "GrPipeline.h" |
| #include "gl/GrGLProgram.h" |
| #include "gl/GrGLProgramDataManager.h" |
| #include "gl/GrGLUniformHandler.h" |
| #include "gl/GrGLVaryingHandler.h" |
| #include "glsl/GrGLSLProgramBuilder.h" |
| #include "glsl/GrGLSLProgramDataManager.h" |
| #include "ir/SkSLProgram.h" |
| |
| class GrFragmentProcessor; |
| class GrGLContextInfo; |
| class GrProgramDesc; |
| class GrGLSLShaderBuilder; |
| class GrShaderCaps; |
| |
| class GrGLProgramBuilder : public GrGLSLProgramBuilder { |
| public: |
| /** Generates a shader program. |
| * |
| * The program implements what is specified in the stages given as input. |
| * After successful generation, the builder result objects are available |
| * to be used. |
| * This function may modify the GrProgramDesc by setting the surface origin |
| * key to 0 (unspecified) if it turns out the program does not care about |
| * the surface origin. |
| * @return true if generation was successful. |
| */ |
| static GrGLProgram* CreateProgram(GrRenderTarget*, GrSurfaceOrigin, |
| const GrPrimitiveProcessor&, |
| const GrTextureProxy* const primProcProxies[], |
| const GrPipeline&, |
| GrProgramDesc*, |
| GrGLGpu*); |
| |
| const GrCaps* caps() const override; |
| |
| GrGLGpu* gpu() const { return fGpu; } |
| |
| private: |
| GrGLProgramBuilder(GrGLGpu*, GrRenderTarget*, GrSurfaceOrigin, |
| const GrPipeline&, const GrPrimitiveProcessor&, |
| const GrTextureProxy* const primProcProxies[], GrProgramDesc*); |
| |
| void addInputVars(const SkSL::Program::Inputs& inputs); |
| bool compileAndAttachShaders(const char* glsl, |
| int length, |
| GrGLuint programId, |
| GrGLenum type, |
| SkTDArray<GrGLuint>* shaderIds, |
| const SkSL::Program::Settings& settings, |
| const SkSL::Program::Inputs& inputs); |
| |
| void computeCountsAndStrides(GrGLuint programID, const GrPrimitiveProcessor& primProc, |
| bool bindAttribLocations); |
| void storeShaderInCache(const SkSL::Program::Inputs& inputs, GrGLuint programID, |
| const SkSL::String& glsl); |
| GrGLProgram* finalize(); |
| void bindProgramResourceLocations(GrGLuint programID); |
| bool checkLinkStatus(GrGLuint programID); |
| void resolveProgramResourceLocations(GrGLuint programID); |
| void cleanupProgram(GrGLuint programID, const SkTDArray<GrGLuint>& shaderIDs); |
| void cleanupShaders(const SkTDArray<GrGLuint>& shaderIDs); |
| |
| // Subclasses create different programs |
| GrGLProgram* createProgram(GrGLuint programID); |
| |
| GrGLSLUniformHandler* uniformHandler() override { return &fUniformHandler; } |
| const GrGLSLUniformHandler* uniformHandler() const override { return &fUniformHandler; } |
| GrGLSLVaryingHandler* varyingHandler() override { return &fVaryingHandler; } |
| |
| GrGLGpu* fGpu; |
| GrGLVaryingHandler fVaryingHandler; |
| GrGLUniformHandler fUniformHandler; |
| |
| std::unique_ptr<GrGLProgram::Attribute[]> fAttributes; |
| int fVertexAttributeCnt; |
| int fInstanceAttributeCnt; |
| size_t fVertexStride; |
| size_t fInstanceStride; |
| |
| // shader pulled from cache. Data is organized as: |
| // SkSL::Program::Inputs inputs |
| // int binaryFormat |
| // (all remaining bytes) char[] binary |
| sk_sp<SkData> fCached; |
| |
| typedef GrGLSLProgramBuilder INHERITED; |
| }; |
| #endif |