summaryrefslogtreecommitdiffstats
path: root/src/intel/vulkan
diff options
context:
space:
mode:
authorJason Ekstrand <[email protected]>2018-10-14 22:20:17 -0500
committerJason Ekstrand <[email protected]>2018-10-19 11:52:00 -0500
commit0d380af8097cf85122596041af1a611a8139de18 (patch)
treec4576e62a1e955f9836e81c1becb50970492014e /src/intel/vulkan
parentf8e789d2acf32166d359f1b1d8db1e8859b2b11a (diff)
anv: Define trampolines as the weak functions
Instead of having weak references to the anv functions and separate trampoline functions with their own dispatch table, just make the trampoline functions weak. This gets rid of a dispatch table and potentially lets the compiler delete the unused weak function. The end result is a reduction in the .text section of 5.7K and a reduction in the .data section of 1.4K. Before: text data bss dec hex filename 3190329 282232 8960 3481521 351fb1 _install/lib64/libvulkan_intel.so After: text data bss dec hex filename 3184548 280792 8960 3474300 35037c _install/lib64/libvulkan_intel.so Reviewed-by: Lionel Landwerlin <[email protected]>
Diffstat (limited to 'src/intel/vulkan')
-rw-r--r--src/intel/vulkan/anv_device.c5
-rw-r--r--src/intel/vulkan/anv_entrypoints_gen.py65
2 files changed, 21 insertions, 49 deletions
diff --git a/src/intel/vulkan/anv_device.c b/src/intel/vulkan/anv_device.c
index cfcf3cb31c7..c009176dcc6 100644
--- a/src/intel/vulkan/anv_device.c
+++ b/src/intel/vulkan/anv_device.c
@@ -659,12 +659,9 @@ VkResult anv_CreateInstance(
if (!anv_device_entrypoint_is_enabled(i, instance->app_info.api_version,
&instance->enabled_extensions, NULL)) {
instance->device_dispatch.entrypoints[i] = NULL;
- } else if (anv_device_dispatch_table.entrypoints[i] != NULL) {
- instance->device_dispatch.entrypoints[i] =
- anv_device_dispatch_table.entrypoints[i];
} else {
instance->device_dispatch.entrypoints[i] =
- anv_tramp_device_dispatch_table.entrypoints[i];
+ anv_device_dispatch_table.entrypoints[i];
}
}
diff --git a/src/intel/vulkan/anv_entrypoints_gen.py b/src/intel/vulkan/anv_entrypoints_gen.py
index beb658b8660..1dca173c0a9 100644
--- a/src/intel/vulkan/anv_entrypoints_gen.py
+++ b/src/intel/vulkan/anv_entrypoints_gen.py
@@ -92,7 +92,6 @@ extern const struct anv_instance_dispatch_table anv_instance_dispatch_table;
%for layer in LAYERS:
extern const struct anv_device_dispatch_table ${layer}_device_dispatch_table;
%endfor
-extern const struct anv_device_dispatch_table anv_tramp_device_dispatch_table;
% for e in instance_entrypoints:
% if e.alias:
@@ -260,7 +259,26 @@ const struct anv_instance_dispatch_table anv_instance_dispatch_table = {
% if e.guard is not None:
#ifdef ${e.guard}
% endif
- ${e.return_type} ${e.prefixed_name(layer)}(${e.decl_params()}) __attribute__ ((weak));
+ % if layer == 'anv':
+ ${e.return_type} __attribute__ ((weak))
+ ${e.prefixed_name('anv')}(${e.decl_params()})
+ {
+ % if e.params[0].type == 'VkDevice':
+ ANV_FROM_HANDLE(anv_device, anv_device, ${e.params[0].name});
+ return anv_device->dispatch.${e.name}(${e.call_params()});
+ % elif e.params[0].type == 'VkCommandBuffer':
+ ANV_FROM_HANDLE(anv_cmd_buffer, anv_cmd_buffer, ${e.params[0].name});
+ return anv_cmd_buffer->device->dispatch.${e.name}(${e.call_params()});
+ % elif e.params[0].type == 'VkQueue':
+ ANV_FROM_HANDLE(anv_queue, anv_queue, ${e.params[0].name});
+ return anv_queue->device->dispatch.${e.name}(${e.call_params()});
+ % else:
+ assert(!"Unhandled device child trampoline case: ${e.params[0].type}");
+ % endif
+ }
+ % else:
+ ${e.return_type} ${e.prefixed_name(layer)}(${e.decl_params()}) __attribute__ ((weak));
+ % endif
% if e.guard is not None:
#endif // ${e.guard}
% endif
@@ -280,49 +298,6 @@ const struct anv_instance_dispatch_table anv_instance_dispatch_table = {
% endfor
-/** Trampoline entrypoints for all device functions */
-
-% for e in device_entrypoints:
- % if e.alias:
- <% continue %>
- % endif
- % if e.guard is not None:
-#ifdef ${e.guard}
- % endif
- static ${e.return_type}
- ${e.prefixed_name('anv_tramp')}(${e.decl_params()})
- {
- % if e.params[0].type == 'VkDevice':
- ANV_FROM_HANDLE(anv_device, anv_device, ${e.params[0].name});
- return anv_device->dispatch.${e.name}(${e.call_params()});
- % elif e.params[0].type == 'VkCommandBuffer':
- ANV_FROM_HANDLE(anv_cmd_buffer, anv_cmd_buffer, ${e.params[0].name});
- return anv_cmd_buffer->device->dispatch.${e.name}(${e.call_params()});
- % elif e.params[0].type == 'VkQueue':
- ANV_FROM_HANDLE(anv_queue, anv_queue, ${e.params[0].name});
- return anv_queue->device->dispatch.${e.name}(${e.call_params()});
- % else:
- assert(!"Unhandled device child trampoline case: ${e.params[0].type}");
- % endif
- }
- % if e.guard is not None:
-#endif // ${e.guard}
- % endif
-% endfor
-
-const struct anv_device_dispatch_table anv_tramp_device_dispatch_table = {
-% for e in device_entrypoints:
- % if e.guard is not None:
-#ifdef ${e.guard}
- % endif
- .${e.name} = ${e.prefixed_name('anv_tramp')},
- % if e.guard is not None:
-#endif // ${e.guard}
- % endif
-% endfor
-};
-
-
/** Return true if the core version or extension in which the given entrypoint
* is defined is enabled.
*