Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

vulkan bindings update with bit_set/bit_field handling changes #4886

Open
wants to merge 3 commits into
base: master
Choose a base branch
from

Conversation

hypno2000
Copy link

This PR updates Vulkan headers and changes how c bit fields are handled in structs. There are roughly three scenarios:

First scenario is if a struct consists only 1 bit fields then it is handled as bit_set and enum:

typedef struct StdVideoH264PpsFlags {
    uint32_t    transform_8x8_mode_flag : 1;
    uint32_t    redundant_pic_cnt_present_flag : 1;
    uint32_t    constrained_intra_pred_flag : 1;
    uint32_t    deblocking_filter_control_present_flag : 1;
    uint32_t    weighted_pred_flag : 1;
    uint32_t    bottom_field_pic_order_in_frame_present_flag : 1;
    uint32_t    entropy_coding_mode_flag : 1;
    uint32_t    pic_scaling_matrix_present_flag : 1;
} StdVideoH264PpsFlags;

generates this:

VideoH264PpsFlags :: distinct bit_set[VideoH264PpsFlag; u32]
VideoH264PpsFlag :: enum u32 {
	transform_8x8_mode_flag,
	redundant_pic_cnt_present_flag,
	constrained_intra_pred_flag,
	deblocking_filter_control_present_flag,
	weighted_pred_flag,
	bottom_field_pic_order_in_frame_present_flag,
	entropy_coding_mode_flag,
	pic_scaling_matrix_present_flag,
}

Second scenario is when a struct consists of only a single bit field set, for example:

typedef struct StdVideoH265HrdFlags {
    uint32_t    nal_hrd_parameters_present_flag : 1;
    uint32_t    vcl_hrd_parameters_present_flag : 1;
    uint32_t    sub_pic_hrd_params_present_flag : 1;
    uint32_t    sub_pic_cpb_params_in_pic_timing_sei_flag : 1;
    uint32_t    fixed_pic_rate_general_flag : 8;
    uint32_t    fixed_pic_rate_within_cvs_flag : 8;
    uint32_t    low_delay_hrd_flag : 8;
} StdVideoH265HrdFlags;

generates this:

VideoH265HrdFlags :: bit_field u32 {
	nal_hrd_parameters_present_flag:           u32 | 1,
	vcl_hrd_parameters_present_flag:           u32 | 1,
	sub_pic_hrd_params_present_flag:           u32 | 1,
	sub_pic_cpb_params_in_pic_timing_sei_flag: u32 | 1,
	fixed_pic_rate_general_flag:               u32 | 8,
	fixed_pic_rate_within_cvs_flag:            u32 | 8,
	low_delay_hrd_flag:                        u32 | 8,
}

Third scenario is when struct embeds in itself one or many bit field sets:

typedef struct VkClusterAccelerationStructureBuildTriangleClusterInfoNV {
    uint32_t                                                         clusterID;
    VkClusterAccelerationStructureClusterFlagsNV                     clusterFlags;
    uint32_t                                                         triangleCount:9;
    uint32_t                                                         vertexCount:9;
    uint32_t                                                         positionTruncateBitCount:6;
    uint32_t                                                         indexType:4;
    uint32_t                                                         opacityMicromapIndexType:4;
    VkClusterAccelerationStructureGeometryIndexAndGeometryFlagsNV    baseGeometryIndexAndGeometryFlags;
    uint16_t                                                         indexBufferStride;
    uint16_t                                                         vertexBufferStride;
    uint16_t                                                         geometryIndexAndFlagsBufferStride;
    uint16_t                                                         opacityMicromapIndexBufferStride;
    VkDeviceAddress                                                  indexBuffer;
    VkDeviceAddress                                                  vertexBuffer;
    VkDeviceAddress                                                  geometryIndexAndFlagsBuffer;
    VkDeviceAddress                                                  opacityMicromapArray;
    VkDeviceAddress                                                  opacityMicromapIndexBuffer;
} VkClusterAccelerationStructureBuildTriangleClusterInfoNV;

generates this:

ClusterAccelerationStructureBuildTriangleClusterInfoNV :: struct {
	clusterID: u32,
	clusterFlags: ClusterAccelerationStructureClusterFlagsNV,
	using _: bit_field u32 {
		triangleCount:            u32 | 9,
		vertexCount:              u32 | 9,
		positionTruncateBitCount: u32 | 6,
		indexType:                u32 | 4,
		opacityMicromapIndexType: u32 | 4,
	},
	baseGeometryIndexAndGeometryFlags: ClusterAccelerationStructureGeometryIndexAndGeometryFlagsNV,
	indexBufferStride: u16,
	vertexBufferStride: u16,
	geometryIndexAndFlagsBufferStride: u16,
	opacityMicromapIndexBufferStride: u16,
	indexBuffer: DeviceAddress,
	vertexBuffer: DeviceAddress,
	geometryIndexAndFlagsBuffer: DeviceAddress,
	opacityMicromapArray: DeviceAddress,
	opacityMicromapIndexBuffer: DeviceAddress,
}

With multiple field sets:

typedef struct VkAccelerationStructureInstanceKHR {
    VkTransformMatrixKHR          transform;
    uint32_t                      instanceCustomIndex:24;
    uint32_t                      mask:8;
    uint32_t                      instanceShaderBindingTableRecordOffset:24;
    VkGeometryInstanceFlagsKHR    flags:8;
    uint64_t                      accelerationStructureReference;
} VkAccelerationStructureInstanceKHR;

generates this:

AccelerationStructureInstanceKHR :: struct {
	transform: TransformMatrixKHR,
	using _: bit_field u32 {
		instanceCustomIndex: u32 | 24,
		mask:                u32 | 8,
	},
	using _: bit_field u32 {
		instanceShaderBindingTableRecordOffset: u32 | 24,
		flags:              GeometryInstanceFlagKHR | 8,
	},
	accelerationStructureReference: u64,
}

where GeometryInstanceFlagKHR is:

Flags :: distinct u32

GeometryInstanceFlagsKHR :: distinct bit_set[GeometryInstanceFlagKHR; Flags]
GeometryInstanceFlagKHR :: enum Flags {
	TRIANGLE_FACING_CULL_DISABLE       = 0,
	TRIANGLE_FLIP_FACING               = 1,
	FORCE_OPAQUE                       = 2,
	FORCE_NO_OPAQUE                    = 3,
	FORCE_OPACITY_MICROMAP_2_STATE_EXT = 4,
	DISABLE_OPACITY_MICROMAPS_EXT      = 5,
	TRIANGLE_FRONT_COUNTERCLOCKWISE    = TRIANGLE_FLIP_FACING,
	TRIANGLE_CULL_DISABLE_NV           = TRIANGLE_FACING_CULL_DISABLE,
	TRIANGLE_FRONT_COUNTERCLOCKWISE_NV = TRIANGLE_FRONT_COUNTERCLOCKWISE,
	FORCE_OPAQUE_NV                    = FORCE_OPAQUE,
	FORCE_NO_OPAQUE_NV                 = FORCE_NO_OPAQUE,
}

This compiles and works fine for me but i am not using all of those bit fields in my project.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant