1dbbc4e2da93cef5c0cfb0b3c92ff6c2c80f6e67absalomon@google.com/* 2dbbc4e2da93cef5c0cfb0b3c92ff6c2c80f6e67absalomon@google.com * Copyright 2012 Google Inc. 3dbbc4e2da93cef5c0cfb0b3c92ff6c2c80f6e67absalomon@google.com * 4dbbc4e2da93cef5c0cfb0b3c92ff6c2c80f6e67absalomon@google.com * Use of this source code is governed by a BSD-style license that can be 5dbbc4e2da93cef5c0cfb0b3c92ff6c2c80f6e67absalomon@google.com * found in the LICENSE file. 6dbbc4e2da93cef5c0cfb0b3c92ff6c2c80f6e67absalomon@google.com */ 7dbbc4e2da93cef5c0cfb0b3c92ff6c2c80f6e67absalomon@google.com 87510b224e52b9518a8ddf7418db0e9c258f79539kkinnunen#ifndef GrGLProgramDataManager_DEFINED 97510b224e52b9518a8ddf7418db0e9c258f79539kkinnunen#define GrGLProgramDataManager_DEFINED 10dbbc4e2da93cef5c0cfb0b3c92ff6c2c80f6e67absalomon@google.com 11777c3aab0a902b0917871080d99b0a249ec06298bsalomon@google.com#include "GrAllocator.h" 1299938a8ef24e2dd5b39f78638742e9b50ab6d9bfBrian Salomon#include "GrShaderVar.h" 13f529439fea003851d986a0573a7e0465754b2a48egdaniel#include "gl/GrGLTypes.h" 1499938a8ef24e2dd5b39f78638742e9b50ab6d9bfBrian Salomon#include "glsl/GrGLSLProgramDataManager.h" 15dbbc4e2da93cef5c0cfb0b3c92ff6c2c80f6e67absalomon@google.com 16dbbc4e2da93cef5c0cfb0b3c92ff6c2c80f6e67absalomon@google.com#include "SkTArray.h" 17dbbc4e2da93cef5c0cfb0b3c92ff6c2c80f6e67absalomon@google.com 18861e1037017bbb7ac52ec5ebecab3a636a82a3e8bsalomonclass GrGLGpu; 19d8b5faca043100d7a1e4594b4d10e462532af390bsalomon@google.comclass SkMatrix; 20dddc18a6bba67ad43a65f4c244b95f76cefef617kkinnunenclass GrGLProgram; 21dbbc4e2da93cef5c0cfb0b3c92ff6c2c80f6e67absalomon@google.com 227510b224e52b9518a8ddf7418db0e9c258f79539kkinnunen/** Manages the resources used by a shader program. 237510b224e52b9518a8ddf7418db0e9c258f79539kkinnunen * The resources are objects the program uses to communicate with the 247510b224e52b9518a8ddf7418db0e9c258f79539kkinnunen * application code. 257510b224e52b9518a8ddf7418db0e9c258f79539kkinnunen */ 26018fb62d12d1febf121fe265da5b6117b86a6541egdanielclass GrGLProgramDataManager : public GrGLSLProgramDataManager { 27dbbc4e2da93cef5c0cfb0b3c92ff6c2c80f6e67absalomon@google.compublic: 2847bb38283072dc87dc93220cd2f370ca109972ffjoshualitt struct UniformInfo { 2999938a8ef24e2dd5b39f78638742e9b50ab6d9bfBrian Salomon GrShaderVar fVariable; 300d3f061262a53b775f0a92b0abf8a4a846290d65egdaniel uint32_t fVisibility; 310d3f061262a53b775f0a92b0abf8a4a846290d65egdaniel GrGLint fLocation; 32ec56e4545477e30d4f165ca55ed99f90525c6c38kkinnunen }; 33ec56e4545477e30d4f165ca55ed99f90525c6c38kkinnunen 340eafe79f42e3c675f3c504aed4a41abf511df2b7egdaniel struct VaryingInfo { 3599938a8ef24e2dd5b39f78638742e9b50ab6d9bfBrian Salomon GrShaderVar fVariable; 360d3f061262a53b775f0a92b0abf8a4a846290d65egdaniel GrGLint fLocation; 37d8dd47b5fa52430a1ab5c07335c0c13fcd43a82djoshualitt }; 38d8dd47b5fa52430a1ab5c07335c0c13fcd43a82djoshualitt 3999938a8ef24e2dd5b39f78638742e9b50ab6d9bfBrian Salomon // This uses an allocator rather than array so that the GrShaderVars don't move in memory 4047bb38283072dc87dc93220cd2f370ca109972ffjoshualitt // after they are inserted. Users of GrGLShaderBuilder get refs to the vars and ptrs to their 4147bb38283072dc87dc93220cd2f370ca109972ffjoshualitt // name strings. Otherwise, we'd have to hand out copies. 4247bb38283072dc87dc93220cd2f370ca109972ffjoshualitt typedef GrTAllocator<UniformInfo> UniformInfoArray; 430eafe79f42e3c675f3c504aed4a41abf511df2b7egdaniel typedef GrTAllocator<VaryingInfo> VaryingInfoArray; 4447bb38283072dc87dc93220cd2f370ca109972ffjoshualitt 45d8dd47b5fa52430a1ab5c07335c0c13fcd43a82djoshualitt GrGLProgramDataManager(GrGLGpu*, GrGLuint programID, const UniformInfoArray&, 460eafe79f42e3c675f3c504aed4a41abf511df2b7egdaniel const VaryingInfoArray&); 47dbbc4e2da93cef5c0cfb0b3c92ff6c2c80f6e67absalomon@google.com 48b800248c73c75b02ab808c5bdb53e19e6abc3adcegdaniel 49101b844d6ba031de5c4e95b43f9292f266799237Brian Salomon void setSamplers(const UniformInfoArray& samplers) const; 50f9f451213a3951d8a61568998de2ddbd643f6693Brian Salomon void setImageStorages(const UniformInfoArray &images) const; 5109aa1fce69b214714171db12c341aebd78dd29eaegdaniel 5209aa1fce69b214714171db12c341aebd78dd29eaegdaniel /** Functions for uploading uniform values. The varities ending in v can be used to upload to an 5309aa1fce69b214714171db12c341aebd78dd29eaegdaniel * array of uniforms. arrayCount must be <= the array count of the uniform. 5409aa1fce69b214714171db12c341aebd78dd29eaegdaniel */ 55497e9e2b3668fd8bc7fab16326e93c5cc6f0c287fmenozzi void set1i(UniformHandle, int32_t) const override; 5635a98c733fb69ab72623cfd62ee2ac9859b0c613fmenozzi void set1iv(UniformHandle, int arrayCount, const int v[]) const override; 57018fb62d12d1febf121fe265da5b6117b86a6541egdaniel void set1f(UniformHandle, float v0) const override; 58018fb62d12d1febf121fe265da5b6117b86a6541egdaniel void set1fv(UniformHandle, int arrayCount, const float v[]) const override; 59018fb62d12d1febf121fe265da5b6117b86a6541egdaniel void set2f(UniformHandle, float, float) const override; 60018fb62d12d1febf121fe265da5b6117b86a6541egdaniel void set2fv(UniformHandle, int arrayCount, const float v[]) const override; 61018fb62d12d1febf121fe265da5b6117b86a6541egdaniel void set3f(UniformHandle, float, float, float) const override; 62018fb62d12d1febf121fe265da5b6117b86a6541egdaniel void set3fv(UniformHandle, int arrayCount, const float v[]) const override; 63018fb62d12d1febf121fe265da5b6117b86a6541egdaniel void set4f(UniformHandle, float, float, float, float) const override; 64018fb62d12d1febf121fe265da5b6117b86a6541egdaniel void set4fv(UniformHandle, int arrayCount, const float v[]) const override; 65dbbc4e2da93cef5c0cfb0b3c92ff6c2c80f6e67absalomon@google.com // matrices are column-major, the first three upload a single matrix, the latter three upload 66dbbc4e2da93cef5c0cfb0b3c92ff6c2c80f6e67absalomon@google.com // arrayCount matrices into a uniform array. 678d988b3a73a75e062bc139f19cc6966888c722e2cdalton void setMatrix2f(UniformHandle, const float matrix[]) const override; 68018fb62d12d1febf121fe265da5b6117b86a6541egdaniel void setMatrix3f(UniformHandle, const float matrix[]) const override; 69018fb62d12d1febf121fe265da5b6117b86a6541egdaniel void setMatrix4f(UniformHandle, const float matrix[]) const override; 708d988b3a73a75e062bc139f19cc6966888c722e2cdalton void setMatrix2fv(UniformHandle, int arrayCount, const float matrices[]) const override; 71018fb62d12d1febf121fe265da5b6117b86a6541egdaniel void setMatrix3fv(UniformHandle, int arrayCount, const float matrices[]) const override; 72018fb62d12d1febf121fe265da5b6117b86a6541egdaniel void setMatrix4fv(UniformHandle, int arrayCount, const float matrices[]) const override; 73dbbc4e2da93cef5c0cfb0b3c92ff6c2c80f6e67absalomon@google.com 74d8dd47b5fa52430a1ab5c07335c0c13fcd43a82djoshualitt // for nvpr only 750eafe79f42e3c675f3c504aed4a41abf511df2b7egdaniel void setPathFragmentInputTransform(VaryingHandle u, int components, 76018fb62d12d1febf121fe265da5b6117b86a6541egdaniel const SkMatrix& matrix) const override; 77d8dd47b5fa52430a1ab5c07335c0c13fcd43a82djoshualitt 78dbbc4e2da93cef5c0cfb0b3c92ff6c2c80f6e67absalomon@google.comprivate: 79dbbc4e2da93cef5c0cfb0b3c92ff6c2c80f6e67absalomon@google.com enum { 80dbbc4e2da93cef5c0cfb0b3c92ff6c2c80f6e67absalomon@google.com kUnusedUniform = -1, 81dbbc4e2da93cef5c0cfb0b3c92ff6c2c80f6e67absalomon@google.com }; 82dbbc4e2da93cef5c0cfb0b3c92ff6c2c80f6e67absalomon@google.com 83dbbc4e2da93cef5c0cfb0b3c92ff6c2c80f6e67absalomon@google.com struct Uniform { 84101b844d6ba031de5c4e95b43f9292f266799237Brian Salomon GrGLint fLocation; 85101b844d6ba031de5c4e95b43f9292f266799237Brian Salomon#ifdef SK_DEBUG 86101b844d6ba031de5c4e95b43f9292f266799237Brian Salomon GrSLType fType; 87101b844d6ba031de5c4e95b43f9292f266799237Brian Salomon int fArrayCount; 88101b844d6ba031de5c4e95b43f9292f266799237Brian Salomon#endif 89dbbc4e2da93cef5c0cfb0b3c92ff6c2c80f6e67absalomon@google.com }; 90dbbc4e2da93cef5c0cfb0b3c92ff6c2c80f6e67absalomon@google.com 91d8dd47b5fa52430a1ab5c07335c0c13fcd43a82djoshualitt enum { 920eafe79f42e3c675f3c504aed4a41abf511df2b7egdaniel kUnusedPathProcVarying = -1, 93d8dd47b5fa52430a1ab5c07335c0c13fcd43a82djoshualitt }; 940eafe79f42e3c675f3c504aed4a41abf511df2b7egdaniel struct PathProcVarying { 95d8dd47b5fa52430a1ab5c07335c0c13fcd43a82djoshualitt GrGLint fLocation; 96d8dd47b5fa52430a1ab5c07335c0c13fcd43a82djoshualitt SkDEBUGCODE( 97d8dd47b5fa52430a1ab5c07335c0c13fcd43a82djoshualitt GrSLType fType; 98d8dd47b5fa52430a1ab5c07335c0c13fcd43a82djoshualitt int fArrayCount; 99d8dd47b5fa52430a1ab5c07335c0c13fcd43a82djoshualitt ); 100d8dd47b5fa52430a1ab5c07335c0c13fcd43a82djoshualitt }; 101d8dd47b5fa52430a1ab5c07335c0c13fcd43a82djoshualitt 1028d988b3a73a75e062bc139f19cc6966888c722e2cdalton template<int N> inline void setMatrices(UniformHandle, int arrayCount, 1038d988b3a73a75e062bc139f19cc6966888c722e2cdalton const float matrices[]) const; 1048d988b3a73a75e062bc139f19cc6966888c722e2cdalton 105dbbc4e2da93cef5c0cfb0b3c92ff6c2c80f6e67absalomon@google.com SkTArray<Uniform, true> fUniforms; 1060eafe79f42e3c675f3c504aed4a41abf511df2b7egdaniel SkTArray<PathProcVarying, true> fPathProcVaryings; 107861e1037017bbb7ac52ec5ebecab3a636a82a3e8bsalomon GrGLGpu* fGpu; 108d8dd47b5fa52430a1ab5c07335c0c13fcd43a82djoshualitt GrGLuint fProgramID; 1096eac42e3ab68b085117d7f91621276a722b5a3a7commit-bot@chromium.org 110018fb62d12d1febf121fe265da5b6117b86a6541egdaniel typedef GrGLSLProgramDataManager INHERITED; 111dbbc4e2da93cef5c0cfb0b3c92ff6c2c80f6e67absalomon@google.com}; 11278cff136a4b59045e82965cbc9a63bf76a595796kkinnunen 113dbbc4e2da93cef5c0cfb0b3c92ff6c2c80f6e67absalomon@google.com#endif 114