Chromium Code Reviews| Index: gpu/command_buffer/service/context_state.cc |
| diff --git a/gpu/command_buffer/service/context_state.cc b/gpu/command_buffer/service/context_state.cc |
| index 5c5da8275053b1abfc106abf9dea885472572854..9232c8ed4b58a0e7fbe24e643ed808034da90f22 100644 |
| --- a/gpu/command_buffer/service/context_state.cc |
| +++ b/gpu/command_buffer/service/context_state.cc |
| @@ -81,6 +81,113 @@ TextureUnit::TextureUnit() |
| TextureUnit::~TextureUnit() { |
| } |
| +bool Vec4::Equal(const Vec4& other) const { |
| + if (type_ != other.type_) |
| + return false; |
| + switch (type_) { |
| + case kFloat: |
| + for (size_t ii = 0; ii < 4; ++ii) { |
| + if (v_[ii].float_value != other.v_[ii].float_value) |
| + return false; |
| + } |
| + break; |
| + case kInt: |
| + for (size_t ii = 0; ii < 4; ++ii) { |
| + if (v_[ii].int_value != other.v_[ii].int_value) |
| + return false; |
| + } |
| + break; |
| + case kUInt: |
| + for (size_t ii = 0; ii < 4; ++ii) { |
| + if (v_[ii].uint_value != other.v_[ii].uint_value) |
| + return false; |
| + } |
| + break; |
| + } |
| + return true; |
| +} |
| + |
| +template <> |
| +void Vec4::GetValues<GLfloat>(GLfloat* values) const { |
| + DCHECK(values); |
| + switch (type_) { |
| + case kFloat: |
| + for (size_t ii = 0; ii < 4; ++ii) |
| + values[ii] = v_[ii].float_value; |
| + break; |
| + case kInt: |
| + for (size_t ii = 0; ii < 4; ++ii) |
| + values[ii] = static_cast<GLfloat>(v_[ii].int_value); |
|
Zhenyao Mo
2015/05/13 16:52:25
Note that the casting behavior might change depend
|
| + break; |
| + case kUInt: |
| + for (size_t ii = 0; ii < 4; ++ii) |
| + values[ii] = static_cast<GLfloat>(v_[ii].uint_value); |
| + break; |
| + } |
| +} |
| + |
| +template <> |
| +void Vec4::GetValues<GLint>(GLint* values) const { |
| + DCHECK(values); |
| + switch (type_) { |
| + case kFloat: |
| + for (size_t ii = 0; ii < 4; ++ii) |
| + values[ii] = static_cast<GLint>(v_[ii].float_value); |
| + break; |
| + case kInt: |
| + for (size_t ii = 0; ii < 4; ++ii) |
| + values[ii] = v_[ii].int_value; |
| + break; |
| + case kUInt: |
| + for (size_t ii = 0; ii < 4; ++ii) |
| + values[ii] = static_cast<GLint>(v_[ii].uint_value); |
| + break; |
| + } |
| +} |
| + |
| +template <> |
| +void Vec4::GetValues<GLuint>(GLuint* values) const { |
| + DCHECK(values); |
| + switch (type_) { |
| + case kFloat: |
| + for (size_t ii = 0; ii < 4; ++ii) |
| + values[ii] = static_cast<GLuint>(v_[ii].float_value); |
| + break; |
| + case kInt: |
| + for (size_t ii = 0; ii < 4; ++ii) |
| + values[ii] = static_cast<GLuint>(v_[ii].int_value); |
| + break; |
| + case kUInt: |
| + for (size_t ii = 0; ii < 4; ++ii) |
| + values[ii] = v_[ii].uint_value; |
| + break; |
| + } |
| +} |
| + |
| +template <> |
| +void Vec4::SetValues<GLfloat>(const GLfloat* values) { |
| + DCHECK(values); |
| + for (size_t ii = 0; ii < 4; ++ii) |
| + v_[ii].float_value = values[ii]; |
| + type_ = kFloat; |
| +} |
| + |
| +template <> |
| +void Vec4::SetValues<GLint>(const GLint* values) { |
| + DCHECK(values); |
| + for (size_t ii = 0; ii < 4; ++ii) |
| + v_[ii].int_value = values[ii]; |
| + type_ = kInt; |
| +} |
| + |
| +template <> |
| +void Vec4::SetValues<GLuint>(const GLuint* values) { |
| + DCHECK(values); |
| + for (size_t ii = 0; ii < 4; ++ii) |
| + v_[ii].uint_value = values[ii]; |
| + type_ = kUInt; |
| +} |
| + |
| ContextState::ContextState(FeatureInfo* feature_info, |
| ErrorStateClient* error_state_client, |
| Logger* logger) |
| @@ -185,7 +292,29 @@ void ContextState::RestoreActiveTextureUnitBinding(unsigned int target) const { |
| void ContextState::RestoreVertexAttribValues() const { |
| for (size_t attrib = 0; attrib < vertex_attrib_manager->num_attribs(); |
| ++attrib) { |
| - glVertexAttrib4fv(attrib, attrib_values[attrib].v); |
| + switch (attrib_values[attrib].type()) { |
| + case Vec4::kFloat: |
| + { |
| + GLfloat v[4]; |
| + attrib_values[attrib].GetValues(v); |
| + glVertexAttrib4fv(attrib, v); |
| + } |
| + break; |
| + case Vec4::kInt: |
| + { |
| + GLint v[4]; |
| + attrib_values[attrib].GetValues(v); |
| + glVertexAttribI4iv(attrib, v); |
| + } |
| + break; |
| + case Vec4::kUInt: |
| + { |
| + GLuint v[4]; |
| + attrib_values[attrib].GetValues(v); |
| + glVertexAttribI4uiv(attrib, v); |
| + } |
| + break; |
| + } |
| } |
| } |