Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(280)

Side by Side Diff: gpu/command_buffer/service/shader_manager.cc

Issue 935333002: Update from https://crrev.com/316786 (Closed) Base URL: git@github.com:domokit/mojo.git@master
Patch Set: Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
OLDNEW
« no previous file with comments | « gpu/command_buffer/service/shader_manager.h ('k') | gpu/command_buffer/service/shader_manager_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698