summaryrefslogtreecommitdiffstats
path: root/gpu/command_buffer/service/program_manager.cc
diff options
context:
space:
mode:
authorgman@chromium.org <gman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-06-07 17:58:32 +0000
committergman@chromium.org <gman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-06-07 17:58:32 +0000
commitd81e8c5fd686ff034a6e904b3f575675c2a05a1e (patch)
treee211aa0e8a7713cd379db67fd12fbcc026a6706e /gpu/command_buffer/service/program_manager.cc
parent1a5520603bc006aa0f73ef6762d2886b6719ee10 (diff)
downloadchromium_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.cc35
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(