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

Unified Diff: gpu/command_buffer/service/shader_manager.cc

Issue 1001833005: Update from https://crrev.com/320343 (Closed) Base URL: git@github.com:domokit/mojo.git@master
Patch Set: Supress Created 5 years, 9 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 side-by-side diff with in-line comments
Download patch
« 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 »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 fa071805eef226d9189e0ee640e0ea53b66ab80d..55754b7d4749f851ff6b0751ebe25ce443e46fa8 100644
--- a/gpu/command_buffer/service/shader_manager.cc
+++ b/gpu/command_buffer/service/shader_manager.cc
@@ -27,6 +27,7 @@ std::string GetTopVariableName(const std::string& fullname) {
Shader::Shader(GLuint service_id, GLenum shader_type)
: use_count_(0),
shader_state_(kShaderStateWaiting),
+ marked_for_deletion_(false),
service_id_(service_id),
shader_type_(shader_type),
source_type_(kANGLE),
@@ -36,6 +37,12 @@ Shader::Shader(GLuint service_id, GLenum shader_type)
Shader::~Shader() {
}
+void Shader::Destroy() {
+ if (service_id_) {
+ DeleteServiceID();
+ }
+}
+
void Shader::RequestCompile(scoped_refptr<ShaderTranslatorInterface> translator,
TranslatedShaderSourceType type) {
shader_state_ = kShaderStateCompileRequested;
@@ -105,6 +112,8 @@ void Shader::DoCompile() {
// We cannot reach here if we are using the shader translator.
// All invalid shaders must be rejected by the translator.
// All translated shaders must compile.
+ std::string translator_log = log_info_;
+
GLint max_len = 0;
glGetShaderiv(service_id_, GL_INFO_LOG_LENGTH, &max_len);
log_info_.resize(max_len);
@@ -115,9 +124,11 @@ void Shader::DoCompile() {
DCHECK(len == 0 || log_info_[len] == '\0');
log_info_.resize(len);
}
+
LOG_IF(ERROR, translator)
<< "Shader translator allowed/produced an invalid shader "
<< "unless the driver is buggy:"
+ << "\n--Log from shader translator--\n" << translator_log
<< "\n--original-shader--\n" << last_compiled_source_
<< "\n--translated-shader--\n" << source_for_driver
<< "\n--info-log--\n" << log_info_;
@@ -131,13 +142,22 @@ void Shader::IncUseCount() {
void Shader::DecUseCount() {
--use_count_;
DCHECK_GE(use_count_, 0);
+ if (service_id_ && use_count_ == 0 && marked_for_deletion_) {
+ DeleteServiceID();
+ }
}
-void Shader::Delete() {
- if (use_count_ > 0) {
- // If attached, compile the shader before we delete it.
- DoCompile();
+void Shader::MarkForDeletion() {
+ DCHECK(!marked_for_deletion_);
+ DCHECK_NE(service_id_, 0u);
+
+ marked_for_deletion_ = true;
+ if (use_count_ == 0) {
+ DeleteServiceID();
}
+}
+
+void Shader::DeleteServiceID() {
DCHECK_NE(service_id_, 0u);
glDeleteShader(service_id_);
service_id_ = 0;
@@ -189,9 +209,7 @@ void ShaderManager::Destroy(bool have_context) {
while (!shaders_.empty()) {
if (have_context) {
Shader* shader = shaders_.begin()->second.get();
- if (!shader->IsDeleted()) {
- shader->Delete();
- }
+ shader->Destroy();
}
shaders_.erase(shaders_.begin());
}
@@ -254,7 +272,7 @@ void ShaderManager::RemoveShader(Shader* shader) {
void ShaderManager::Delete(Shader* shader) {
DCHECK(shader);
DCHECK(IsOwned(shader));
- shader->Delete();
+ shader->MarkForDeletion();
RemoveShader(shader);
}
« 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