Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2956)

Unified Diff: gpu/command_buffer/service/memory_program_cache.cc

Issue 2019293002: Save interface block infomation to program cache. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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 4cd3fd2edc00fe1c943871ac19e94fa8e72245d6..39c3e077800fb25f5b7eed56cfb6f2b202a3775d 100644
--- a/gpu/command_buffer/service/memory_program_cache.cc
+++ b/gpu/command_buffer/service/memory_program_cache.cc
@@ -64,6 +64,28 @@ void FillShaderOutputVariableProto(ShaderOutputVariableProto* proto,
proto->set_location(attrib.location);
}
+void FillShaderInterfaceBlockFieldProto(
+ ShaderInterfaceBlockFieldProto* proto,
+ const sh::InterfaceBlockField& interfaceBlockField) {
+ FillShaderVariableProto(proto->mutable_basic(), interfaceBlockField);
+ proto->set_is_row_major_layout(interfaceBlockField.isRowMajorLayout);
+}
+
+void FillShaderInterfaceBlockProto(ShaderInterfaceBlockProto* proto,
+ const sh::InterfaceBlock& interfaceBlock) {
+ proto->set_name(interfaceBlock.name);
+ proto->set_mapped_name(interfaceBlock.mappedName);
+ proto->set_instance_name(interfaceBlock.instanceName);
+ proto->set_array_size(interfaceBlock.arraySize);
+ proto->set_layout(interfaceBlock.layout);
+ proto->set_is_row_major_layout(interfaceBlock.isRowMajorLayout);
+ proto->set_static_use(interfaceBlock.staticUse);
+ for (size_t ii = 0; ii < interfaceBlock.fields.size(); ++ii) {
+ ShaderInterfaceBlockFieldProto* field = proto->add_fields();
+ FillShaderInterfaceBlockFieldProto(field, interfaceBlock.fields[ii]);
+ }
+}
+
void FillShaderProto(ShaderProto* proto, const char* sha,
const Shader* shader) {
proto->set_sha(sha, gpu::gles2::ProgramCache::kHashLength);
@@ -87,6 +109,12 @@ void FillShaderProto(ShaderProto* proto, const char* sha,
ShaderOutputVariableProto* info = proto->add_output_variables();
FillShaderOutputVariableProto(info, *iter);
}
+ for (InterfaceBlockMap::const_iterator iter =
+ shader->interface_block_map().begin();
+ iter != shader->interface_block_map().end(); ++ iter) {
qiankun 2016/05/30 12:42:11 one extra space between "++" and "iter".
+ ShaderInterfaceBlockProto* info = proto->add_interface_blocks();
+ FillShaderInterfaceBlockProto(info, iter->second);
+ }
}
void RetrieveShaderVariableInfo(
@@ -136,6 +164,31 @@ void RetrieveShaderOutputVariableInfo(const ShaderOutputVariableProto& proto,
list->push_back(output_variable);
}
+void RetrieveShaderInterfaceBlockFieldInfo(
+ const ShaderInterfaceBlockFieldProto& proto,
+ sh::InterfaceBlockField* interface_block_field) {
+ RetrieveShaderVariableInfo(proto.basic(), interface_block_field);
+ interface_block_field->isRowMajorLayout = proto.is_row_major_layout();
+}
+
+void RetrieveShaderInterfaceBlockInfo(const ShaderInterfaceBlockProto& proto,
+ InterfaceBlockMap* map) {
+ sh::InterfaceBlock interface_block;
+ interface_block.name = proto.name();
+ interface_block.mappedName = proto.mapped_name();
+ interface_block.instanceName = proto.instance_name();
+ interface_block.arraySize = proto.array_size();
xinghua.cao 2016/05/30 09:55:46 cast int32 to sh::BlockLayoutType, may be an error
+ interface_block.layout = (sh::BlockLayoutType) proto.layout();
+ interface_block.isRowMajorLayout = proto.is_row_major_layout();
+ interface_block.staticUse = proto.static_use();
+ interface_block.fields.resize(proto.fields_size());
+ for (int ii = 0; ii < proto.fields_size(); ++ii) {
+ RetrieveShaderInterfaceBlockFieldInfo(proto.fields(ii),
+ &(interface_block.fields[ii]));
+ }
+ (*map)[proto.mapped_name()] = interface_block;
+}
+
void RunShaderCallback(const ShaderCacheCallback& callback,
GpuProgramProto* proto,
std::string sha_string) {
@@ -208,10 +261,12 @@ ProgramCache::ProgramLoadResult MemoryProgramCache::LoadLinkedProgram(
shader_a->set_uniform_map(value->uniform_map_0());
shader_a->set_varying_map(value->varying_map_0());
shader_a->set_output_variable_list(value->output_variable_list_0());
+ shader_a->set_interface_block_map(value->interface_block_map_0());
shader_b->set_attrib_map(value->attrib_map_1());
shader_b->set_uniform_map(value->uniform_map_1());
shader_b->set_varying_map(value->varying_map_1());
shader_b->set_output_variable_list(value->output_variable_list_1());
+ shader_b->set_interface_block_map(value->interface_block_map_1());
if (!shader_callback.is_null() && !disable_gpu_shader_disk_cache_) {
std::unique_ptr<GpuProgramProto> proto(
@@ -299,9 +354,11 @@ void MemoryProgramCache::SaveLinkedProgram(
new ProgramCacheValue(
length, format, binary.release(), sha_string, a_sha,
shader_a->attrib_map(), shader_a->uniform_map(),
- shader_a->varying_map(), shader_a->output_variable_list(), b_sha,
+ shader_a->varying_map(), shader_a->output_variable_list(),
+ shader_a->interface_block_map(), b_sha,
shader_b->attrib_map(), shader_b->uniform_map(),
- shader_b->varying_map(), shader_b->output_variable_list(), this));
+ shader_b->varying_map(), shader_b->output_variable_list(),
+ shader_b->interface_block_map(), this));
UMA_HISTOGRAM_COUNTS("GPU.ProgramCache.MemorySizeAfterKb",
curr_size_bytes_ / 1024);
@@ -315,6 +372,7 @@ void MemoryProgramCache::LoadProgram(const std::string& program) {
UniformMap vertex_uniforms;
VaryingMap vertex_varyings;
OutputVariableList vertex_output_variables;
+ InterfaceBlockMap vertex_interface_blocks;
for (int i = 0; i < proto->vertex_shader().attribs_size(); i++) {
RetrieveShaderAttributeInfo(proto->vertex_shader().attribs(i),
&vertex_attribs);
@@ -331,11 +389,16 @@ void MemoryProgramCache::LoadProgram(const std::string& program) {
RetrieveShaderOutputVariableInfo(
proto->vertex_shader().output_variables(i), &vertex_output_variables);
}
+ for (int i = 0; i < proto->vertex_shader().interface_blocks_size(); i++) {
+ RetrieveShaderInterfaceBlockInfo(
+ proto->vertex_shader().interface_blocks(i), &vertex_interface_blocks);
+ }
AttributeMap fragment_attribs;
UniformMap fragment_uniforms;
VaryingMap fragment_varyings;
OutputVariableList fragment_output_variables;
+ InterfaceBlockMap fragment_interface_blocks;
for (int i = 0; i < proto->fragment_shader().attribs_size(); i++) {
RetrieveShaderAttributeInfo(proto->fragment_shader().attribs(i),
&fragment_attribs);
@@ -353,6 +416,11 @@ void MemoryProgramCache::LoadProgram(const std::string& program) {
proto->fragment_shader().output_variables(i),
&fragment_output_variables);
}
+ for (int i = 0; i < proto->fragment_shader().interface_blocks_size(); i++) {
+ RetrieveShaderInterfaceBlockInfo(
+ proto->fragment_shader().interface_blocks(i),
+ &fragment_interface_blocks);
+ }
std::unique_ptr<char[]> binary(new char[proto->program().length()]);
memcpy(binary.get(), proto->program().c_str(), proto->program().length());
@@ -363,9 +431,9 @@ void MemoryProgramCache::LoadProgram(const std::string& program) {
proto->program().length(), proto->format(), binary.release(),
proto->sha(), proto->vertex_shader().sha().c_str(), vertex_attribs,
vertex_uniforms, vertex_varyings, vertex_output_variables,
- proto->fragment_shader().sha().c_str(), fragment_attribs,
- fragment_uniforms, fragment_varyings, fragment_output_variables,
- this));
+ vertex_interface_blocks, proto->fragment_shader().sha().c_str(),
+ fragment_attribs, fragment_uniforms, fragment_varyings,
+ fragment_output_variables, fragment_interface_blocks, this));
UMA_HISTOGRAM_COUNTS("GPU.ProgramCache.MemorySizeAfterKb",
curr_size_bytes_ / 1024);
@@ -384,11 +452,13 @@ MemoryProgramCache::ProgramCacheValue::ProgramCacheValue(
const UniformMap& uniform_map_0,
const VaryingMap& varying_map_0,
const OutputVariableList& output_variable_list_0,
+ const InterfaceBlockMap& interface_block_map_0,
const char* shader_1_hash,
const AttributeMap& attrib_map_1,
const UniformMap& uniform_map_1,
const VaryingMap& varying_map_1,
const OutputVariableList& output_variable_list_1,
+ const InterfaceBlockMap& interface_block_map_1,
MemoryProgramCache* program_cache)
: length_(length),
format_(format),
@@ -399,11 +469,13 @@ MemoryProgramCache::ProgramCacheValue::ProgramCacheValue(
uniform_map_0_(uniform_map_0),
varying_map_0_(varying_map_0),
output_variable_list_0_(output_variable_list_0),
+ interface_block_map_0_(interface_block_map_0),
shader_1_hash_(shader_1_hash, kHashLength),
attrib_map_1_(attrib_map_1),
uniform_map_1_(uniform_map_1),
varying_map_1_(varying_map_1),
output_variable_list_1_(output_variable_list_1),
+ interface_block_map_1_(interface_block_map_1),
program_cache_(program_cache) {
program_cache_->curr_size_bytes_ += length_;
program_cache_->LinkedProgramCacheSuccess(program_hash);

Powered by Google App Engine
This is Rietveld 408576698