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

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

Issue 2958763003: Fix a bug in shader/program relationship. (Closed)
Patch Set: Fix a bug in shader/program relationship. Created 3 years, 6 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/program_manager.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 08112967c42349360fbccfed7325bbcd605b80cc..a6825362706841d8e7f32652af34336a7de2df65 100644
--- a/gpu/command_buffer/service/program_manager.cc
+++ b/gpu/command_buffer/service/program_manager.cc
@@ -420,7 +420,8 @@ void Program::UpdateFragmentOutputBaseTypes() {
fragment_output_type_mask_ = 0u;
fragment_output_written_mask_ = 0u;
Shader* fragment_shader =
- attached_shaders_[ShaderTypeToIndex(GL_FRAGMENT_SHADER)].get();
+ shaders_from_last_successful_link_[ShaderTypeToIndex(GL_FRAGMENT_SHADER)]
+ .get();
DCHECK(fragment_shader);
for (auto const& output : fragment_shader->output_variable_list()) {
int location = output.location;
@@ -502,7 +503,7 @@ void Program::UpdateTransformFeedbackInfo() {
effective_transform_feedback_buffer_mode_ = transform_feedback_buffer_mode_;
effective_transform_feedback_varyings_ = transform_feedback_varyings_;
- Shader* vertex_shader = attached_shaders_[0].get();
+ Shader* vertex_shader = shaders_from_last_successful_link_[0].get();
DCHECK(vertex_shader);
if (effective_transform_feedback_buffer_mode_ == GL_INTERLEAVED_ATTRIBS) {
@@ -826,7 +827,7 @@ void Program::UpdateUniforms() {
bool is_array = false;
std::string client_name;
for (size_t i = 0; i < kMaxAttachedShaders && client_name.empty(); ++i) {
- const auto& shader = attached_shaders_[i];
+ const auto& shader = shaders_from_last_successful_link_[i];
if (!shader)
continue;
const sh::ShaderVariable* info = nullptr;
@@ -977,7 +978,8 @@ void Program::UpdateFragmentInputs() {
std::unique_ptr<char[]> name_buffer(new char[max_len]);
Shader* fragment_shader =
- attached_shaders_[ShaderTypeToIndex(GL_FRAGMENT_SHADER)].get();
+ shaders_from_last_successful_link_[ShaderTypeToIndex(GL_FRAGMENT_SHADER)]
+ .get();
const GLenum kQueryProperties[] = {GL_LOCATION, GL_TYPE, GL_ARRAY_SIZE};
@@ -1084,7 +1086,8 @@ void Program::UpdateProgramOutputs() {
return;
Shader* fragment_shader =
- attached_shaders_[ShaderTypeToIndex(GL_FRAGMENT_SHADER)].get();
+ shaders_from_last_successful_link_[ShaderTypeToIndex(GL_FRAGMENT_SHADER)]
+ .get();
for (auto const& output_var : fragment_shader->output_variable_list()) {
const std::string& service_name = output_var.mappedName;
@@ -1390,6 +1393,8 @@ bool Program::Link(ShaderManager* manager,
GLint success = 0;
glGetProgramiv(service_id(), GL_LINK_STATUS, &success);
if (success == GL_TRUE) {
+ for (size_t ii = 0; ii < kMaxAttachedShaders; ++ii)
+ shaders_from_last_successful_link_[ii] = attached_shaders_[ii];
Update();
if (link) {
// ANGLE updates the translated shader sources on link.
@@ -1551,7 +1556,7 @@ const std::string* Program::GetOriginalNameFromHashedName(
const sh::Varying* Program::GetVaryingInfo(
const std::string& hashed_name) const {
- for (auto shader : attached_shaders_) {
+ for (auto shader : shaders_from_last_successful_link_) {
if (shader) {
const sh::Varying* info = shader->GetVaryingInfo(hashed_name);
if (info)
@@ -1563,7 +1568,7 @@ const sh::Varying* Program::GetVaryingInfo(
const sh::InterfaceBlock* Program::GetInterfaceBlockInfo(
const std::string& hashed_name) const {
- for (auto shader : attached_shaders_) {
+ for (auto shader : shaders_from_last_successful_link_) {
if (shader) {
const sh::InterfaceBlock* info =
shader->GetInterfaceBlockInfo(hashed_name);
@@ -1641,7 +1646,9 @@ void Program::GetVertexAttribData(
const std::string& name, std::string* original_name, GLenum* type) const {
DCHECK(original_name);
DCHECK(type);
- Shader* shader = attached_shaders_[ShaderTypeToIndex(GL_VERTEX_SHADER)].get();
+ Shader* shader =
+ shaders_from_last_successful_link_[ShaderTypeToIndex(GL_VERTEX_SHADER)]
+ .get();
if (shader) {
// Vertex attributes can not be arrays or structs (GLSL ES 3.00.4, section
// 4.3.4, "Input Variables"), so the top level sh::Attribute returns the
« no previous file with comments | « gpu/command_buffer/service/program_manager.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698