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 aba284b86cbe0aae2ecd589ef91cbc9f8482e60b..77a1d9119f4673b8936ba4202e1ff80c23270e1f 100644 |
| --- a/gpu/command_buffer/service/program_manager.cc |
| +++ b/gpu/command_buffer/service/program_manager.cc |
| @@ -26,6 +26,7 @@ |
| #include "gpu/command_buffer/service/program_cache.h" |
| #include "gpu/command_buffer/service/shader_manager.h" |
| #include "third_party/re2/re2/re2.h" |
| +#include "ui/gl/gl_version_info.h" |
| using base::TimeDelta; |
| using base::TimeTicks; |
| @@ -630,6 +631,44 @@ void Program::ExecuteBindAttribLocationCalls() { |
| } |
| } |
| +void Program::ExecuteBindFragDataLocationIndexedCalls() { |
| + Shader* fragment_shader = |
| + attached_shaders_[ShaderTypeToIndex(GL_FRAGMENT_SHADER)].get(); |
| + if (fragment_shader->shader_version() == 100 && |
| + !feature_info().gl_version_info().is_es) { |
| + // Map gl_SecondaryFragColorEXT / gl_SecondaryFragDataEXT of |
| + // EXT_blend_func_extended to real |
| + // color indexes, if underlying context is not ES. |
| + |
| + for (auto const& output_var : fragment_shader->output_variable_list()) { |
| + const std::string& name = output_var.mappedName; |
| + if (name == "gl_FragColor") { |
| + DCHECK(output_var.location == -1); |
| + DCHECK(output_var.arraySize == 0u); |
| + // We leave these unbound by not giving a binding name. The driver will |
| + // bind this. |
| + } else if (name == "gl_FragData") { |
| + DCHECK(output_var.location == -1); |
| + DCHECK(output_var.arraySize != 0u); |
| + // We leave these unbound by not giving a binding name. The driver will |
| + // bind this. |
| + } else if (name == "gl_SecondaryFragColorEXT") { |
| + DCHECK(feature_info().feature_flags().ext_blend_func_extended); |
| + DCHECK(output_var.location == -1); |
| + DCHECK(output_var.arraySize == 0u); |
| + glBindFragDataLocationIndexed(service_id_, 0, 1, |
| + "angle_SecondaryFragColor"); |
| + } else if (name == "gl_SecondaryFragDataEXT") { |
| + DCHECK(feature_info().feature_flags().ext_blend_func_extended); |
| + DCHECK(output_var.location == -1); |
| + DCHECK(output_var.arraySize != 0u); |
| + glBindFragDataLocationIndexed(service_id_, 0, 1, |
| + "angle_SecondaryFragData"); |
| + } |
| + } |
|
Mark Kilgard
2015/08/28 19:53:24
agree with all this
the point being non-ES 2.0 sh
|
| + } |
| +} |
| + |
| bool Program::Link(ShaderManager* manager, |
| Program::VaryingsPackingOption varyings_packing_option, |
| const ShaderCacheCallback& shader_callback) { |
| @@ -714,6 +753,8 @@ bool Program::Link(ShaderManager* manager, |
| } |
| ExecuteBindAttribLocationCalls(); |
| + ExecuteBindFragDataLocationIndexedCalls(); |
| + |
| before_time = TimeTicks::Now(); |
| if (cache && gfx::g_driver_gl.ext.b_GL_ARB_get_program_binary) { |
| glProgramParameteri(service_id(), |
| @@ -1823,6 +1864,26 @@ bool Program::GetUniformsES3(CommonDecoder::Bucket* bucket) const { |
| return true; |
| } |
| +GLint Program::GetFragDataLocation(const std::string& original_name) const { |
| + DCHECK(IsValid()); |
| + Shader* shader = |
| + attached_shaders_[ShaderTypeToIndex(GL_FRAGMENT_SHADER)].get(); |
| + if (!shader->GetOutputVariableInfo(original_name)) { |
| + return -1; |
| + } |
| + return glGetFragDataLocation(service_id_, original_name.c_str()); |
| +} |
| + |
| +GLint Program::GetFragDataIndex(const std::string& original_name) const { |
| + DCHECK(IsValid()); |
| + Shader* shader = |
| + attached_shaders_[ShaderTypeToIndex(GL_FRAGMENT_SHADER)].get(); |
| + if (!shader->GetOutputVariableInfo(original_name)) { |
| + return -1; |
| + } |
| + return glGetFragDataIndex(service_id_, original_name.c_str()); |
| +} |
| + |
| void Program::TransformFeedbackVaryings(GLsizei count, |
| const char* const* varyings, |
| GLenum buffer_mode) { |
| @@ -1845,11 +1906,13 @@ Program::~Program() { |
| ProgramManager::ProgramManager(ProgramCache* program_cache, |
| uint32 max_varying_vectors, |
| + uint32 max_dual_source_draw_buffers, |
| FeatureInfo* feature_info) |
| : program_count_(0), |
| have_context_(true), |
| program_cache_(program_cache), |
| max_varying_vectors_(max_varying_vectors), |
| + max_dual_source_draw_buffers_(max_dual_source_draw_buffers), |
| feature_info_(feature_info) {} |
| ProgramManager::~ProgramManager() { |