blob: e93423450c23439d884ae4b9853ed89bbb3dc308 [file] [log] [blame]
Geoff Langf9a6f082015-01-22 13:32:49 -05001//
2// Copyright 2015 The ANGLE Project Authors. All rights reserved.
3// Use of this source code is governed by a BSD-style license that can be
4// found in the LICENSE file.
5//
6
7// ProgramGL.cpp: Implements the class methods for ProgramGL.
8
9#include "libANGLE/renderer/gl/ProgramGL.h"
10
11#include "common/debug.h"
Geoff Langb1f435e2015-02-20 10:01:01 -050012#include "libANGLE/renderer/gl/FunctionsGL.h"
13#include "libANGLE/renderer/gl/ShaderGL.h"
14#include "libANGLE/renderer/gl/StateManagerGL.h"
Geoff Langf9a6f082015-01-22 13:32:49 -050015
16namespace rx
17{
18
Geoff Langb1f435e2015-02-20 10:01:01 -050019ProgramGL::ProgramGL(const FunctionsGL *functions, StateManagerGL *stateManager)
20 : ProgramImpl(),
21 mFunctions(functions),
22 mStateManager(stateManager),
23 mProgramID(0)
24{
25 ASSERT(mFunctions);
26 ASSERT(mStateManager);
27}
Geoff Langf9a6f082015-01-22 13:32:49 -050028
29ProgramGL::~ProgramGL()
Geoff Langb1f435e2015-02-20 10:01:01 -050030{
31 if (mProgramID != 0)
32 {
33 mFunctions->deleteProgram(mProgramID);
34 mProgramID = 0;
35 }
36}
Geoff Langf9a6f082015-01-22 13:32:49 -050037
38bool ProgramGL::usesPointSize() const
39{
40 UNIMPLEMENTED();
41 return bool();
42}
43
44int ProgramGL::getShaderVersion() const
45{
46 UNIMPLEMENTED();
47 return int();
48}
49
50GLenum ProgramGL::getTransformFeedbackBufferMode() const
51{
52 UNIMPLEMENTED();
53 return GLenum();
54}
55
56GLenum ProgramGL::getBinaryFormat()
57{
58 UNIMPLEMENTED();
59 return GLenum();
60}
61
62LinkResult ProgramGL::load(gl::InfoLog &infoLog, gl::BinaryInputStream *stream)
63{
64 UNIMPLEMENTED();
65 return LinkResult(false, gl::Error(GL_INVALID_OPERATION));
66}
67
68gl::Error ProgramGL::save(gl::BinaryOutputStream *stream)
69{
70 UNIMPLEMENTED();
71 return gl::Error(GL_INVALID_OPERATION);
72}
73
74LinkResult ProgramGL::link(const gl::Data &data, gl::InfoLog &infoLog,
75 gl::Shader *fragmentShader, gl::Shader *vertexShader,
76 const std::vector<std::string> &transformFeedbackVaryings,
77 GLenum transformFeedbackBufferMode,
78 int *registers, std::vector<gl::LinkedVarying> *linkedVaryings,
79 std::map<int, gl::VariableLocation> *outputVariables)
80{
Geoff Langb1f435e2015-02-20 10:01:01 -050081 // Reset the program state, delete the current program if one exists
82 reset();
83
84 ShaderGL *vertexShaderGL = GetImplAs<ShaderGL>(vertexShader);
85 ShaderGL *fragmentShaderGL = GetImplAs<ShaderGL>(fragmentShader);
86
87 // Generate a new program, make sure one doesn't already exist
88 ASSERT(mProgramID == 0);
89 mProgramID = mFunctions->createProgram();
90
91 // Attach the shaders
92 mFunctions->attachShader(mProgramID, vertexShaderGL->getShaderID());
93 mFunctions->attachShader(mProgramID, fragmentShaderGL->getShaderID());
94
95 // TODO: bind attribute locations?
96
97 // Link and verify
98 mFunctions->linkProgram(mProgramID);
99
100 GLint linkStatus = GL_FALSE;
101 mFunctions->getProgramiv(mProgramID, GL_LINK_STATUS, &linkStatus);
102 ASSERT(linkStatus == GL_TRUE);
103 if (linkStatus == GL_FALSE)
104 {
105 // Linking failed, put the error into the info log
106 GLint infoLogLength = 0;
107 mFunctions->getProgramiv(mProgramID, GL_INFO_LOG_LENGTH, &infoLogLength);
108
109 std::vector<char> buf(infoLogLength);
110 mFunctions->getProgramInfoLog(mProgramID, infoLogLength, nullptr, &buf[0]);
111
112 mFunctions->deleteProgram(mProgramID);
113 mProgramID = 0;
114
115 infoLog.append(&buf[0]);
116 TRACE("\n%s", &buf[0]);
117
118 // TODO, return GL_OUT_OF_MEMORY or just fail the link? This is an unexpected case
119 return LinkResult(false, gl::Error(GL_NO_ERROR));
120 }
121
122 // Query the uniform information
123 // TODO: A lot of this logic should be done at the gl::Program level
124 GLint activeUniformMaxLength = 0;
125 mFunctions->getProgramiv(mProgramID, GL_ACTIVE_UNIFORM_MAX_LENGTH, &activeUniformMaxLength);
126
127 std::vector<GLchar> uniformNameBuffer(activeUniformMaxLength);
128
129 GLint uniformCount = 0;
130 mFunctions->getProgramiv(mProgramID, GL_ACTIVE_UNIFORMS, &uniformCount);
131 for (GLint i = 0; i < uniformCount; i++)
132 {
133 GLsizei uniformNameLength = 0;
134 GLint uniformSize = 0;
135 GLenum uniformType = GL_NONE;
136 mFunctions->getActiveUniform(mProgramID, i, uniformNameBuffer.size(), &uniformNameLength, &uniformSize, &uniformType, &uniformNameBuffer[0]);
137
138 std::string uniformName(&uniformNameBuffer[0], uniformNameLength);
139
140 // TODO: determine uniform precision
141 mUniforms.push_back(new gl::LinkedUniform(uniformType, GL_NONE, uniformName, uniformSize, -1, sh::BlockMemberInfo::getDefaultBlockInfo()));
142 mUniformIndex.push_back(gl::VariableLocation(uniformName, 0, i));
143 }
144
145 // Query the attribute information
146 GLint activeAttributeMaxLength = 0;
147 mFunctions->getProgramiv(mProgramID, GL_ACTIVE_ATTRIBUTE_MAX_LENGTH, &activeAttributeMaxLength);
148
149 std::vector<GLchar> attributeNameBuffer(activeAttributeMaxLength);
150
151 GLint attributeCount = 0;
152 mFunctions->getProgramiv(mProgramID, GL_ACTIVE_ATTRIBUTES, &attributeCount);
153 for (GLint i = 0; i < attributeCount; i++)
154 {
155 GLsizei attributeNameLength = 0;
156 GLint attributeSize = 0;
157 GLenum attributeType = GL_NONE;
158 mFunctions->getActiveAttrib(mProgramID, i, attributeNameBuffer.size(), &attributeNameLength, &attributeSize, &attributeType, &attributeNameBuffer[0]);
159
160 std::string attributeName(&attributeNameBuffer[0], attributeNameLength);
161
162 mShaderAttributes[i].type = attributeType;
163 // TODO: determine attribute precision
164 mShaderAttributes[i].precision = GL_NONE;
165 mShaderAttributes[i].name = attributeName;
166 mShaderAttributes[i].arraySize = attributeSize;
167 mShaderAttributes[i].location = i;
168 }
169
170 return LinkResult(true, gl::Error(GL_NO_ERROR));
Geoff Langf9a6f082015-01-22 13:32:49 -0500171}
172
173void ProgramGL::setUniform1fv(GLint location, GLsizei count, const GLfloat *v)
174{
Geoff Lang63cbace2015-02-26 10:03:12 -0500175 mStateManager->useProgram(mProgramID);
Geoff Langb1f435e2015-02-20 10:01:01 -0500176 mFunctions->uniform1fv(location, count, v);
Geoff Langf9a6f082015-01-22 13:32:49 -0500177}
178
179void ProgramGL::setUniform2fv(GLint location, GLsizei count, const GLfloat *v)
180{
Geoff Lang63cbace2015-02-26 10:03:12 -0500181 mStateManager->useProgram(mProgramID);
Geoff Langb1f435e2015-02-20 10:01:01 -0500182 mFunctions->uniform2fv(location, count, v);
Geoff Langf9a6f082015-01-22 13:32:49 -0500183}
184
185void ProgramGL::setUniform3fv(GLint location, GLsizei count, const GLfloat *v)
186{
Geoff Lang63cbace2015-02-26 10:03:12 -0500187 mStateManager->useProgram(mProgramID);
Geoff Langb1f435e2015-02-20 10:01:01 -0500188 mFunctions->uniform3fv(location, count, v);
Geoff Langf9a6f082015-01-22 13:32:49 -0500189}
190
191void ProgramGL::setUniform4fv(GLint location, GLsizei count, const GLfloat *v)
192{
Geoff Lang63cbace2015-02-26 10:03:12 -0500193 mStateManager->useProgram(mProgramID);
Geoff Langb1f435e2015-02-20 10:01:01 -0500194 mFunctions->uniform4fv(location, count, v);
Geoff Langf9a6f082015-01-22 13:32:49 -0500195}
196
197void ProgramGL::setUniform1iv(GLint location, GLsizei count, const GLint *v)
198{
Geoff Lang63cbace2015-02-26 10:03:12 -0500199 mStateManager->useProgram(mProgramID);
Geoff Langb1f435e2015-02-20 10:01:01 -0500200 mFunctions->uniform1iv(location, count, v);
Geoff Langf9a6f082015-01-22 13:32:49 -0500201}
202
203void ProgramGL::setUniform2iv(GLint location, GLsizei count, const GLint *v)
204{
Geoff Lang63cbace2015-02-26 10:03:12 -0500205 mStateManager->useProgram(mProgramID);
Geoff Langb1f435e2015-02-20 10:01:01 -0500206 mFunctions->uniform2iv(location, count, v);
Geoff Langf9a6f082015-01-22 13:32:49 -0500207}
208
209void ProgramGL::setUniform3iv(GLint location, GLsizei count, const GLint *v)
210{
Geoff Lang63cbace2015-02-26 10:03:12 -0500211 mStateManager->useProgram(mProgramID);
Geoff Langb1f435e2015-02-20 10:01:01 -0500212 mFunctions->uniform3iv(location, count, v);
Geoff Langf9a6f082015-01-22 13:32:49 -0500213}
214
215void ProgramGL::setUniform4iv(GLint location, GLsizei count, const GLint *v)
216{
Geoff Lang63cbace2015-02-26 10:03:12 -0500217 mStateManager->useProgram(mProgramID);
Geoff Langb1f435e2015-02-20 10:01:01 -0500218 mFunctions->uniform4iv(location, count, v);
Geoff Langf9a6f082015-01-22 13:32:49 -0500219}
220
221void ProgramGL::setUniform1uiv(GLint location, GLsizei count, const GLuint *v)
222{
Geoff Lang63cbace2015-02-26 10:03:12 -0500223 mStateManager->useProgram(mProgramID);
Geoff Langb1f435e2015-02-20 10:01:01 -0500224 mFunctions->uniform1uiv(location, count, v);
Geoff Langf9a6f082015-01-22 13:32:49 -0500225}
226
227void ProgramGL::setUniform2uiv(GLint location, GLsizei count, const GLuint *v)
228{
Geoff Lang63cbace2015-02-26 10:03:12 -0500229 mStateManager->useProgram(mProgramID);
Geoff Langb1f435e2015-02-20 10:01:01 -0500230 mFunctions->uniform2uiv(location, count, v);
Geoff Langf9a6f082015-01-22 13:32:49 -0500231}
232
233void ProgramGL::setUniform3uiv(GLint location, GLsizei count, const GLuint *v)
234{
Geoff Lang63cbace2015-02-26 10:03:12 -0500235 mStateManager->useProgram(mProgramID);
Geoff Langb1f435e2015-02-20 10:01:01 -0500236 mFunctions->uniform3uiv(location, count, v);
Geoff Langf9a6f082015-01-22 13:32:49 -0500237}
238
239void ProgramGL::setUniform4uiv(GLint location, GLsizei count, const GLuint *v)
240{
Geoff Lang63cbace2015-02-26 10:03:12 -0500241 mStateManager->useProgram(mProgramID);
Geoff Langb1f435e2015-02-20 10:01:01 -0500242 mFunctions->uniform4uiv(location, count, v);
Geoff Langf9a6f082015-01-22 13:32:49 -0500243}
244
245void ProgramGL::setUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
246{
Geoff Lang63cbace2015-02-26 10:03:12 -0500247 mStateManager->useProgram(mProgramID);
Geoff Langb1f435e2015-02-20 10:01:01 -0500248 mFunctions->uniformMatrix2fv(location, count, transpose, value);
Geoff Langf9a6f082015-01-22 13:32:49 -0500249}
250
251void ProgramGL::setUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
252{
Geoff Lang63cbace2015-02-26 10:03:12 -0500253 mStateManager->useProgram(mProgramID);
Geoff Langb1f435e2015-02-20 10:01:01 -0500254 mFunctions->uniformMatrix3fv(location, count, transpose, value);
Geoff Langf9a6f082015-01-22 13:32:49 -0500255}
256
257void ProgramGL::setUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
258{
Geoff Lang63cbace2015-02-26 10:03:12 -0500259 mStateManager->useProgram(mProgramID);
Geoff Langb1f435e2015-02-20 10:01:01 -0500260 mFunctions->uniformMatrix4fv(location, count, transpose, value);
Geoff Langf9a6f082015-01-22 13:32:49 -0500261}
262
263void ProgramGL::setUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
264{
Geoff Lang63cbace2015-02-26 10:03:12 -0500265 mStateManager->useProgram(mProgramID);
Geoff Langb1f435e2015-02-20 10:01:01 -0500266 mFunctions->uniformMatrix2x3fv(location, count, transpose, value);
Geoff Langf9a6f082015-01-22 13:32:49 -0500267}
268
269void ProgramGL::setUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
270{
Geoff Lang63cbace2015-02-26 10:03:12 -0500271 mStateManager->useProgram(mProgramID);
Geoff Langb1f435e2015-02-20 10:01:01 -0500272 mFunctions->uniformMatrix3x2fv(location, count, transpose, value);
Geoff Langf9a6f082015-01-22 13:32:49 -0500273}
274
275void ProgramGL::setUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
276{
Geoff Lang63cbace2015-02-26 10:03:12 -0500277 mStateManager->useProgram(mProgramID);
Geoff Langb1f435e2015-02-20 10:01:01 -0500278 mFunctions->uniformMatrix2x4fv(location, count, transpose, value);
Geoff Langf9a6f082015-01-22 13:32:49 -0500279}
280
281void ProgramGL::setUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
282{
Geoff Lang63cbace2015-02-26 10:03:12 -0500283 mStateManager->useProgram(mProgramID);
Geoff Langb1f435e2015-02-20 10:01:01 -0500284 mFunctions->uniformMatrix4x2fv(location, count, transpose, value);
Geoff Langf9a6f082015-01-22 13:32:49 -0500285}
286
287void ProgramGL::setUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
288{
Geoff Lang63cbace2015-02-26 10:03:12 -0500289 mStateManager->useProgram(mProgramID);
Geoff Langb1f435e2015-02-20 10:01:01 -0500290 mFunctions->uniformMatrix3x4fv(location, count, transpose, value);
Geoff Langf9a6f082015-01-22 13:32:49 -0500291}
292
293void ProgramGL::setUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
294{
Geoff Lang63cbace2015-02-26 10:03:12 -0500295 mStateManager->useProgram(mProgramID);
Geoff Langb1f435e2015-02-20 10:01:01 -0500296 mFunctions->uniformMatrix4x3fv(location, count, transpose, value);
Geoff Langf9a6f082015-01-22 13:32:49 -0500297}
298
299void ProgramGL::getUniformfv(GLint location, GLfloat *params)
300{
Geoff Langb1f435e2015-02-20 10:01:01 -0500301 mFunctions->getUniformfv(mProgramID, location, params);
Geoff Langf9a6f082015-01-22 13:32:49 -0500302}
303
304void ProgramGL::getUniformiv(GLint location, GLint *params)
305{
Geoff Langb1f435e2015-02-20 10:01:01 -0500306 mFunctions->getUniformiv(mProgramID, location, params);
Geoff Langf9a6f082015-01-22 13:32:49 -0500307}
308
309void ProgramGL::getUniformuiv(GLint location, GLuint *params)
310{
Geoff Langb1f435e2015-02-20 10:01:01 -0500311 mFunctions->getUniformuiv(mProgramID, location, params);
Geoff Langf9a6f082015-01-22 13:32:49 -0500312}
313
314GLint ProgramGL::getSamplerMapping(gl::SamplerType type, unsigned int samplerIndex, const gl::Caps &caps) const
315{
316 UNIMPLEMENTED();
317 return GLint();
318}
319
320GLenum ProgramGL::getSamplerTextureType(gl::SamplerType type, unsigned int samplerIndex) const
321{
322 UNIMPLEMENTED();
323 return GLenum();
324}
325
326GLint ProgramGL::getUsedSamplerRange(gl::SamplerType type) const
327{
328 UNIMPLEMENTED();
329 return GLint();
330}
331
332void ProgramGL::updateSamplerMapping()
333{
334 UNIMPLEMENTED();
335}
336
337bool ProgramGL::validateSamplers(gl::InfoLog *infoLog, const gl::Caps &caps)
338{
Geoff Lang35d315c2015-03-31 12:48:54 -0400339 //UNIMPLEMENTED();
Geoff Langb1f435e2015-02-20 10:01:01 -0500340 return true;
Geoff Langf9a6f082015-01-22 13:32:49 -0500341}
342
343LinkResult ProgramGL::compileProgramExecutables(gl::InfoLog &infoLog, gl::Shader *fragmentShader, gl::Shader *vertexShader,
344 int registers)
345{
Geoff Langb1f435e2015-02-20 10:01:01 -0500346 //UNIMPLEMENTED();
347 return LinkResult(true, gl::Error(GL_NO_ERROR));
Geoff Langf9a6f082015-01-22 13:32:49 -0500348}
349
350bool ProgramGL::linkUniforms(gl::InfoLog &infoLog, const gl::Shader &vertexShader, const gl::Shader &fragmentShader,
351 const gl::Caps &caps)
352{
Geoff Langb1f435e2015-02-20 10:01:01 -0500353 //UNIMPLEMENTED();
354 return true;
Geoff Langf9a6f082015-01-22 13:32:49 -0500355}
356
357bool ProgramGL::defineUniformBlock(gl::InfoLog &infoLog, const gl::Shader &shader, const sh::InterfaceBlock &interfaceBlock,
358 const gl::Caps &caps)
359{
360 UNIMPLEMENTED();
361 return bool();
362}
363
364gl::Error ProgramGL::applyUniforms()
365{
366 UNIMPLEMENTED();
367 return gl::Error(GL_INVALID_OPERATION);
368}
369
Geoff Lang90a09b52015-04-01 18:21:24 +0000370gl::Error ProgramGL::applyUniformBuffers(const std::vector<gl::Buffer*> boundBuffers, const gl::Caps &caps)
Geoff Langf9a6f082015-01-22 13:32:49 -0500371{
372 UNIMPLEMENTED();
373 return gl::Error(GL_INVALID_OPERATION);
374}
375
376bool ProgramGL::assignUniformBlockRegister(gl::InfoLog &infoLog, gl::UniformBlock *uniformBlock, GLenum shader,
377 unsigned int registerIndex, const gl::Caps &caps)
378{
379 UNIMPLEMENTED();
380 return bool();
381}
382
Geoff Langb1f435e2015-02-20 10:01:01 -0500383void ProgramGL::reset()
384{
385 ProgramImpl::reset();
386
387 if (mProgramID)
388 {
389 mFunctions->deleteProgram(mProgramID);
390 mProgramID = 0;
391 }
392}
393
394GLuint ProgramGL::getProgramID() const
395{
396 return mProgramID;
397}
398
Geoff Langf9a6f082015-01-22 13:32:49 -0500399}