diff options
author | gman@chromium.org <gman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-06-07 17:58:32 +0000 |
---|---|---|
committer | gman@chromium.org <gman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-06-07 17:58:32 +0000 |
commit | d81e8c5fd686ff034a6e904b3f575675c2a05a1e (patch) | |
tree | e211aa0e8a7713cd379db67fd12fbcc026a6706e /gpu/command_buffer/service/program_manager.cc | |
parent | 1a5520603bc006aa0f73ef6762d2886b6719ee10 (diff) | |
download | chromium_src-d81e8c5fd686ff034a6e904b3f575675c2a05a1e.zip chromium_src-d81e8c5fd686ff034a6e904b3f575675c2a05a1e.tar.gz chromium_src-d81e8c5fd686ff034a6e904b3f575675c2a05a1e.tar.bz2 |
Makes LinkProgram fail if both a vertex and fragment shader
are not present. Desktop GL doesn't fail this case because
the fixed function pipeline can be a substitute for either
TEST=unit tests
BUG=none
Review URL: http://codereview.chromium.org/2582002
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@49073 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'gpu/command_buffer/service/program_manager.cc')
-rw-r--r-- | gpu/command_buffer/service/program_manager.cc | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/gpu/command_buffer/service/program_manager.cc b/gpu/command_buffer/service/program_manager.cc index 77b0c96..2dcb368 100644 --- a/gpu/command_buffer/service/program_manager.cc +++ b/gpu/command_buffer/service/program_manager.cc @@ -12,6 +12,18 @@ namespace gpu { namespace gles2 { +static int ShaderTypeToIndex(GLenum shader_type) { + switch (shader_type) { + case GL_VERTEX_SHADER: + return 0; + case GL_FRAGMENT_SHADER: + return 1; + default: + NOTREACHED(); + return 0; + } +} + bool ProgramManager::IsInvalidPrefix(const char* name, size_t length) { static const char kInvalidPrefix[] = { 'g', 'l', '_' }; return (length >= sizeof(kInvalidPrefix) && @@ -246,12 +258,35 @@ void ProgramManager::ProgramInfo::GetProgramiv(GLenum pname, GLint* params) { // Notice +1 to accomodate NULL terminator. *params = max_uniform_name_length_ + 1; break; + case GL_LINK_STATUS: + *params = valid_; + break; default: glGetProgramiv(service_id_, pname, params); break; } } +void ProgramManager::ProgramInfo::AttachShader( + ShaderManager::ShaderInfo* info) { + attached_shaders_[ShaderTypeToIndex(info->shader_type())] = + ShaderManager::ShaderInfo::Ref(info); +} + +void ProgramManager::ProgramInfo::DetachShader( + ShaderManager::ShaderInfo* info) { + attached_shaders_[ShaderTypeToIndex(info->shader_type())] = NULL; +} + +bool ProgramManager::ProgramInfo::CanLink() const { + for (int ii = 0; ii < kMaxAttachedShaders; ++ii) { + if (!attached_shaders_[ii]) { + return false; + } + } + return true; +} + void ProgramManager::CreateProgramInfo(GLuint client_id, GLuint service_id) { std::pair<ProgramInfoMap::iterator, bool> result = program_infos_.insert( |