blob: 6ad46e6b6f4ee57e0ef962f64853a64f2336da9e [file] [log] [blame]
// Copyright 2021 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_RADIX_SORT_PLATFORMS_VK_SHADERS_PUSH_H_
#define SRC_GRAPHICS_LIB_COMPUTE_RADIX_SORT_PLATFORMS_VK_SHADERS_PUSH_H_
//
// There is a limit to the maximum number of keyvals that can be sorted because
// the top 2 bits in the atomic lookback counters are used as tag bits.
//
#define RS_MAX_KEYVALS ((1 << 30) - 1)
//
// Right now, the entire implementation is very much dependent on an 8-bit radix
// size. Most of the shaders attempt to honor this defined size but there are
// still a number of places where 256 is assumed.
//
#define RS_RADIX_LOG2 8
#define RS_RADIX_SIZE (1 << RS_RADIX_LOG2)
//
// LOOKBACK STATUS FLAGS
//
// The decoupled lookback status flags are stored in the two
// high bits of the count:
//
// 0 31
// | REDUCTION OR PREFIX COUNT | STATUS |
// +---------------------------+--------+
// | 30 | 2 |
//
// This limits the keyval extent size to (2^30-1).
//
// Valid status flags are:
//
// EVEN PASS ODD PASS
// ----------------------- -----------------------
// 0 : invalid 0 : prefix available
// 1 : reduction available 1 : ---
// 2 : prefix available 2 : invalid
// 3 : --- 3 : reduction available
//
// Atomically adding +1 to a "reduction available" status results in a "prefix
// available" status.
//
// clang-format off
#define RS_PARTITION_STATUS_EVEN_INVALID (0u)
#define RS_PARTITION_STATUS_EVEN_REDUCTION (1u)
#define RS_PARTITION_STATUS_EVEN_PREFIX (2u)
#define RS_PARTITION_STATUS_ODD_INVALID (2u)
#define RS_PARTITION_STATUS_ODD_REDUCTION (3u)
#define RS_PARTITION_STATUS_ODD_PREFIX (0u)
// clang-format on
//
// Arguments to indirectly launched shaders.
//
// struct rs_indirect_info_dispatch
// {
// u32vec4 pad;
// u32vec4 zero;
// u32vec4 histogram;
// u32vec4 scatter;
// };
//
// struct rs_indirect_info_fill
// {
// uint32_t block_offset;
// uint32_t dword_offset_min;
// uint32_t dword_offset_max_minus_min;
// uint32_t reserved; // padding for 16 bytes
// };
//
// struct rs_indirect_info
// {
// rs_indirect_info_fill pad;
// rs_indirect_info_fill zero;
// rs_indirect_info_dispatch dispatch;
// };
//
#define RS_STRUCT_INDIRECT_INFO_DISPATCH() \
struct rs_indirect_info_dispatch \
{ \
RS_STRUCT_MEMBER_STRUCT(u32vec4, pad) \
RS_STRUCT_MEMBER_STRUCT(u32vec4, zero) \
RS_STRUCT_MEMBER_STRUCT(u32vec4, histogram) \
RS_STRUCT_MEMBER_STRUCT(u32vec4, scatter) \
}
#define RS_STRUCT_INDIRECT_INFO_FILL() \
struct rs_indirect_info_fill \
{ \
RS_STRUCT_MEMBER(uint32_t, block_offset) \
RS_STRUCT_MEMBER(uint32_t, dword_offset_min) \
RS_STRUCT_MEMBER(uint32_t, dword_offset_max_minus_min) \
RS_STRUCT_MEMBER(uint32_t, reserved) \
}
#define RS_STRUCT_INDIRECT_INFO() \
RS_STRUCT_INDIRECT_INFO_DISPATCH(); \
RS_STRUCT_INDIRECT_INFO_FILL(); \
struct rs_indirect_info \
{ \
RS_STRUCT_MEMBER_STRUCT(rs_indirect_info_fill, pad) \
RS_STRUCT_MEMBER_STRUCT(rs_indirect_info_fill, zero) \
RS_STRUCT_MEMBER_STRUCT(rs_indirect_info_dispatch, dispatch) \
}
//
// Define the push constant structures shared by the host and device.
//
// INIT
// ----
// struct rs_push_init
// {
// uint64_t devaddr_count; // address of count buffer
// uint64_t devaddr_indirect; // address of indirect info buffer
// };
//
// FILL
// ----
// struct rs_push_fill
// {
// uint64_t devaddr_info; // address of indirect info for fill shader
// uint64_t devaddr_dwords; // address of dwords extent
// uint32_t dword; // dword value used to fill the dwords extent
// };
//
// HISTOGRAM
// ---------
// struct rs_push_histogram
// {
// uint64_t devaddr_histograms; // address of histograms extent
// uint64_t devaddr_keyvals; // address of keyvals extent
// uint32_t passes; // number of passes
// };
//
// PREFIX
// ------
// struct rs_push_prefix
// {
// uint64_t devaddr_histograms; // address of histograms extent
// };
//
// SCATTER
// -------
// struct rs_push_scatter
// {
// uint64_t devaddr_keyvals_in; // address of input keyvals
// uint64_t devaddr_keyvals_out; // address of output keyvals
// uint64_t devaddr_partitions // address of partitions
// uint64_t devaddr_histograms; // address of pass histogram
// uint32_t pass_offset; // keyval pass offset
// };
//
#define RS_STRUCT_PUSH_INIT() \
struct rs_push_init \
{ \
RS_STRUCT_MEMBER(RS_DEVADDR, devaddr_info) \
RS_STRUCT_MEMBER(RS_DEVADDR, devaddr_count) \
RS_STRUCT_MEMBER(uint32_t, passes) \
}
#define RS_STRUCT_PUSH_FILL() \
struct rs_push_fill \
{ \
RS_STRUCT_MEMBER(RS_DEVADDR, devaddr_info) \
RS_STRUCT_MEMBER(RS_DEVADDR, devaddr_dwords) \
RS_STRUCT_MEMBER(uint32_t, dword) \
}
#define RS_STRUCT_PUSH_HISTOGRAM() \
struct rs_push_histogram \
{ \
RS_STRUCT_MEMBER(RS_DEVADDR, devaddr_histograms) \
RS_STRUCT_MEMBER(RS_DEVADDR, devaddr_keyvals) \
RS_STRUCT_MEMBER(uint32_t, passes) \
}
#define RS_STRUCT_PUSH_PREFIX() \
struct rs_push_prefix \
{ \
RS_STRUCT_MEMBER(RS_DEVADDR, devaddr_histograms) \
}
#define RS_STRUCT_PUSH_SCATTER() \
struct rs_push_scatter \
{ \
RS_STRUCT_MEMBER(RS_DEVADDR, devaddr_keyvals_even) \
RS_STRUCT_MEMBER(RS_DEVADDR, devaddr_keyvals_odd) \
RS_STRUCT_MEMBER(RS_DEVADDR, devaddr_partitions) \
RS_STRUCT_MEMBER(RS_DEVADDR, devaddr_histograms) \
RS_STRUCT_MEMBER(uint32_t, pass_offset) \
}
////////////////////////////////////////////////////////////////////
//
// GLSL
//
#ifdef VULKAN // defined by GLSL/VK compiler
// clang-format off
#define RS_STRUCT_MEMBER(type_, name_) type_ name_;
#define RS_STRUCT_MEMBER_FARRAY(type_, len_, name_) type_ name_[len_];
#define RS_STRUCT_MEMBER_STRUCT(type_, name_) type_ name_;
// clang-format on
////////////////////////////////////////////////////////////////////
//
// C/C++
//
#else
#ifdef __cplusplus
extern "C" {
#endif
//
//
//
#include <stdint.h>
struct u32vec4
{
uint32_t x;
uint32_t y;
uint32_t z;
uint32_t w;
};
// clang-format off
#define RS_DEVADDR uint64_t
#define RS_STRUCT_MEMBER(type_, name_) type_ name_;
#define RS_STRUCT_MEMBER_FARRAY(type_, len_, name_) type_ name_[len_];
#define RS_STRUCT_MEMBER_STRUCT(type_, name_) struct type_ name_;
// clang-format on
RS_STRUCT_PUSH_INIT();
RS_STRUCT_PUSH_FILL();
RS_STRUCT_PUSH_HISTOGRAM();
RS_STRUCT_PUSH_PREFIX();
RS_STRUCT_PUSH_SCATTER();
RS_STRUCT_INDIRECT_INFO();
//
//
//
#ifdef __cplusplus
}
#endif
#endif
//
//
//
#endif // SRC_GRAPHICS_LIB_COMPUTE_RADIX_SORT_PLATFORMS_VK_SHADERS_PUSH_H_