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