Index: gpu/command_buffer/service/gles2_cmd_decoder.cc |
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder.cc b/gpu/command_buffer/service/gles2_cmd_decoder.cc |
index 1322fcfe0868d509eb91e5553933c1534627f27b..35941ead73202cec5843bfb0397c9912cb8ca720 100644 |
--- a/gpu/command_buffer/service/gles2_cmd_decoder.cc |
+++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc |
@@ -875,6 +875,8 @@ class GLES2DecoderImpl : public base::SupportsWeakPtr<GLES2DecoderImpl>, |
} |
void DoBindAttribLocation(GLuint client_id, GLuint index, const char* name); |
+ void DoBindUniformLocationCHROMIUM( |
+ GLuint client_id, GLint location, const char* name); |
error::Error GetAttribLocationHelper( |
GLuint client_id, uint32 location_shm_id, uint32 location_shm_offset, |
@@ -4023,6 +4025,84 @@ error::Error GLES2DecoderImpl::HandleBindAttribLocationBucket( |
return error::kNoError; |
} |
+void GLES2DecoderImpl::DoBindUniformLocationCHROMIUM( |
+ GLuint program, GLint location, const char* name) { |
+ if (!StringIsValidForGLES(name)) { |
+ SetGLError(GL_INVALID_VALUE, |
+ "glBindUniformLocationCHROMIUM", "Invalid character"); |
+ return; |
+ } |
+ if (ProgramManager::IsInvalidPrefix(name, strlen(name))) { |
+ SetGLError(GL_INVALID_OPERATION, |
+ "glBindUniformLocationCHROMIUM", "reserved prefix"); |
+ return; |
+ } |
+ if (location < 0 || static_cast<uint32>(location) >= |
+ (group_->max_fragment_uniform_vectors() + |
+ group_->max_vertex_uniform_vectors()) * 4) { |
+ SetGLError(GL_INVALID_VALUE, |
+ "glBindUniformLocationCHROMIUM", "location out of range"); |
+ return; |
+ } |
+ ProgramManager::ProgramInfo* info = GetProgramInfoNotShader( |
+ program, "glBindUniformLocationCHROMIUM"); |
+ if (!info) { |
+ return; |
+ } |
+ if (!info->SetUniformLocationBinding(name, location)) { |
+ SetGLError(GL_INVALID_VALUE, |
+ "glBindUniformLocationCHROMIUM", "location out of range"); |
+ } |
+} |
+ |
+error::Error GLES2DecoderImpl::HandleBindUniformLocationCHROMIUM( |
+ uint32 immediate_data_size, const gles2::BindUniformLocationCHROMIUM& c) { |
+ GLuint program = static_cast<GLuint>(c.program); |
+ GLint location = static_cast<GLint>(c.location); |
+ uint32 name_size = c.data_size; |
+ const char* name = GetSharedMemoryAs<const char*>( |
+ c.name_shm_id, c.name_shm_offset, name_size); |
+ if (name == NULL) { |
+ return error::kOutOfBounds; |
+ } |
+ String name_str(name, name_size); |
+ DoBindUniformLocationCHROMIUM(program, location, name_str.c_str()); |
+ return error::kNoError; |
+} |
+ |
+error::Error GLES2DecoderImpl::HandleBindUniformLocationCHROMIUMImmediate( |
+ uint32 immediate_data_size, |
+ const gles2::BindUniformLocationCHROMIUMImmediate& c) { |
+ GLuint program = static_cast<GLuint>(c.program); |
+ GLint location = static_cast<GLint>(c.location); |
+ uint32 name_size = c.data_size; |
+ const char* name = GetImmediateDataAs<const char*>( |
+ c, name_size, immediate_data_size); |
+ if (name == NULL) { |
+ return error::kOutOfBounds; |
+ } |
+ String name_str(name, name_size); |
+ DoBindUniformLocationCHROMIUM(program, location, name_str.c_str()); |
+ return error::kNoError; |
+} |
+ |
+error::Error GLES2DecoderImpl::HandleBindUniformLocationCHROMIUMBucket( |
+ uint32 immediate_data_size, |
+ const gles2::BindUniformLocationCHROMIUMBucket& c) { |
+ GLuint program = static_cast<GLuint>(c.program); |
+ GLint location = static_cast<GLint>(c.location); |
+ Bucket* bucket = GetBucket(c.name_bucket_id); |
+ if (!bucket || bucket->size() == 0) { |
+ return error::kInvalidArguments; |
+ } |
+ std::string name_str; |
+ if (!bucket->GetAsString(&name_str)) { |
+ return error::kInvalidArguments; |
+ } |
+ DoBindUniformLocationCHROMIUM(program, location, name_str.c_str()); |
+ return error::kNoError; |
+} |
+ |
error::Error GLES2DecoderImpl::HandleDeleteShader( |
uint32 immediate_data_size, const gles2::DeleteShader& c) { |
GLuint client_id = c.shader; |
@@ -6566,8 +6646,7 @@ error::Error GLES2DecoderImpl::GetUniformLocationHelper( |
if (*location != -1) { |
return error::kGenericError; |
} |
- *location = GLES2Util::SwizzleLocation( |
- info->GetUniformFakeLocation(name_str)); |
+ *location = info->GetUniformFakeLocation(name_str); |
return error::kNoError; |
} |
@@ -7875,7 +7954,7 @@ bool GLES2DecoderImpl::GetUniformSetup( |
error::Error GLES2DecoderImpl::HandleGetUniformiv( |
uint32 immediate_data_size, const gles2::GetUniformiv& c) { |
GLuint program = c.program; |
- GLint fake_location = GLES2Util::UnswizzleLocation(c.location); |
+ GLint fake_location = c.location; |
GLuint service_id; |
GLenum result_type; |
GLint real_location = -1; |
@@ -7894,7 +7973,7 @@ error::Error GLES2DecoderImpl::HandleGetUniformiv( |
error::Error GLES2DecoderImpl::HandleGetUniformfv( |
uint32 immediate_data_size, const gles2::GetUniformfv& c) { |
GLuint program = c.program; |
- GLint fake_location = GLES2Util::UnswizzleLocation(c.location); |
+ GLint fake_location = c.location; |
GLuint service_id; |
GLint real_location = -1; |
Error error; |