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