| // Copyright 2019 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef SRC_GRAPHICS_LIB_COMPUTE_SPINEL_PLATFORMS_VK_TARGET_H_ |
| #define SRC_GRAPHICS_LIB_COMPUTE_SPINEL_PLATFORMS_VK_TARGET_H_ |
| |
| // |
| // |
| // |
| |
| #include <vulkan/vulkan_core.h> |
| |
| // |
| // |
| // |
| |
| #include "shaders/pipelines.h" |
| #include "target_requirements.h" |
| |
| // |
| // |
| // |
| |
| #define SPN_HEADER_MAGIC 0x4C4E5053 // "SPNL" |
| |
| // |
| // |
| // |
| |
| struct spinel_target_group_size |
| { |
| // clang-format off |
| uint32_t workgroup : 24; |
| uint32_t subgroup_log2 : 8; |
| // clang-format on |
| }; |
| |
| // |
| // |
| // |
| |
| struct spinel_target_allocator |
| { |
| VkMemoryPropertyFlags properties; |
| VkBufferUsageFlags usage; |
| }; |
| |
| // |
| // This structure packages target-specific configuration parameters. |
| // |
| |
| struct spinel_target_config |
| { |
| // |
| // Allocators |
| // |
| struct |
| { |
| struct // DEVICE ALLOCATORS |
| { |
| struct spinel_target_allocator drw; // device read-write |
| struct spinel_target_allocator hw_dr; // host write / device read |
| struct spinel_target_allocator hrw_dr; // host read-write / device read |
| struct spinel_target_allocator drw_shared; // device read-write on 1 or 2 queue families |
| } device; |
| } allocator; |
| |
| // |
| // Deps concurrency |
| // |
| struct |
| { |
| struct |
| { |
| struct |
| { |
| struct |
| { |
| uint32_t size; // Size of immediate semaphore pool is |
| uint32_t count; // (pool.size * pool.count) |
| } pool; // |
| } immediate; // |
| // |
| struct // |
| { // |
| uint32_t size; // Size of delayed semaphore pool |
| } delayed; // |
| } semaphores; // |
| } deps; |
| |
| // |
| // Tile size |
| // |
| struct |
| { |
| uint32_t width_log2; |
| uint32_t height_log2; |
| } tile; |
| |
| // |
| // Subpixel resolution |
| // |
| struct |
| { |
| uint32_t width_log2; |
| uint32_t height_log2; |
| } pixel; |
| |
| // |
| // Block pool size |
| // |
| struct |
| { |
| uint32_t block_dwords_log2; |
| uint32_t subblock_dwords_log2; |
| uint32_t ids_per_invocation; |
| } block_pool; |
| |
| // |
| // Path builder |
| // |
| struct |
| { |
| struct |
| { |
| uint32_t dispatches; // number of in-flight dispatches |
| uint32_t ring; // number of blocks & cmds in ring |
| uint32_t eager; // number of blocks that will force an eager launch |
| } size; |
| } path_builder; |
| |
| // |
| // Raster builder |
| // |
| struct |
| { |
| struct |
| { |
| uint32_t dispatches; // number of in-flight dispatches |
| uint32_t ring; // number of fill commands in ring shared across all dispatches |
| uint32_t eager; // number of fill commands that will force an eager launch of a dispatch |
| uint32_t cohort; // max number of rasters in a cohort |
| uint32_t cmds; // max rast cmds per dispatch emitted by FILLS_EXPAND without error |
| uint32_t ttrks; // max ttrks per dispatch emitted by RASTERIZE_XXX without error |
| } size; |
| |
| struct |
| { |
| uint32_t rows; |
| } fill_scan; |
| } raster_builder; |
| |
| // |
| // Composition |
| // |
| struct |
| { |
| struct |
| { |
| uint32_t dispatches; // number of in-flight dispatches |
| uint32_t ring; // number of commands in ring |
| uint32_t eager; // number of commands that will force an eager launch |
| uint32_t ttcks; // max number of ttcks that can be emitted by successive PLACE shaders |
| uint32_t rasters; // max number of retained rasters |
| } size; |
| } composition; |
| |
| // |
| // Swapchain |
| // |
| struct |
| { |
| VkSharingMode sharing_mode; // Exclusive or concurrent |
| uint32_t texel_size; // How many bytes per texel? |
| } swapchain; |
| |
| // |
| // Reclamation |
| // |
| struct |
| { |
| struct |
| { |
| uint32_t dispatches; // number of in-flight dispatches |
| uint32_t paths; // number of paths in reclamation ring |
| uint32_t rasters; // number of rasters in reclamation ring |
| uint32_t eager; // number of handles that will force an eager launch |
| } size; |
| } reclaim; |
| |
| // |
| // Pipeline workgroup and subgroup sizes |
| // |
| union |
| { |
| struct |
| { |
| #undef SPN_P_EXPAND_X |
| #define SPN_P_EXPAND_X(name_, push_) struct spinel_target_group_size name_; |
| |
| SPN_P_EXPAND() |
| } named; |
| |
| struct spinel_target_group_size array[SPN_P_COUNT]; |
| |
| } group_sizes; |
| }; |
| |
| // |
| // |
| // |
| |
| struct spinel_target_header |
| { |
| uint32_t magic; // magic header dword |
| union spinel_target_extensions extensions; // target device extensions |
| union spinel_target_features features; // target device features |
| struct spinel_target_config config; // target configuration |
| uint32_t modules[]; // SPIR-V modules |
| }; |
| |
| // |
| // |
| // |
| |
| // This macro must precede each `kRodata` definition in a `header.c` file. |
| // See //src/graphics/lib/compute/tools/target_archive/rodata-extract.ld. |
| #define RODATA_EXTRACT \ |
| __attribute__((section(".rodata-extract"), used, retain, no_sanitize("address", "hwaddress"))) |
| |
| #endif // SRC_GRAPHICS_LIB_COMPUTE_SPINEL_PLATFORMS_VK_TARGET_H_ |