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 daaa68c95dcf487b23ea9894a9d8dd1ef50abe91..1ce4b24d1d17af78e0687d22589f6190799a9f2d 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) { |
+ 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; |
+ } |
+} |
+ |
std::string Program::ProcessLogInfo( |
const std::string& log) { |
std::string output; |
@@ -590,6 +617,7 @@ void Program::Update() { |
UpdateFragmentInputs(); |
UpdateProgramOutputs(); |
UpdateFragmentOutputBaseTypes(); |
+ UpdateVertexInputBaseTypes(); |
valid_ = true; |
} |