| Index: gpu/command_buffer/service/shader_manager.cc
|
| diff --git a/gpu/command_buffer/service/shader_manager.cc b/gpu/command_buffer/service/shader_manager.cc
|
| index 2707b90b92de4105d6b8c9f1dad28a0663158f0e..90b15760a5e8438a275047e8993e215905ffff5a 100644
|
| --- a/gpu/command_buffer/service/shader_manager.cc
|
| +++ b/gpu/command_buffer/service/shader_manager.cc
|
| @@ -26,6 +26,7 @@ std::string GetTopVariableName(const std::string& fullname) {
|
|
|
| Shader::Shader(GLuint service_id, GLenum shader_type)
|
| : use_count_(0),
|
| + shader_state_(kShaderStateWaiting),
|
| service_id_(service_id),
|
| shader_type_(shader_type),
|
| valid_(false) {
|
| @@ -34,13 +35,28 @@ Shader::Shader(GLuint service_id, GLenum shader_type)
|
| Shader::~Shader() {
|
| }
|
|
|
| +void Shader::RequestCompile() {
|
| + shader_state_ = kShaderStateCompileRequested;
|
| + last_compiled_source_ = source_;
|
| +}
|
| +
|
| void Shader::DoCompile(ShaderTranslatorInterface* translator,
|
| TranslatedShaderSourceType type) {
|
| + // We require that RequestCompile() must be called before DoCompile(),
|
| + // so we can return early if the shader state is not what we expect.
|
| + if (shader_state_ != kShaderStateCompileRequested) {
|
| + return;
|
| + }
|
| +
|
| + // Signify the shader has been compiled, whether or not it is valid
|
| + // is dependent on the |valid_| member variable.
|
| + shader_state_ = kShaderStateCompiled;
|
| +
|
| // Translate GL ES 2.0 shader to Desktop GL shader and pass that to
|
| // glShaderSource and then glCompileShader.
|
| - const char* source_for_driver = source_.c_str();
|
| + const char* source_for_driver = last_compiled_source_.c_str();
|
| if (translator) {
|
| - valid_ = translator->Translate(source_,
|
| + valid_ = translator->Translate(last_compiled_source_,
|
| &log_info_,
|
| &translated_source_,
|
| &attrib_map_,
|
| @@ -50,7 +66,6 @@ void Shader::DoCompile(ShaderTranslatorInterface* translator,
|
| if (!valid_) {
|
| return;
|
| }
|
| - signature_source_ = source_;
|
| source_for_driver = translated_source_.c_str();
|
| }
|
|
|
| @@ -61,13 +76,14 @@ void Shader::DoCompile(ShaderTranslatorInterface* translator,
|
| glGetShaderiv(service_id_,
|
| GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE,
|
| &max_len);
|
| - scoped_ptr<char[]> buffer(new char[max_len]);
|
| + translated_source_.resize(max_len);
|
| GLint len = 0;
|
| glGetTranslatedShaderSourceANGLE(
|
| - service_id_, max_len, &len, buffer.get());
|
| + service_id_, translated_source_.size(),
|
| + &len, &translated_source_.at(0));
|
| DCHECK(max_len == 0 || len < max_len);
|
| - DCHECK(len == 0 || buffer[len] == '\0');
|
| - translated_source_ = std::string(buffer.get(), len);
|
| + DCHECK(len == 0 || translated_source_[len] == '\0');
|
| + translated_source_.resize(len);
|
| }
|
|
|
| GLint status = GL_FALSE;
|
| @@ -78,17 +94,17 @@ void Shader::DoCompile(ShaderTranslatorInterface* translator,
|
| // All translated shaders must compile.
|
| GLint max_len = 0;
|
| glGetShaderiv(service_id_, GL_INFO_LOG_LENGTH, &max_len);
|
| - scoped_ptr<char[]> buffer(new char[max_len]);
|
| + log_info_.resize(max_len);
|
| GLint len = 0;
|
| - glGetShaderInfoLog(service_id_, max_len, &len, buffer.get());
|
| + glGetShaderInfoLog(service_id_, log_info_.size(), &len, &log_info_.at(0));
|
| DCHECK(max_len == 0 || len < max_len);
|
| - DCHECK(len == 0 || buffer[len] == '\0');
|
| + DCHECK(len == 0 || log_info_[len] == '\0');
|
| valid_ = false;
|
| - log_info_ = std::string(buffer.get(), len);
|
| + log_info_.resize(len);
|
| LOG_IF(ERROR, translator)
|
| << "Shader translator allowed/produced an invalid shader "
|
| << "unless the driver is buggy:"
|
| - << "\n--original-shader--\n" << source_
|
| + << "\n--original-shader--\n" << last_compiled_source_
|
| << "\n--translated-shader--\n" << source_for_driver
|
| << "\n--info-log--\n" << log_info_;
|
| }
|
|
|