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; |