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() { |