Index: gpu/command_buffer/service/program_manager.cc |
diff --git a/gpu/command_buffer/service/program_manager.cc b/gpu/command_buffer/service/program_manager.cc |
index daaa68c95dcf487b23ea9894a9d8dd1ef50abe91..6d5a00b6597e7f4b98a83d286108b02b8dc00b6a 100644 |
--- a/gpu/command_buffer/service/program_manager.cc |
+++ b/gpu/command_buffer/service/program_manager.cc |
@@ -356,6 +356,39 @@ void Program::UpdateFragmentOutputBaseTypes() { |
} |
} |
+void Program::UpdateUniformBlockSizeInfo() { |
+ switch (feature_info().context_type()) { |
+ case CONTEXT_TYPE_OPENGLES2: |
+ case CONTEXT_TYPE_WEBGL1: |
+ // Uniform blocks do not exist in ES2. |
+ return; |
+ default: |
+ break; |
+ } |
+ |
+ uniform_block_size_info_.clear(); |
+ |
+ GLint num_uniform_blocks = 0; |
+ glGetProgramiv(service_id_, GL_ACTIVE_UNIFORM_BLOCKS, &num_uniform_blocks); |
+ uniform_block_size_info_.resize(num_uniform_blocks); |
+ for (GLint ii = 0; ii < num_uniform_blocks; ++ii) { |
+ GLint binding = 0; |
+ glGetActiveUniformBlockiv( |
+ service_id_, ii, GL_UNIFORM_BLOCK_BINDING, &binding); |
+ uniform_block_size_info_[ii].binding = static_cast<GLuint>(binding); |
+ |
+ GLint size = 0; |
+ glGetActiveUniformBlockiv( |
+ service_id_, ii, GL_UNIFORM_BLOCK_DATA_SIZE, &size); |
+ uniform_block_size_info_[ii].data_size = static_cast<GLuint>(size); |
+ } |
+} |
+ |
+void Program::SetUniformBlockBinding(GLuint index, GLuint binding) { |
+ DCHECK_GT(uniform_block_size_info_.size(), index); |
+ uniform_block_size_info_[index].binding = binding; |
+} |
+ |
std::string Program::ProcessLogInfo( |
const std::string& log) { |
std::string output; |
@@ -590,6 +623,7 @@ void Program::Update() { |
UpdateFragmentInputs(); |
UpdateProgramOutputs(); |
UpdateFragmentOutputBaseTypes(); |
+ UpdateUniformBlockSizeInfo(); |
valid_ = true; |
} |