On Fri, Mar 25, 2016 at 7:12 PM, Jason Ekstrand <[email protected]> wrote: > This is used to facilitate the Vulkan binding model where each resource is > described by a (descriptor set, binding, array index) tuple. > --- > src/compiler/nir/nir.h | 12 ++++++++++++ > src/compiler/nir/nir_intrinsics.h | 20 ++++++++++++++++++++ > src/compiler/nir/nir_print.c | 2 ++ > 3 files changed, 34 insertions(+) > > diff --git a/src/compiler/nir/nir.h b/src/compiler/nir/nir.h > index 996f104..33bb1fd 100644 > --- a/src/compiler/nir/nir.h > +++ b/src/compiler/nir/nir.h > @@ -960,6 +960,16 @@ typedef enum { > */ > 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_index_flag; > @@ -1024,6 +1034,8 @@ INTRINSIC_IDX_ACCESSORS(base, BASE, int) > INTRINSIC_IDX_ACCESSORS(stream_id, STREAM_ID, unsigned) > INTRINSIC_IDX_ACCESSORS(ucp_id, UCP_ID, unsigned) > INTRINSIC_IDX_ACCESSORS(range, RANGE, unsigned) > +INTRINSIC_IDX_ACCESSORS(desc_set, DESC_SET, unsigned) > +INTRINSIC_IDX_ACCESSORS(binding, BINDING, unsigned) > > /** > * \group texture information > diff --git a/src/compiler/nir/nir_intrinsics.h > b/src/compiler/nir/nir_intrinsics.h > index 2d6b7b7..efbf35d 100644 > --- a/src/compiler/nir/nir_intrinsics.h > +++ b/src/compiler/nir/nir_intrinsics.h > @@ -176,6 +176,26 @@ INTRINSIC(image_samples, 0, ARR(), true, 1, 1, 0, xx, > xx, xx, > 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 tripple:
s/tripple/tuple/? Or triplet? (But tuple makes more sense since it is clear from next line that it is a 3-tuple) anyways, just nit picking.. Reviewed-by: Rob Clark <[email protected]> > + * > + * (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 > * > * All of these variable atomic memory operations read a value from memory, > diff --git a/src/compiler/nir/nir_print.c b/src/compiler/nir/nir_print.c > index 28c8043..17ae368 100644 > --- a/src/compiler/nir/nir_print.c > +++ b/src/compiler/nir/nir_print.c > @@ -505,6 +505,8 @@ print_intrinsic_instr(nir_intrinsic_instr *instr, > print_state *state) > [NIR_INTRINSIC_STREAM_ID] = "stream-id", > [NIR_INTRINSIC_UCP_ID] = "ucp-id", > [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++) { > if (!info->index_map[idx]) > -- > 2.5.0.400.gff86faf > > _______________________________________________ > mesa-dev mailing list > [email protected] > https://lists.freedesktop.org/mailman/listinfo/mesa-dev _______________________________________________ mesa-dev mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/mesa-dev
