1fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/* 2fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Copyright 2012 Google Inc. 3fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * 4fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Use of this source code is governed by a BSD-style license that can be 5fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * found in the LICENSE file. 6fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */ 7fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 8fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#ifndef GrGLProgramDataManager_DEFINED 9fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#define GrGLProgramDataManager_DEFINED 10fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 11fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "GrAllocator.h" 12fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "GrShaderVar.h" 13fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "gl/GrGLTypes.h" 14fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "glsl/GrGLSLProgramDataManager.h" 15fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 16fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkTArray.h" 17fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 18fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass GrGLGpu; 19fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass SkMatrix; 20fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass GrGLProgram; 21fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 22fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/** Manages the resources used by a shader program. 23fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * The resources are objects the program uses to communicate with the 24fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * application code. 25fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */ 26fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass GrGLProgramDataManager : public GrGLSLProgramDataManager { 27fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic: 28fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot struct UniformInfo { 29fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot GrShaderVar fVariable; 30fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot uint32_t fVisibility; 31fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot GrGLint fLocation; 32fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot }; 33fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 34fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot struct VaryingInfo { 35fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot GrShaderVar fVariable; 36fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot GrGLint fLocation; 37fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot }; 38fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 39fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // This uses an allocator rather than array so that the GrShaderVars don't move in memory 40fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // after they are inserted. Users of GrGLShaderBuilder get refs to the vars and ptrs to their 41fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // name strings. Otherwise, we'd have to hand out copies. 42fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot typedef GrTAllocator<UniformInfo> UniformInfoArray; 43fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot typedef GrTAllocator<VaryingInfo> VaryingInfoArray; 44fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 45fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot GrGLProgramDataManager(GrGLGpu*, GrGLuint programID, const UniformInfoArray&, 46fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const VaryingInfoArray&); 47fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 48fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void setSamplerUniforms(const UniformInfoArray& samplers, int startUnit) const; 49fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 50fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot /** Functions for uploading uniform values. The varities ending in v can be used to upload to an 51fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * array of uniforms. arrayCount must be <= the array count of the uniform. 52fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */ 53fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void set1i(UniformHandle, int32_t) const override; 54fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void set1iv(UniformHandle, int arrayCount, const int v[]) const override; 55fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void set1f(UniformHandle, float v0) const override; 56fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void set1fv(UniformHandle, int arrayCount, const float v[]) const override; 57fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void set2f(UniformHandle, float, float) const override; 58fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void set2fv(UniformHandle, int arrayCount, const float v[]) const override; 59fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void set3f(UniformHandle, float, float, float) const override; 60fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void set3fv(UniformHandle, int arrayCount, const float v[]) const override; 61fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void set4f(UniformHandle, float, float, float, float) const override; 62fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void set4fv(UniformHandle, int arrayCount, const float v[]) const override; 63fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // matrices are column-major, the first three upload a single matrix, the latter three upload 64fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // arrayCount matrices into a uniform array. 65fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void setMatrix2f(UniformHandle, const float matrix[]) const override; 66fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void setMatrix3f(UniformHandle, const float matrix[]) const override; 67fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void setMatrix4f(UniformHandle, const float matrix[]) const override; 68fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void setMatrix2fv(UniformHandle, int arrayCount, const float matrices[]) const override; 69fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void setMatrix3fv(UniformHandle, int arrayCount, const float matrices[]) const override; 70fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void setMatrix4fv(UniformHandle, int arrayCount, const float matrices[]) const override; 71fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 72fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // for nvpr only 73fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void setPathFragmentInputTransform(VaryingHandle u, int components, 74fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const SkMatrix& matrix) const override; 75fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 76fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate: 77fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot enum { 78fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot kUnusedUniform = -1, 79fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot }; 80fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 81fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot struct Uniform { 82fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot GrGLint fLocation; 83fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#ifdef SK_DEBUG 84fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot GrSLType fType; 85fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot int fArrayCount; 86fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#endif 87fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot }; 88fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 89fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot enum { 90fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot kUnusedPathProcVarying = -1, 91fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot }; 92fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot struct PathProcVarying { 93fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot GrGLint fLocation; 94fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkDEBUGCODE( 95fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot GrSLType fType; 96fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot int fArrayCount; 97fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot ); 98fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot }; 99fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 100fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot template<int N> inline void setMatrices(UniformHandle, int arrayCount, 101fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const float matrices[]) const; 102fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 103fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkTArray<Uniform, true> fUniforms; 104fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkTArray<PathProcVarying, true> fPathProcVaryings; 105fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot GrGLGpu* fGpu; 106fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot GrGLuint fProgramID; 107fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 108fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot typedef GrGLSLProgramDataManager INHERITED; 109fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}; 110fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 111fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#endif 112