def install_loadable_module_atom(self, atom): name = atom['name'] if name != 'vulkan_layers': raise RuntimeError('Unsupported loadable_module: %s' % name) # Add loadable modules to test targets self.loadable_module_targets.append(name) # Copy resources and binaries resources = atom['resources'] self.copy_files(resources) binaries = atom['binaries'] for arch in self.target_arches: self.copy_files(binaries[arch]) def _filename_no_ext(name): return os.path.splitext(os.path.basename(name))[0] data = model.VulkanLibrary() # Pair each json resource with its corresponding binary. Each such pair # is a "layer". We only need to check one arch because each arch has the # same list of binaries. arch = next(iter(binaries)) binary_names = binaries[arch] # TODO(jdkoren): use atom[root] once fxr/360094 lands local_pkg = os.path.join('pkg', name) for res in resources: layer_name = _filename_no_ext(res) # Special case: VkLayer_standard_validation does not have a binary # and also depends on VkLayer_khronos_validation. Currently atom # metadata does not contain this information (fxbug.dev/46250). if layer_name == 'VkLayer_standard_validation': layer = model.VulkanLayer( name=layer_name, config=os.path.relpath(res, start=local_pkg), binary='', data_deps=[':VkLayer_khronos_validation']) else: # Filter binaries for a matching name. filtered = [ n for n in binary_names if _filename_no_ext(n) == layer_name ] if not filtered: # If the binary could not be found then do not generate a # target for this layer. The missing targets will cause a # mismatch with the "golden" outputs. continue # Replace harcoded arch in the found binary filename. binary = filtered[0].replace('/' + arch + '/', "/${target_cpu}/") layer = model.VulkanLayer( name=layer_name, config=os.path.relpath(res, start=local_pkg), binary=os.path.relpath(binary, start=local_pkg)) # Special case: VkLayer_image_pipe_swapchain has an undocumented # data_dep on trace-engine. Currently atom metadata does not # contain this information (fxbug.dev/46250). if layer_name == 'VkLayer_image_pipe_swapchain': layer.data_deps.append('../trace-engine') data.layers.append(layer) base = self.dest(local_pkg) self.write_file(os.path.join(base, 'BUILD.gn'), 'vulkan_module', data) self.build_files.append( os.path.relpath(os.path.join(base, 'BUILD.gn'), self.output)) self.write_atom_metadata(os.path.join(base, 'meta.json'), atom)
def install_loadable_module_atom(self, atom): name = atom['name'] if name != 'vulkan_layers': raise RuntimeError('Unsupported loadable_module: %s' % name) # Copy resources and binaries resources = atom['resources'] self.copy_files(resources) binaries = atom['binaries'] for arch in self.target_arches: self.copy_files(binaries[arch]) def _filename_no_ext(name): # TODO(fxb/45508): Clean up this workaround once the binaries have # been fixed to have the correct names. basename = os.path.basename(name) if basename[:3] == 'lib': basename = basename[3:] return os.path.splitext(basename)[0] data = model.VulkanLibrary() # Pair each json resource with its corresponding binary. Each such pair # is a "layer". We only need to check one arch because each arch has the # same list of binaries. arch = next(iter(binaries)) binary_names = binaries[arch] # TODO(jdkoren): use atom[root] once fxr/360094 lands local_pkg = os.path.join('pkg', name) for res in resources: layer_name = _filename_no_ext(res) # Filter binaries for a matching name. filtered = [ n for n in binary_names if _filename_no_ext(n) == layer_name ] if not filtered: # If the binary could not be found then do not generate a target # for this layer. The missing targets will cause a mismatch with # the "golden" outputs. continue # Replace harcoded arch in the found binary filename. binary = filtered[0].replace( '/' + arch + '/', "/${target_cpu}/") layer = model.VulkanLayer( name=layer_name, config=os.path.relpath(res, start=local_pkg), binary=os.path.relpath(binary, start=local_pkg)) # Special case: VkLayer_image_pipe_swapchain has an undocumented # data_dep on trace-engine. There currently is no way to recognize # these exceptions through atom metadata alone (fxb/46250). if layer_name == 'VkLayer_image_pipe_swapchain': layer.data_deps.append('trace-engine') data.layers.append(layer) base = self.dest(local_pkg) self.write_file(os.path.join(base, 'BUILD.gn'), 'vulkan_module', data) self.build_files.append( os.path.relpath(os.path.join(base, 'BUILD.gn'), self.output)) self.write_atom_metadata(os.path.join(base, 'meta.json'), atom)