| Index: gpu/command_buffer/service/memory_program_cache.cc
|
| diff --git a/gpu/command_buffer/service/memory_program_cache.cc b/gpu/command_buffer/service/memory_program_cache.cc
|
| index 87378aa8aa6161c5b56785cea2cf64bf040607ed..86fffd381644f191662476e7561251b249dfac22 100644
|
| --- a/gpu/command_buffer/service/memory_program_cache.cc
|
| +++ b/gpu/command_buffer/service/memory_program_cache.cc
|
| @@ -45,47 +45,96 @@ enum ShaderMapType {
|
| VARYING_MAP
|
| };
|
|
|
| -void StoreShaderInfo(ShaderMapType type, ShaderProto *proto,
|
| - const ShaderTranslator::VariableMap& map) {
|
| - ShaderTranslator::VariableMap::const_iterator iter;
|
| - for (iter = map.begin(); iter != map.end(); ++iter) {
|
| - ShaderInfoProto* info = NULL;
|
| - switch (type) {
|
| - case UNIFORM_MAP:
|
| - info = proto->add_uniforms();
|
| - break;
|
| - case ATTRIB_MAP:
|
| - info = proto->add_attribs();
|
| - break;
|
| - case VARYING_MAP:
|
| - info = proto->add_varyings();
|
| - break;
|
| - default: NOTREACHED();
|
| - }
|
| -
|
| - info->set_key(iter->first);
|
| - info->set_type(iter->second.type);
|
| - info->set_size(iter->second.size);
|
| - info->set_precision(iter->second.precision);
|
| - info->set_static_use(iter->second.static_use);
|
| - info->set_name(iter->second.name);
|
| +void FillShaderVariableProto(
|
| + ShaderVariableProto* proto, const sh::ShaderVariable& variable) {
|
| + proto->set_type(variable.type);
|
| + proto->set_precision(variable.precision);
|
| + proto->set_name(variable.name);
|
| + proto->set_mapped_name(variable.mappedName);
|
| + proto->set_array_size(variable.arraySize);
|
| + proto->set_static_use(variable.staticUse);
|
| + for (size_t ii = 0; ii < variable.fields.size(); ++ii) {
|
| + ShaderVariableProto* field = proto->add_fields();
|
| + FillShaderVariableProto(field, variable.fields[ii]);
|
| }
|
| + proto->set_struct_name(variable.structName);
|
| +}
|
| +
|
| +void FillShaderAttributeProto(
|
| + ShaderAttributeProto* proto, const sh::Attribute& attrib) {
|
| + FillShaderVariableProto(proto->mutable_basic(), attrib);
|
| + proto->set_location(attrib.location);
|
| +}
|
| +
|
| +void FillShaderUniformProto(
|
| + ShaderUniformProto* proto, const sh::Uniform& uniform) {
|
| + FillShaderVariableProto(proto->mutable_basic(), uniform);
|
| }
|
|
|
| -void RetrieveShaderInfo(const ShaderInfoProto& proto,
|
| - ShaderTranslator::VariableMap* map) {
|
| - ShaderTranslator::VariableInfo info(
|
| - proto.type(), proto.size(), proto.precision(),
|
| - proto.static_use(), proto.name());
|
| - (*map)[proto.key()] = info;
|
| +void FillShaderVaryingProto(
|
| + ShaderVaryingProto* proto, const sh::Varying& varying) {
|
| + FillShaderVariableProto(proto->mutable_basic(), varying);
|
| + proto->set_interpolation(varying.interpolation);
|
| + proto->set_is_invariant(varying.isInvariant);
|
| }
|
|
|
| void FillShaderProto(ShaderProto* proto, const char* sha,
|
| const Shader* shader) {
|
| proto->set_sha(sha, gpu::gles2::ProgramCache::kHashLength);
|
| - StoreShaderInfo(ATTRIB_MAP, proto, shader->attrib_map());
|
| - StoreShaderInfo(UNIFORM_MAP, proto, shader->uniform_map());
|
| - StoreShaderInfo(VARYING_MAP, proto, shader->varying_map());
|
| + for (AttributeMap::const_iterator iter = shader->attrib_map().begin();
|
| + iter != shader->attrib_map().end(); ++iter) {
|
| + ShaderAttributeProto* info = proto->add_attribs();
|
| + FillShaderAttributeProto(info, iter->second);
|
| + }
|
| + for (UniformMap::const_iterator iter = shader->uniform_map().begin();
|
| + iter != shader->uniform_map().end(); ++iter) {
|
| + ShaderUniformProto* info = proto->add_uniforms();
|
| + FillShaderUniformProto(info, iter->second);
|
| + }
|
| + for (VaryingMap::const_iterator iter = shader->varying_map().begin();
|
| + iter != shader->varying_map().end(); ++iter) {
|
| + ShaderVaryingProto* info = proto->add_varyings();
|
| + FillShaderVaryingProto(info, iter->second);
|
| + }
|
| +}
|
| +
|
| +void RetrieveShaderVariableInfo(
|
| + const ShaderVariableProto& proto, sh::ShaderVariable* variable) {
|
| + variable->type = proto.type();
|
| + variable->precision = proto.precision();
|
| + variable->name = proto.name();
|
| + variable->mappedName = proto.mapped_name();
|
| + variable->arraySize = proto.array_size();
|
| + variable->staticUse = proto.static_use();
|
| + variable->fields.resize(proto.fields_size());
|
| + for (int ii = 0; ii < proto.fields_size(); ++ii)
|
| + RetrieveShaderVariableInfo(proto.fields(ii), &(variable->fields[ii]));
|
| + variable->structName = proto.struct_name();
|
| +}
|
| +
|
| +void RetrieveShaderAttributeInfo(
|
| + const ShaderAttributeProto& proto, AttributeMap* map) {
|
| + sh::Attribute attrib;
|
| + RetrieveShaderVariableInfo(proto.basic(), &attrib);
|
| + attrib.location = proto.location();
|
| + (*map)[proto.basic().mapped_name()] = attrib;
|
| +}
|
| +
|
| +void RetrieveShaderUniformInfo(
|
| + const ShaderUniformProto& proto, UniformMap* map) {
|
| + sh::Uniform uniform;
|
| + RetrieveShaderVariableInfo(proto.basic(), &uniform);
|
| + (*map)[proto.basic().mapped_name()] = uniform;
|
| +}
|
| +
|
| +void RetrieveShaderVaryingInfo(
|
| + const ShaderVaryingProto& proto, VaryingMap* map) {
|
| + sh::Varying varying;
|
| + RetrieveShaderVariableInfo(proto.basic(), &varying);
|
| + varying.interpolation = static_cast<sh::InterpolationType>(
|
| + proto.interpolation());
|
| + varying.isInvariant = proto.is_invariant();
|
| + (*map)[proto.basic().mapped_name()] = varying;
|
| }
|
|
|
| void RunShaderCallback(const ShaderCacheCallback& callback,
|
| @@ -270,39 +319,36 @@ void MemoryProgramCache::SaveLinkedProgram(
|
| void MemoryProgramCache::LoadProgram(const std::string& program) {
|
| scoped_ptr<GpuProgramProto> proto(GpuProgramProto::default_instance().New());
|
| if (proto->ParseFromString(program)) {
|
| - ShaderTranslator::VariableMap vertex_attribs;
|
| - ShaderTranslator::VariableMap vertex_uniforms;
|
| - ShaderTranslator::VariableMap vertex_varyings;
|
| -
|
| + AttributeMap vertex_attribs;
|
| + UniformMap vertex_uniforms;
|
| + VaryingMap vertex_varyings;
|
| for (int i = 0; i < proto->vertex_shader().attribs_size(); i++) {
|
| - RetrieveShaderInfo(proto->vertex_shader().attribs(i), &vertex_attribs);
|
| + RetrieveShaderAttributeInfo(proto->vertex_shader().attribs(i),
|
| + &vertex_attribs);
|
| }
|
| -
|
| for (int i = 0; i < proto->vertex_shader().uniforms_size(); i++) {
|
| - RetrieveShaderInfo(proto->vertex_shader().uniforms(i), &vertex_uniforms);
|
| + RetrieveShaderUniformInfo(proto->vertex_shader().uniforms(i),
|
| + &vertex_uniforms);
|
| }
|
| -
|
| for (int i = 0; i < proto->vertex_shader().varyings_size(); i++) {
|
| - RetrieveShaderInfo(proto->vertex_shader().varyings(i), &vertex_varyings);
|
| + RetrieveShaderVaryingInfo(proto->vertex_shader().varyings(i),
|
| + &vertex_varyings);
|
| }
|
|
|
| - ShaderTranslator::VariableMap fragment_attribs;
|
| - ShaderTranslator::VariableMap fragment_uniforms;
|
| - ShaderTranslator::VariableMap fragment_varyings;
|
| -
|
| + AttributeMap fragment_attribs;
|
| + UniformMap fragment_uniforms;
|
| + VaryingMap fragment_varyings;
|
| for (int i = 0; i < proto->fragment_shader().attribs_size(); i++) {
|
| - RetrieveShaderInfo(proto->fragment_shader().attribs(i),
|
| - &fragment_attribs);
|
| + RetrieveShaderAttributeInfo(proto->fragment_shader().attribs(i),
|
| + &fragment_attribs);
|
| }
|
| -
|
| for (int i = 0; i < proto->fragment_shader().uniforms_size(); i++) {
|
| - RetrieveShaderInfo(proto->fragment_shader().uniforms(i),
|
| - &fragment_uniforms);
|
| + RetrieveShaderUniformInfo(proto->fragment_shader().uniforms(i),
|
| + &fragment_uniforms);
|
| }
|
| -
|
| for (int i = 0; i < proto->fragment_shader().varyings_size(); i++) {
|
| - RetrieveShaderInfo(proto->fragment_shader().varyings(i),
|
| - &fragment_varyings);
|
| + RetrieveShaderVaryingInfo(proto->fragment_shader().varyings(i),
|
| + &fragment_varyings);
|
| }
|
|
|
| scoped_ptr<char[]> binary(new char[proto->program().length()]);
|
| @@ -336,13 +382,13 @@ MemoryProgramCache::ProgramCacheValue::ProgramCacheValue(
|
| const char* data,
|
| const std::string& program_hash,
|
| const char* shader_0_hash,
|
| - const ShaderTranslator::VariableMap& attrib_map_0,
|
| - const ShaderTranslator::VariableMap& uniform_map_0,
|
| - const ShaderTranslator::VariableMap& varying_map_0,
|
| + const AttributeMap& attrib_map_0,
|
| + const UniformMap& uniform_map_0,
|
| + const VaryingMap& varying_map_0,
|
| const char* shader_1_hash,
|
| - const ShaderTranslator::VariableMap& attrib_map_1,
|
| - const ShaderTranslator::VariableMap& uniform_map_1,
|
| - const ShaderTranslator::VariableMap& varying_map_1,
|
| + const AttributeMap& attrib_map_1,
|
| + const UniformMap& uniform_map_1,
|
| + const VaryingMap& varying_map_1,
|
| MemoryProgramCache* program_cache)
|
| : length_(length),
|
| format_(format),
|
|
|