Chromium Code Reviews| 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 8ce0c847d61397dda43d2ee6411ab78fb6639fa1..907cb70ed724b317c14ad07777e1802bc60640c1 100644 |
| --- a/gpu/command_buffer/service/program_manager.cc |
| +++ b/gpu/command_buffer/service/program_manager.cc |
| @@ -117,7 +117,7 @@ uint32_t ComputeOffset(const void* start, const void* position) { |
| static_cast<const uint8_t*>(start); |
| } |
| -ShaderVariableBaseType FragmentOutputTypeToBaseType(GLenum type) { |
| +ShaderVariableBaseType InputOutputTypeToBaseType(bool is_input, GLenum type) { |
| switch (type) { |
| case GL_INT: |
| case GL_INT_VEC2: |
| @@ -134,6 +134,17 @@ ShaderVariableBaseType FragmentOutputTypeToBaseType(GLenum type) { |
| case GL_FLOAT_VEC3: |
| case GL_FLOAT_VEC4: |
| return SHADER_VARIABLE_FLOAT; |
| + case GL_FLOAT_MAT2: |
| + case GL_FLOAT_MAT3: |
| + case GL_FLOAT_MAT4: |
| + case GL_FLOAT_MAT2x3: |
| + case GL_FLOAT_MAT3x2: |
| + case GL_FLOAT_MAT2x4: |
| + case GL_FLOAT_MAT4x2: |
| + case GL_FLOAT_MAT3x4: |
| + case GL_FLOAT_MAT4x3: |
| + DCHECK(is_input); |
| + return SHADER_VARIABLE_FLOAT; |
| default: |
| NOTREACHED(); |
| return SHADER_VARIABLE_UNDEFINED_TYPE; |
| @@ -296,7 +307,9 @@ Program::Program(ProgramManager* manager, GLuint service_id) |
| uniforms_cleared_(false), |
| transform_feedback_buffer_mode_(GL_NONE), |
| fragment_output_type_mask_(0u), |
| - fragment_output_written_mask_(0u) { |
| + fragment_output_written_mask_(0u), |
| + vertex_input_type_mask_(0u), |
| + vertex_input_written_mask_(0u) { |
| DCHECK(manager_); |
| manager_->StartTracking(this); |
| } |
| @@ -316,6 +329,8 @@ void Program::Reset() { |
| attrib_location_to_index_map_.clear(); |
| fragment_output_type_mask_ = 0u; |
| fragment_output_written_mask_ = 0u; |
| + vertex_input_type_mask_ = 0u; |
| + vertex_input_written_mask_ = 0u; |
| } |
| void Program::UpdateFragmentOutputBaseTypes() { |
| @@ -351,11 +366,23 @@ void Program::UpdateFragmentOutputBaseTypes() { |
| int shift_bits = ii * 2; |
| fragment_output_written_mask_ |= 0x3 << shift_bits; |
| fragment_output_type_mask_ |= |
| - FragmentOutputTypeToBaseType(output.type) << shift_bits; |
| + InputOutputTypeToBaseType(false, output.type) << shift_bits; |
| } |
| } |
| } |
| +void Program::UpdateVertexInputBaseTypes() { |
| + vertex_input_type_mask_ = 0u; |
| + vertex_input_written_mask_ = 0u; |
| + for (size_t ii = 0; ii < attrib_infos_.size(); ++ii) { |
|
Zhenyao Mo
2016/07/21 13:10:46
See, if size() > 16, your code will be wrong.
yunchao
2016/07/22 13:43:54
Acknowledged.
|
| + const VertexAttrib& input = attrib_infos_[ii]; |
| + int shift_bits = input.location * 2; |
| + vertex_input_written_mask_ |= 0x3 << shift_bits; |
| + vertex_input_type_mask_ |= |
| + InputOutputTypeToBaseType(true, input.type) << shift_bits; |
| + } |
| +} |
| + |
| void Program::UpdateUniformBlockSizeInfo() { |
| switch (feature_info().context_type()) { |
| case CONTEXT_TYPE_OPENGLES2: |
| @@ -623,6 +650,7 @@ void Program::Update() { |
| UpdateFragmentInputs(); |
| UpdateProgramOutputs(); |
| UpdateFragmentOutputBaseTypes(); |
| + UpdateVertexInputBaseTypes(); |
| UpdateUniformBlockSizeInfo(); |
| valid_ = true; |