OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "gpu/command_buffer/service/shader_manager.h" | 5 #include "gpu/command_buffer/service/shader_manager.h" |
6 | 6 |
7 #include <utility> | 7 #include <utility> |
8 | 8 |
9 #include "base/logging.h" | 9 #include "base/logging.h" |
10 #include "base/strings/string_util.h" | 10 #include "base/strings/string_util.h" |
(...skipping 11 matching lines...) Expand all Loading... |
22 return fullname.substr(0, pos); | 22 return fullname.substr(0, pos); |
23 } | 23 } |
24 | 24 |
25 } // namespace anonymous | 25 } // namespace anonymous |
26 | 26 |
27 Shader::Shader(GLuint service_id, GLenum shader_type) | 27 Shader::Shader(GLuint service_id, GLenum shader_type) |
28 : use_count_(0), | 28 : use_count_(0), |
29 shader_state_(kShaderStateWaiting), | 29 shader_state_(kShaderStateWaiting), |
30 service_id_(service_id), | 30 service_id_(service_id), |
31 shader_type_(shader_type), | 31 shader_type_(shader_type), |
| 32 source_type_(kANGLE), |
32 valid_(false) { | 33 valid_(false) { |
33 } | 34 } |
34 | 35 |
35 Shader::~Shader() { | 36 Shader::~Shader() { |
36 } | 37 } |
37 | 38 |
38 void Shader::RequestCompile() { | 39 void Shader::RequestCompile(scoped_refptr<ShaderTranslatorInterface> translator, |
| 40 TranslatedShaderSourceType type) { |
39 shader_state_ = kShaderStateCompileRequested; | 41 shader_state_ = kShaderStateCompileRequested; |
| 42 translator_ = translator; |
| 43 source_type_ = type; |
40 last_compiled_source_ = source_; | 44 last_compiled_source_ = source_; |
41 } | 45 } |
42 | 46 |
43 void Shader::DoCompile(ShaderTranslatorInterface* translator, | 47 void Shader::DoCompile() { |
44 TranslatedShaderSourceType type) { | |
45 // We require that RequestCompile() must be called before DoCompile(), | 48 // We require that RequestCompile() must be called before DoCompile(), |
46 // so we can return early if the shader state is not what we expect. | 49 // so we can return early if the shader state is not what we expect. |
47 if (shader_state_ != kShaderStateCompileRequested) { | 50 if (shader_state_ != kShaderStateCompileRequested) { |
48 return; | 51 return; |
49 } | 52 } |
50 | 53 |
51 // Signify the shader has been compiled, whether or not it is valid | 54 // Signify the shader has been compiled, whether or not it is valid |
52 // is dependent on the |valid_| member variable. | 55 // is dependent on the |valid_| member variable. |
53 shader_state_ = kShaderStateCompiled; | 56 shader_state_ = kShaderStateCompiled; |
| 57 valid_ = false; |
54 | 58 |
55 // Translate GL ES 2.0 shader to Desktop GL shader and pass that to | 59 // Translate GL ES 2.0 shader to Desktop GL shader and pass that to |
56 // glShaderSource and then glCompileShader. | 60 // glShaderSource and then glCompileShader. |
57 const char* source_for_driver = last_compiled_source_.c_str(); | 61 const char* source_for_driver = last_compiled_source_.c_str(); |
| 62 ShaderTranslatorInterface* translator = translator_.get(); |
58 if (translator) { | 63 if (translator) { |
59 valid_ = translator->Translate(last_compiled_source_, | 64 bool success = translator->Translate(last_compiled_source_, |
60 &log_info_, | 65 &log_info_, |
61 &translated_source_, | 66 &translated_source_, |
62 &attrib_map_, | 67 &attrib_map_, |
63 &uniform_map_, | 68 &uniform_map_, |
64 &varying_map_, | 69 &varying_map_, |
65 &name_map_); | 70 &name_map_); |
66 if (!valid_) { | 71 if (!success) { |
67 return; | 72 return; |
68 } | 73 } |
69 source_for_driver = translated_source_.c_str(); | 74 source_for_driver = translated_source_.c_str(); |
70 } | 75 } |
71 | 76 |
72 glShaderSource(service_id_, 1, &source_for_driver, NULL); | 77 glShaderSource(service_id_, 1, &source_for_driver, NULL); |
73 glCompileShader(service_id_); | 78 glCompileShader(service_id_); |
74 if (type == kANGLE) { | 79 if (source_type_ == kANGLE) { |
75 GLint max_len = 0; | 80 GLint max_len = 0; |
76 glGetShaderiv(service_id_, | 81 glGetShaderiv(service_id_, |
77 GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE, | 82 GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE, |
78 &max_len); | 83 &max_len); |
79 translated_source_.resize(max_len); | 84 translated_source_.resize(max_len); |
80 GLint len = 0; | 85 GLint len = 0; |
81 glGetTranslatedShaderSourceANGLE( | 86 glGetTranslatedShaderSourceANGLE( |
82 service_id_, translated_source_.size(), | 87 service_id_, translated_source_.size(), |
83 &len, &translated_source_.at(0)); | 88 &len, &translated_source_.at(0)); |
84 DCHECK(max_len == 0 || len < max_len); | 89 DCHECK(max_len == 0 || len < max_len); |
85 DCHECK(len == 0 || translated_source_[len] == '\0'); | 90 DCHECK(len == 0 || translated_source_[len] == '\0'); |
86 translated_source_.resize(len); | 91 translated_source_.resize(len); |
| 92 source_for_driver = translated_source_.c_str(); |
87 } | 93 } |
88 | 94 |
89 GLint status = GL_FALSE; | 95 GLint status = GL_FALSE; |
90 glGetShaderiv(service_id_, GL_COMPILE_STATUS, &status); | 96 glGetShaderiv(service_id_, GL_COMPILE_STATUS, &status); |
91 if (status != GL_TRUE) { | 97 if (status == GL_TRUE) { |
| 98 valid_ = true; |
| 99 } else { |
92 // We cannot reach here if we are using the shader translator. | 100 // We cannot reach here if we are using the shader translator. |
93 // All invalid shaders must be rejected by the translator. | 101 // All invalid shaders must be rejected by the translator. |
94 // All translated shaders must compile. | 102 // All translated shaders must compile. |
95 GLint max_len = 0; | 103 GLint max_len = 0; |
96 glGetShaderiv(service_id_, GL_INFO_LOG_LENGTH, &max_len); | 104 glGetShaderiv(service_id_, GL_INFO_LOG_LENGTH, &max_len); |
97 log_info_.resize(max_len); | 105 log_info_.resize(max_len); |
98 GLint len = 0; | 106 GLint len = 0; |
99 glGetShaderInfoLog(service_id_, log_info_.size(), &len, &log_info_.at(0)); | 107 glGetShaderInfoLog(service_id_, log_info_.size(), &len, &log_info_.at(0)); |
100 DCHECK(max_len == 0 || len < max_len); | 108 DCHECK(max_len == 0 || len < max_len); |
101 DCHECK(len == 0 || log_info_[len] == '\0'); | 109 DCHECK(len == 0 || log_info_[len] == '\0'); |
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
250 DCHECK(shader); | 258 DCHECK(shader); |
251 DCHECK(IsOwned(shader)); | 259 DCHECK(IsOwned(shader)); |
252 shader->DecUseCount(); | 260 shader->DecUseCount(); |
253 RemoveShader(shader); | 261 RemoveShader(shader); |
254 } | 262 } |
255 | 263 |
256 } // namespace gles2 | 264 } // namespace gles2 |
257 } // namespace gpu | 265 } // namespace gpu |
258 | 266 |
259 | 267 |
OLD | NEW |