nir/intrinsics: Add a vulkan_resource_index intrinsic
This is used to facilitate the Vulkan binding model where each resource is described by a (descriptor set, binding, array index) tuple. Reviewed-by: Rob Clark <robdclark@gmail.com>
This commit is contained in:
@@ -976,6 +976,16 @@ typedef enum {
|
|||||||
*/
|
*/
|
||||||
NIR_INTRINSIC_RANGE = 5,
|
NIR_INTRINSIC_RANGE = 5,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The Vulkan descriptor set for vulkan_resource_index intrinsic.
|
||||||
|
*/
|
||||||
|
NIR_INTRINSIC_DESC_SET = 6,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The Vulkan descriptor set binding for vulkan_resource_index intrinsic.
|
||||||
|
*/
|
||||||
|
NIR_INTRINSIC_BINDING = 7,
|
||||||
|
|
||||||
NIR_INTRINSIC_NUM_INDEX_FLAGS,
|
NIR_INTRINSIC_NUM_INDEX_FLAGS,
|
||||||
|
|
||||||
} nir_intrinsic_index_flag;
|
} nir_intrinsic_index_flag;
|
||||||
@@ -1040,6 +1050,8 @@ INTRINSIC_IDX_ACCESSORS(base, BASE, int)
|
|||||||
INTRINSIC_IDX_ACCESSORS(stream_id, STREAM_ID, unsigned)
|
INTRINSIC_IDX_ACCESSORS(stream_id, STREAM_ID, unsigned)
|
||||||
INTRINSIC_IDX_ACCESSORS(ucp_id, UCP_ID, unsigned)
|
INTRINSIC_IDX_ACCESSORS(ucp_id, UCP_ID, unsigned)
|
||||||
INTRINSIC_IDX_ACCESSORS(range, RANGE, unsigned)
|
INTRINSIC_IDX_ACCESSORS(range, RANGE, unsigned)
|
||||||
|
INTRINSIC_IDX_ACCESSORS(desc_set, DESC_SET, unsigned)
|
||||||
|
INTRINSIC_IDX_ACCESSORS(binding, BINDING, unsigned)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \group texture information
|
* \group texture information
|
||||||
|
@@ -175,6 +175,26 @@ INTRINSIC(image_size, 0, ARR(0), true, 4, 1, 0, xx, xx, xx,
|
|||||||
INTRINSIC(image_samples, 0, ARR(0), true, 1, 1, 0, xx, xx, xx,
|
INTRINSIC(image_samples, 0, ARR(0), true, 1, 1, 0, xx, xx, xx,
|
||||||
NIR_INTRINSIC_CAN_ELIMINATE | NIR_INTRINSIC_CAN_REORDER)
|
NIR_INTRINSIC_CAN_ELIMINATE | NIR_INTRINSIC_CAN_REORDER)
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Vulkan descriptor set intrinsic
|
||||||
|
*
|
||||||
|
* The Vulkan API uses a different binding model from GL. In the Vulkan
|
||||||
|
* API, all external resources are represented by a tuple:
|
||||||
|
*
|
||||||
|
* (descriptor set, binding, array index)
|
||||||
|
*
|
||||||
|
* where the array index is the only thing allowed to be indirect. The
|
||||||
|
* vulkan_surface_index intrinsic takes the descriptor set and binding as
|
||||||
|
* its first two indices and the array index as its source. The third
|
||||||
|
* index is a nir_variable_mode in case that's useful to the backend.
|
||||||
|
*
|
||||||
|
* The intended usage is that the shader will call vulkan_surface_index to
|
||||||
|
* get an index and then pass that as the buffer index ubo/ssbo calls.
|
||||||
|
*/
|
||||||
|
INTRINSIC(vulkan_resource_index, 1, ARR(1), true, 1, 0, 2,
|
||||||
|
DESC_SET, BINDING, xx,
|
||||||
|
NIR_INTRINSIC_CAN_ELIMINATE | NIR_INTRINSIC_CAN_REORDER)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* variable atomic intrinsics
|
* variable atomic intrinsics
|
||||||
*
|
*
|
||||||
|
@@ -518,6 +518,8 @@ print_intrinsic_instr(nir_intrinsic_instr *instr, print_state *state)
|
|||||||
[NIR_INTRINSIC_STREAM_ID] = "stream-id",
|
[NIR_INTRINSIC_STREAM_ID] = "stream-id",
|
||||||
[NIR_INTRINSIC_UCP_ID] = "ucp-id",
|
[NIR_INTRINSIC_UCP_ID] = "ucp-id",
|
||||||
[NIR_INTRINSIC_RANGE] = "range",
|
[NIR_INTRINSIC_RANGE] = "range",
|
||||||
|
[NIR_INTRINSIC_DESC_SET] = "desc-set",
|
||||||
|
[NIR_INTRINSIC_BINDING] = "binding",
|
||||||
};
|
};
|
||||||
for (unsigned idx = 1; idx < NIR_INTRINSIC_NUM_INDEX_FLAGS; idx++) {
|
for (unsigned idx = 1; idx < NIR_INTRINSIC_NUM_INDEX_FLAGS; idx++) {
|
||||||
if (!info->index_map[idx])
|
if (!info->index_map[idx])
|
||||||
|
Reference in New Issue
Block a user