| 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..ca0725533b0a172b70f41b72dd2e2b2dc1f54fc2 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;
|
| @@ -316,6 +327,8 @@ void Program::Reset() {
|
| attrib_location_to_index_map_.clear();
|
| fragment_output_type_mask_ = 0u;
|
| fragment_output_written_mask_ = 0u;
|
| + vertex_input_base_type_mask_.clear();
|
| + vertex_input_type_written_mask_.clear();
|
| }
|
|
|
| void Program::UpdateFragmentOutputBaseTypes() {
|
| @@ -351,8 +364,33 @@ 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() {
|
| + max_vertex_attribs_ = manager_->max_vertex_attribs();
|
| + uint32_t packed_size = max_vertex_attribs_ / 16;
|
| + packed_size += (max_vertex_attribs_ % 16 == 0) ? 0 : 1;
|
| + vertex_input_base_type_mask_.resize(packed_size);
|
| + vertex_input_type_written_mask_.resize(packed_size);
|
| +
|
| + for (uint32_t ii = 0; ii < packed_size; ++ii) {
|
| + vertex_input_type_written_mask_[ii] = 0u;
|
| + vertex_input_base_type_mask_[ii] = 0u;
|
| + }
|
| +
|
| + for (size_t ii = 0; ii < attrib_infos_.size(); ++ii) {
|
| + DCHECK(ii < max_vertex_attribs_);
|
| + const VertexAttrib& input = attrib_infos_[ii];
|
| + if (ProgramManager::HasBuiltInPrefix(input.name)) {
|
| + continue;
|
| }
|
| + int shift_bits = (input.location % 16) * 2;
|
| + vertex_input_type_written_mask_[ii / 16] |= 0x3 << shift_bits;
|
| + vertex_input_base_type_mask_[ii / 16] |=
|
| + InputOutputTypeToBaseType(true, input.type) << shift_bits;
|
| }
|
| }
|
|
|
| @@ -623,6 +661,7 @@ void Program::Update() {
|
| UpdateFragmentInputs();
|
| UpdateProgramOutputs();
|
| UpdateFragmentOutputBaseTypes();
|
| + UpdateVertexInputBaseTypes();
|
| UpdateUniformBlockSizeInfo();
|
|
|
| valid_ = true;
|
| @@ -2376,6 +2415,7 @@ ProgramManager::ProgramManager(
|
| uint32_t max_varying_vectors,
|
| uint32_t max_draw_buffers,
|
| uint32_t max_dual_source_draw_buffers,
|
| + uint32_t max_vertex_attribs,
|
| const GpuPreferences& gpu_preferences,
|
| FeatureInfo* feature_info)
|
| : program_count_(0),
|
| @@ -2384,6 +2424,7 @@ ProgramManager::ProgramManager(
|
| max_varying_vectors_(max_varying_vectors),
|
| max_draw_buffers_(max_draw_buffers),
|
| max_dual_source_draw_buffers_(max_dual_source_draw_buffers),
|
| + max_vertex_attribs_(max_vertex_attribs),
|
| gpu_preferences_(gpu_preferences),
|
| feature_info_(feature_info) {}
|
|
|
|
|