1bdf2d80f459d43f5a6df074431bacf41584f81b7shannon.woods@transgaming.com#include "precompiled.h" 24f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// 3e16e651f282538ce32962689a8f43a284ee80fc7shannon.woods@transgaming.com// Copyright (c) 2002-2013 The ANGLE Project Authors. All rights reserved. 44f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// Use of this source code is governed by a BSD-style license that can be 54f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// found in the LICENSE file. 64f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// 74f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com 84f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// Program.cpp: Implements the gl::Program class. Implements GL program objects 94f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// and related functionality. [OpenGL ES 2.0.24] section 2.10.3 page 28. 104f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com 11d2811d688721a729f514bd78f7fd12a43beeb0a6shannon.woods@transgaming.com#include "libGLESv2/Program.h" 12ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org#include "libGLESv2/ProgramBinary.h" 13486d9e9b6b4ed31f66d2624b8e822020fe40a1f7shannon.woods@transgaming.com#include "libGLESv2/ResourceManager.h" 1487891f74d1abc731c060bc9bea9d0712033f8baadaniel@transgaming.com 154f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.comnamespace gl 164f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com{ 17253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.orgconst char * const g_fakepath = "C:\\fakepath"; 18253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org 19e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.orgAttributeBindings::AttributeBindings() 20e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org{ 21e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org} 22e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org 23e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.orgAttributeBindings::~AttributeBindings() 24e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org{ 259a30b095c10fc89dc0983ce80a1640ab11bab16aapatrick@chromium.org} 269a30b095c10fc89dc0983ce80a1640ab11bab16aapatrick@chromium.org 27253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.orgInfoLog::InfoLog() : mInfoLog(NULL) 28253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org{ 29253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org} 30253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org 31253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.orgInfoLog::~InfoLog() 32253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org{ 33253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org delete[] mInfoLog; 34253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org} 35253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org 36253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org 37253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.orgint InfoLog::getLength() const 38253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org{ 39253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org if (!mInfoLog) 40253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org { 41253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org return 0; 42253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org } 43253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org else 44253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org { 45253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org return strlen(mInfoLog) + 1; 46253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org } 47253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org} 48253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org 49253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.orgvoid InfoLog::getLog(GLsizei bufSize, GLsizei *length, char *infoLog) 50253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org{ 51253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org int index = 0; 52253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org 53253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org if (bufSize > 0) 54253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org { 55253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org if (mInfoLog) 56253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org { 57253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org index = std::min(bufSize - 1, (int)strlen(mInfoLog)); 58253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org memcpy(infoLog, mInfoLog, index); 59253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org } 60253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org 61253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org infoLog[index] = '\0'; 62253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org } 63253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org 64253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org if (length) 65253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org { 66253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org *length = index; 67253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org } 68253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org} 69253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org 70253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org// append a santized message to the program info log. 71253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org// The D3D compiler includes a fake file path in some of the warning or error 72253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org// messages, so lets remove all occurrences of this fake file path from the log. 73253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.orgvoid InfoLog::appendSanitized(const char *message) 74253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org{ 75253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org std::string msg(message); 76253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org 77253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org size_t found; 78253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org do 79253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org { 80253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org found = msg.find(g_fakepath); 81253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org if (found != std::string::npos) 82253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org { 83253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org msg.erase(found, strlen(g_fakepath)); 84253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org } 85253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org } 86253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org while (found != std::string::npos); 87253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org 88e16e651f282538ce32962689a8f43a284ee80fc7shannon.woods@transgaming.com append("%s", msg.c_str()); 89253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org} 90253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org 91253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.orgvoid InfoLog::append(const char *format, ...) 92253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org{ 93253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org if (!format) 94253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org { 95253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org return; 96253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org } 97253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org 98253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org char info[1024]; 99253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org 100253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org va_list vararg; 101253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org va_start(vararg, format); 102253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org vsnprintf(info, sizeof(info), format, vararg); 103253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org va_end(vararg); 104253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org 105253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org size_t infoLength = strlen(info); 106253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org 107253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org if (!mInfoLog) 108253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org { 109e16e651f282538ce32962689a8f43a284ee80fc7shannon.woods@transgaming.com mInfoLog = new char[infoLength + 2]; 110253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org strcpy(mInfoLog, info); 111e16e651f282538ce32962689a8f43a284ee80fc7shannon.woods@transgaming.com strcpy(mInfoLog + infoLength, "\n"); 112253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org } 113253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org else 114253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org { 115253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org size_t logLength = strlen(mInfoLog); 116e16e651f282538ce32962689a8f43a284ee80fc7shannon.woods@transgaming.com char *newLog = new char[logLength + infoLength + 2]; 117253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org strcpy(newLog, mInfoLog); 118253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org strcpy(newLog + logLength, info); 119e16e651f282538ce32962689a8f43a284ee80fc7shannon.woods@transgaming.com strcpy(newLog + logLength + infoLength, "\n"); 120253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org 121253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org delete[] mInfoLog; 122253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org mInfoLog = newLog; 123253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org } 124253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org} 125253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org 126253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.orgvoid InfoLog::reset() 127253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org{ 128253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org if (mInfoLog) 129253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org { 130253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org delete [] mInfoLog; 131253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org mInfoLog = NULL; 132253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org } 133253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org} 134253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org 13570062c98f7c62744f398dc0ba7a87c76e723cc48daniel@transgaming.comProgram::Program(rx::Renderer *renderer, ResourceManager *manager, GLuint handle) : mResourceManager(manager), mHandle(handle) 136ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org{ 137ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org mFragmentShader = NULL; 138ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org mVertexShader = NULL; 139989c1c85b82277de2b080c0ce2174a668e1b96badaniel@transgaming.com mProgramBinary.set(NULL); 140ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org mDeleteStatus = false; 141716056c7293bfb935b1e6858b6d9a4b935905609daniel@transgaming.com mLinked = false; 142ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org mRefCount = 0; 14370062c98f7c62744f398dc0ba7a87c76e723cc48daniel@transgaming.com mRenderer = renderer; 1444f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com} 1454f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com 146ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.orgProgram::~Program() 1479a95e2bb66c3829d721daa18adc22f1c8168f08fdaniel@transgaming.com{ 148ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org unlink(true); 1499a95e2bb66c3829d721daa18adc22f1c8168f08fdaniel@transgaming.com 150ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org if (mVertexShader != NULL) 1519a95e2bb66c3829d721daa18adc22f1c8168f08fdaniel@transgaming.com { 152ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org mVertexShader->release(); 1539a95e2bb66c3829d721daa18adc22f1c8168f08fdaniel@transgaming.com } 1549a95e2bb66c3829d721daa18adc22f1c8168f08fdaniel@transgaming.com 155ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org if (mFragmentShader != NULL) 156ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org { 157ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org mFragmentShader->release(); 158ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org } 1599a95e2bb66c3829d721daa18adc22f1c8168f08fdaniel@transgaming.com} 1609a95e2bb66c3829d721daa18adc22f1c8168f08fdaniel@transgaming.com 161ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.orgbool Program::attachShader(Shader *shader) 1629a95e2bb66c3829d721daa18adc22f1c8168f08fdaniel@transgaming.com{ 163ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org if (shader->getType() == GL_VERTEX_SHADER) 1649a95e2bb66c3829d721daa18adc22f1c8168f08fdaniel@transgaming.com { 165ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org if (mVertexShader) 166ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org { 167ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org return false; 168ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org } 1699a95e2bb66c3829d721daa18adc22f1c8168f08fdaniel@transgaming.com 170ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org mVertexShader = (VertexShader*)shader; 171ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org mVertexShader->addRef(); 1729a95e2bb66c3829d721daa18adc22f1c8168f08fdaniel@transgaming.com } 173ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org else if (shader->getType() == GL_FRAGMENT_SHADER) 174ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org { 175ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org if (mFragmentShader) 176ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org { 177ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org return false; 178ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org } 1799a95e2bb66c3829d721daa18adc22f1c8168f08fdaniel@transgaming.com 180ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org mFragmentShader = (FragmentShader*)shader; 181ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org mFragmentShader->addRef(); 182ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org } 183ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org else UNREACHABLE(); 1849a95e2bb66c3829d721daa18adc22f1c8168f08fdaniel@transgaming.com 1859a95e2bb66c3829d721daa18adc22f1c8168f08fdaniel@transgaming.com return true; 1869a95e2bb66c3829d721daa18adc22f1c8168f08fdaniel@transgaming.com} 1879a95e2bb66c3829d721daa18adc22f1c8168f08fdaniel@transgaming.com 188ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.orgbool Program::detachShader(Shader *shader) 1899a95e2bb66c3829d721daa18adc22f1c8168f08fdaniel@transgaming.com{ 190ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org if (shader->getType() == GL_VERTEX_SHADER) 1919a95e2bb66c3829d721daa18adc22f1c8168f08fdaniel@transgaming.com { 192ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org if (mVertexShader != shader) 193ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org { 194ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org return false; 195ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org } 1969a95e2bb66c3829d721daa18adc22f1c8168f08fdaniel@transgaming.com 197ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org mVertexShader->release(); 198ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org mVertexShader = NULL; 1999a95e2bb66c3829d721daa18adc22f1c8168f08fdaniel@transgaming.com } 200ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org else if (shader->getType() == GL_FRAGMENT_SHADER) 201ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org { 202ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org if (mFragmentShader != shader) 203ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org { 204ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org return false; 205ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org } 2069a95e2bb66c3829d721daa18adc22f1c8168f08fdaniel@transgaming.com 207ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org mFragmentShader->release(); 208ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org mFragmentShader = NULL; 209ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org } 210ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org else UNREACHABLE(); 21172e8f447228e682f07cbf31e9a54f85d9843c6e5jbauman@chromium.org 21272e8f447228e682f07cbf31e9a54f85d9843c6e5jbauman@chromium.org return true; 21372e8f447228e682f07cbf31e9a54f85d9843c6e5jbauman@chromium.org} 21472e8f447228e682f07cbf31e9a54f85d9843c6e5jbauman@chromium.org 215ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.orgint Program::getAttachedShadersCount() const 21672e8f447228e682f07cbf31e9a54f85d9843c6e5jbauman@chromium.org{ 217ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org return (mVertexShader ? 1 : 0) + (mFragmentShader ? 1 : 0); 2189a95e2bb66c3829d721daa18adc22f1c8168f08fdaniel@transgaming.com} 2199a95e2bb66c3829d721daa18adc22f1c8168f08fdaniel@transgaming.com 220ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.orgvoid AttributeBindings::bindAttributeLocation(GLuint index, const char *name) 22187891f74d1abc731c060bc9bea9d0712033f8baadaniel@transgaming.com{ 222ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org if (index < MAX_VERTEX_ATTRIBS) 22387891f74d1abc731c060bc9bea9d0712033f8baadaniel@transgaming.com { 224ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org for (int i = 0; i < MAX_VERTEX_ATTRIBS; i++) 2258a4dad605f6bd88ce8ecca01372162e510614fa0daniel@transgaming.com { 226ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org mAttributeBinding[i].erase(name); 2278a4dad605f6bd88ce8ecca01372162e510614fa0daniel@transgaming.com } 22887891f74d1abc731c060bc9bea9d0712033f8baadaniel@transgaming.com 229ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org mAttributeBinding[index].insert(name); 230ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org } 23187891f74d1abc731c060bc9bea9d0712033f8baadaniel@transgaming.com} 23287891f74d1abc731c060bc9bea9d0712033f8baadaniel@transgaming.com 233ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.orgvoid Program::bindAttributeLocation(GLuint index, const char *name) 234cba5057cf320b691cda0ad2dedd65ff0db3981bcdaniel@transgaming.com{ 235ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org mAttributeBindings.bindAttributeLocation(index, name); 236ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org} 237b4ff1f8f6ffcf796b5e12b55b851d8e0362afcc3daniel@transgaming.com 238ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org// Links the HLSL code of the vertex and pixel shader by matching up their varyings, 239ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org// compiling them into binaries, determining the attribute mappings, and collecting 240ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org// a list of uniforms 2414c962bf16f73fc67f3680535cd8f2b784f5eddfddaniel@transgaming.combool Program::link() 242ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org{ 243ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org unlink(false); 244cba5057cf320b691cda0ad2dedd65ff0db3981bcdaniel@transgaming.com 245253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org mInfoLog.reset(); 246253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org 24770062c98f7c62744f398dc0ba7a87c76e723cc48daniel@transgaming.com mProgramBinary.set(new ProgramBinary(mRenderer)); 248716056c7293bfb935b1e6858b6d9a4b935905609daniel@transgaming.com mLinked = mProgramBinary->link(mInfoLog, mAttributeBindings, mFragmentShader, mVertexShader); 2494c962bf16f73fc67f3680535cd8f2b784f5eddfddaniel@transgaming.com 250716056c7293bfb935b1e6858b6d9a4b935905609daniel@transgaming.com return mLinked; 251cba5057cf320b691cda0ad2dedd65ff0db3981bcdaniel@transgaming.com} 252cba5057cf320b691cda0ad2dedd65ff0db3981bcdaniel@transgaming.com 253ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.orgint AttributeBindings::getAttributeBinding(const std::string &name) const 25486a7a138c5166feda08f21dd48e69b3a5408a1e6daniel@transgaming.com{ 255ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org for (int location = 0; location < MAX_VERTEX_ATTRIBS; location++) 25686a7a138c5166feda08f21dd48e69b3a5408a1e6daniel@transgaming.com { 257ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org if (mAttributeBinding[location].find(name) != mAttributeBinding[location].end()) 258ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org { 259ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org return location; 260ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org } 26186a7a138c5166feda08f21dd48e69b3a5408a1e6daniel@transgaming.com } 262ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org 263ea09f9b400d2ef6d2761e0a81471ee5221995a13apatrick@chromium.org return -1; 26486a7a138c5166feda08f21dd48e69b3a5408a1e6daniel@transgaming.com} 26586a7a138c5166feda08f21dd48e69b3a5408a1e6daniel@transgaming.com 266aa5e59b385bdadec9fe8100a335f241f0c09c8c4daniel@transgaming.com// Returns the program object to an unlinked state, before re-linking, or at destruction 2674f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.comvoid Program::unlink(bool destroy) 2684f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com{ 2694f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com if (destroy) // Object being destructed 2704f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com { 2714f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com if (mFragmentShader) 2724f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com { 273da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com mFragmentShader->release(); 2744f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com mFragmentShader = NULL; 2754f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com } 2764f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com 2774f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com if (mVertexShader) 2784f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com { 279da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com mVertexShader->release(); 2804f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com mVertexShader = NULL; 2814f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com } 2824f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com } 2834f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com 284989c1c85b82277de2b080c0ce2174a668e1b96badaniel@transgaming.com mProgramBinary.set(NULL); 285716056c7293bfb935b1e6858b6d9a4b935905609daniel@transgaming.com mLinked = false; 286716056c7293bfb935b1e6858b6d9a4b935905609daniel@transgaming.com} 287716056c7293bfb935b1e6858b6d9a4b935905609daniel@transgaming.com 288716056c7293bfb935b1e6858b6d9a4b935905609daniel@transgaming.combool Program::isLinked() 289716056c7293bfb935b1e6858b6d9a4b935905609daniel@transgaming.com{ 290716056c7293bfb935b1e6858b6d9a4b935905609daniel@transgaming.com return mLinked; 2914f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com} 2924f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com 293e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.orgProgramBinary* Program::getProgramBinary() 2944f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com{ 295989c1c85b82277de2b080c0ce2174a668e1b96badaniel@transgaming.com return mProgramBinary.get(); 2964f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com} 2974f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com 2984c962bf16f73fc67f3680535cd8f2b784f5eddfddaniel@transgaming.combool Program::setProgramBinary(const void *binary, GLsizei length) 2993ce8dbcd7ef7751612c6353b64b09d90acd3fa3capatrick@chromium.org{ 3003ce8dbcd7ef7751612c6353b64b09d90acd3fa3capatrick@chromium.org unlink(false); 30190080e3b703883b871f862d5ceafa44d2d815b6aapatrick@chromium.org 30290080e3b703883b871f862d5ceafa44d2d815b6aapatrick@chromium.org mInfoLog.reset(); 30390080e3b703883b871f862d5ceafa44d2d815b6aapatrick@chromium.org 30470062c98f7c62744f398dc0ba7a87c76e723cc48daniel@transgaming.com mProgramBinary.set(new ProgramBinary(mRenderer)); 305716056c7293bfb935b1e6858b6d9a4b935905609daniel@transgaming.com mLinked = mProgramBinary->load(mInfoLog, binary, length); 306716056c7293bfb935b1e6858b6d9a4b935905609daniel@transgaming.com if (!mLinked) 30790080e3b703883b871f862d5ceafa44d2d815b6aapatrick@chromium.org { 308989c1c85b82277de2b080c0ce2174a668e1b96badaniel@transgaming.com mProgramBinary.set(NULL); 30990080e3b703883b871f862d5ceafa44d2d815b6aapatrick@chromium.org } 3104c962bf16f73fc67f3680535cd8f2b784f5eddfddaniel@transgaming.com 311716056c7293bfb935b1e6858b6d9a4b935905609daniel@transgaming.com return mLinked; 3123ce8dbcd7ef7751612c6353b64b09d90acd3fa3capatrick@chromium.org} 3133ce8dbcd7ef7751612c6353b64b09d90acd3fa3capatrick@chromium.org 314da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.comvoid Program::release() 315da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com{ 316da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com mRefCount--; 317da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 318da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com if (mRefCount == 0 && mDeleteStatus) 319da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com { 320da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com mResourceManager->deleteProgram(mHandle); 321da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com } 322da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com} 323da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 324da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.comvoid Program::addRef() 325da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com{ 326da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com mRefCount++; 327da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com} 328da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 329da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.comunsigned int Program::getRefCount() const 330da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com{ 331da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com return mRefCount; 332da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com} 333da13f3e902a857ce2b9a6420347335de05696b08daniel@transgaming.com 33490080e3b703883b871f862d5ceafa44d2d815b6aapatrick@chromium.orgGLint Program::getProgramBinaryLength() const 33590080e3b703883b871f862d5ceafa44d2d815b6aapatrick@chromium.org{ 336989c1c85b82277de2b080c0ce2174a668e1b96badaniel@transgaming.com ProgramBinary *programBinary = mProgramBinary.get(); 337989c1c85b82277de2b080c0ce2174a668e1b96badaniel@transgaming.com if (programBinary) 33890080e3b703883b871f862d5ceafa44d2d815b6aapatrick@chromium.org { 339989c1c85b82277de2b080c0ce2174a668e1b96badaniel@transgaming.com return programBinary->getLength(); 34090080e3b703883b871f862d5ceafa44d2d815b6aapatrick@chromium.org } 34190080e3b703883b871f862d5ceafa44d2d815b6aapatrick@chromium.org else 34290080e3b703883b871f862d5ceafa44d2d815b6aapatrick@chromium.org { 34390080e3b703883b871f862d5ceafa44d2d815b6aapatrick@chromium.org return 0; 34490080e3b703883b871f862d5ceafa44d2d815b6aapatrick@chromium.org } 34590080e3b703883b871f862d5ceafa44d2d815b6aapatrick@chromium.org} 34690080e3b703883b871f862d5ceafa44d2d815b6aapatrick@chromium.org 347e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.orgint Program::getInfoLogLength() const 348e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org{ 349253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org return mInfoLog.getLength(); 350e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org} 351e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org 352e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.orgvoid Program::getInfoLog(GLsizei bufSize, GLsizei *length, char *infoLog) 353e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org{ 354253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org return mInfoLog.getLog(bufSize, length, infoLog); 355e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org} 356e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org 3576c78521ea3e781a39878ce5f4693af72d08e4cdfdaniel@transgaming.comvoid Program::getAttachedShaders(GLsizei maxCount, GLsizei *count, GLuint *shaders) 3586c78521ea3e781a39878ce5f4693af72d08e4cdfdaniel@transgaming.com{ 3596c78521ea3e781a39878ce5f4693af72d08e4cdfdaniel@transgaming.com int total = 0; 3606c78521ea3e781a39878ce5f4693af72d08e4cdfdaniel@transgaming.com 3616c78521ea3e781a39878ce5f4693af72d08e4cdfdaniel@transgaming.com if (mVertexShader) 3626c78521ea3e781a39878ce5f4693af72d08e4cdfdaniel@transgaming.com { 3636c78521ea3e781a39878ce5f4693af72d08e4cdfdaniel@transgaming.com if (total < maxCount) 3646c78521ea3e781a39878ce5f4693af72d08e4cdfdaniel@transgaming.com { 3656c78521ea3e781a39878ce5f4693af72d08e4cdfdaniel@transgaming.com shaders[total] = mVertexShader->getHandle(); 3666c78521ea3e781a39878ce5f4693af72d08e4cdfdaniel@transgaming.com } 3676c78521ea3e781a39878ce5f4693af72d08e4cdfdaniel@transgaming.com 3686c78521ea3e781a39878ce5f4693af72d08e4cdfdaniel@transgaming.com total++; 3696c78521ea3e781a39878ce5f4693af72d08e4cdfdaniel@transgaming.com } 3706c78521ea3e781a39878ce5f4693af72d08e4cdfdaniel@transgaming.com 3716c78521ea3e781a39878ce5f4693af72d08e4cdfdaniel@transgaming.com if (mFragmentShader) 3726c78521ea3e781a39878ce5f4693af72d08e4cdfdaniel@transgaming.com { 3736c78521ea3e781a39878ce5f4693af72d08e4cdfdaniel@transgaming.com if (total < maxCount) 3746c78521ea3e781a39878ce5f4693af72d08e4cdfdaniel@transgaming.com { 3756c78521ea3e781a39878ce5f4693af72d08e4cdfdaniel@transgaming.com shaders[total] = mFragmentShader->getHandle(); 3766c78521ea3e781a39878ce5f4693af72d08e4cdfdaniel@transgaming.com } 3776c78521ea3e781a39878ce5f4693af72d08e4cdfdaniel@transgaming.com 3786c78521ea3e781a39878ce5f4693af72d08e4cdfdaniel@transgaming.com total++; 3796c78521ea3e781a39878ce5f4693af72d08e4cdfdaniel@transgaming.com } 3806c78521ea3e781a39878ce5f4693af72d08e4cdfdaniel@transgaming.com 3816c78521ea3e781a39878ce5f4693af72d08e4cdfdaniel@transgaming.com if (count) 3826c78521ea3e781a39878ce5f4693af72d08e4cdfdaniel@transgaming.com { 3836c78521ea3e781a39878ce5f4693af72d08e4cdfdaniel@transgaming.com *count = total; 3846c78521ea3e781a39878ce5f4693af72d08e4cdfdaniel@transgaming.com } 3856c78521ea3e781a39878ce5f4693af72d08e4cdfdaniel@transgaming.com} 3866c78521ea3e781a39878ce5f4693af72d08e4cdfdaniel@transgaming.com 387e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.orgvoid Program::getActiveAttribute(GLuint index, GLsizei bufsize, GLsizei *length, GLint *size, GLenum *type, GLchar *name) 388e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org{ 389989c1c85b82277de2b080c0ce2174a668e1b96badaniel@transgaming.com ProgramBinary *programBinary = getProgramBinary(); 390989c1c85b82277de2b080c0ce2174a668e1b96badaniel@transgaming.com if (programBinary) 391e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org { 392989c1c85b82277de2b080c0ce2174a668e1b96badaniel@transgaming.com programBinary->getActiveAttribute(index, bufsize, length, size, type, name); 393e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org } 394e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org else 395e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org { 396e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org if (bufsize > 0) 397e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org { 398e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org name[0] = '\0'; 399e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org } 400e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org 401e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org if (length) 402e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org { 403e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org *length = 0; 404e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org } 405e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org 406e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org *type = GL_NONE; 407e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org *size = 1; 408e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org } 409e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org} 410e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org 411e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.orgGLint Program::getActiveAttributeCount() 412e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org{ 413989c1c85b82277de2b080c0ce2174a668e1b96badaniel@transgaming.com ProgramBinary *programBinary = getProgramBinary(); 414989c1c85b82277de2b080c0ce2174a668e1b96badaniel@transgaming.com if (programBinary) 415e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org { 416989c1c85b82277de2b080c0ce2174a668e1b96badaniel@transgaming.com return programBinary->getActiveAttributeCount(); 417e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org } 418e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org else 419e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org { 420e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org return 0; 421e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org } 422e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org} 423e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org 424e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.orgGLint Program::getActiveAttributeMaxLength() 425e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org{ 426989c1c85b82277de2b080c0ce2174a668e1b96badaniel@transgaming.com ProgramBinary *programBinary = getProgramBinary(); 427989c1c85b82277de2b080c0ce2174a668e1b96badaniel@transgaming.com if (programBinary) 428e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org { 429989c1c85b82277de2b080c0ce2174a668e1b96badaniel@transgaming.com return programBinary->getActiveAttributeMaxLength(); 430e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org } 431e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org else 432e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org { 433e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org return 0; 434e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org } 435e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org} 436e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org 437e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.orgvoid Program::getActiveUniform(GLuint index, GLsizei bufsize, GLsizei *length, GLint *size, GLenum *type, GLchar *name) 438e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org{ 439989c1c85b82277de2b080c0ce2174a668e1b96badaniel@transgaming.com ProgramBinary *programBinary = getProgramBinary(); 440989c1c85b82277de2b080c0ce2174a668e1b96badaniel@transgaming.com if (programBinary) 441e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org { 442989c1c85b82277de2b080c0ce2174a668e1b96badaniel@transgaming.com return programBinary->getActiveUniform(index, bufsize, length, size, type, name); 443e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org } 444e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org else 445e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org { 446e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org if (bufsize > 0) 447e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org { 448e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org name[0] = '\0'; 449e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org } 450e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org 451e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org if (length) 452e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org { 453e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org *length = 0; 454e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org } 455e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org 456e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org *size = 0; 457e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org *type = GL_NONE; 458e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org } 459e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org} 460e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org 461e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.orgGLint Program::getActiveUniformCount() 462e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org{ 463989c1c85b82277de2b080c0ce2174a668e1b96badaniel@transgaming.com ProgramBinary *programBinary = getProgramBinary(); 464989c1c85b82277de2b080c0ce2174a668e1b96badaniel@transgaming.com if (programBinary) 465e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org { 466989c1c85b82277de2b080c0ce2174a668e1b96badaniel@transgaming.com return programBinary->getActiveUniformCount(); 467e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org } 468e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org else 469e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org { 470e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org return 0; 471e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org } 472e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org} 473e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org 474e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.orgGLint Program::getActiveUniformMaxLength() 475e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org{ 476989c1c85b82277de2b080c0ce2174a668e1b96badaniel@transgaming.com ProgramBinary *programBinary = getProgramBinary(); 477989c1c85b82277de2b080c0ce2174a668e1b96badaniel@transgaming.com if (programBinary) 478e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org { 479989c1c85b82277de2b080c0ce2174a668e1b96badaniel@transgaming.com return programBinary->getActiveUniformMaxLength(); 480e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org } 481e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org else 482e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org { 483e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org return 0; 484e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org } 485e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org} 486e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org 4874f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.comvoid Program::flagForDeletion() 4884f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com{ 4894f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com mDeleteStatus = true; 4904f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com} 4914f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com 4924f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.combool Program::isFlaggedForDeletion() const 4934f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com{ 4944f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com return mDeleteStatus; 4954f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com} 49686a7a138c5166feda08f21dd48e69b3a5408a1e6daniel@transgaming.com 497253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.orgvoid Program::validate() 498253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org{ 499253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org mInfoLog.reset(); 500253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org 501989c1c85b82277de2b080c0ce2174a668e1b96badaniel@transgaming.com ProgramBinary *programBinary = getProgramBinary(); 502989c1c85b82277de2b080c0ce2174a668e1b96badaniel@transgaming.com if (isLinked() && programBinary) 503253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org { 504989c1c85b82277de2b080c0ce2174a668e1b96badaniel@transgaming.com programBinary->validate(mInfoLog); 505253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org } 506253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org else 507253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org { 508253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org mInfoLog.append("Program has not been successfully linked."); 509253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org } 510253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org} 511253b8d209be72a28891636af156f39874a0dd75aapatrick@chromium.org 512e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.orgbool Program::isValidated() const 513e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org{ 514989c1c85b82277de2b080c0ce2174a668e1b96badaniel@transgaming.com ProgramBinary *programBinary = mProgramBinary.get(); 515989c1c85b82277de2b080c0ce2174a668e1b96badaniel@transgaming.com if (programBinary) 516e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org { 517989c1c85b82277de2b080c0ce2174a668e1b96badaniel@transgaming.com return programBinary->isValidated(); 518e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org } 519e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org else 520e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org { 521e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org return false; 522e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org } 523e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org} 524e2a59bba3553507d93f15c466a1c630e8ab77121apatrick@chromium.org 5254f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com} 526