v3dv: implement VK_EXT_inline_uniform_block
Inline uniform blocks store their contents in pool memory rather than a separate buffer, and are intended to provide a way in which some platforms may provide more efficient access to the uniform data, similar to push constants but with more flexible size constraints. We implement these in a similar way as push constants: for constant access we copy the data in the uniform stream (using the new QUNIFORM_UNIFORM_UBO_*) enums to identify the inline buffer from which we need to copy and for indirect access we fallback to regular UBO access. Because at NIR level there is no distinction between inline and regular UBOs and the compiler isn't aware of Vulkan descriptor sets, we use the UBO index on UBO load intrinsics to identify inline UBOs, just like we do for push constants. Particularly, we reserve indices 1..MAX_INLINE_UNIFORM_BUFFERS for this, however, unlike push constants, inline buffers are accessed through descriptor sets, and therefore we need to make sure they are located in the first slots of the UBO descriptor map. This means we store them in the first MAX_INLINE_UNIFORM_BUFFERS slots of the map, with regular UBOs always coming after these slots. Reviewed-by: Alejandro Piñeiro <apinheiro@igalia.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/15575>
This commit is contained in:

committed by
Marge Bot

parent
37c0f68500
commit
ea3223e7a4
@@ -338,6 +338,14 @@ enum quniform_contents {
|
||||
* Current value of gl_ViewIndex for Multiview rendering.
|
||||
*/
|
||||
QUNIFORM_VIEW_INDEX,
|
||||
|
||||
/**
|
||||
* Inline uniform buffers
|
||||
*/
|
||||
QUNIFORM_INLINE_UBO_0,
|
||||
QUNIFORM_INLINE_UBO_1,
|
||||
QUNIFORM_INLINE_UBO_2,
|
||||
QUNIFORM_INLINE_UBO_3,
|
||||
};
|
||||
|
||||
static inline uint32_t v3d_unit_data_create(uint32_t unit, uint32_t value)
|
||||
@@ -574,6 +582,7 @@ enum v3d_compilation_result {
|
||||
*/
|
||||
struct v3d_compiler {
|
||||
const struct v3d_device_info *devinfo;
|
||||
uint32_t max_inline_uniform_buffers;
|
||||
struct ra_regs *regs;
|
||||
struct ra_class *reg_class_any[3];
|
||||
struct ra_class *reg_class_r5[3];
|
||||
@@ -1045,7 +1054,8 @@ vir_has_uniform(struct qinst *inst)
|
||||
return inst->uniform != ~0;
|
||||
}
|
||||
|
||||
const struct v3d_compiler *v3d_compiler_init(const struct v3d_device_info *devinfo);
|
||||
const struct v3d_compiler *v3d_compiler_init(const struct v3d_device_info *devinfo,
|
||||
uint32_t max_inline_uniform_buffers);
|
||||
void v3d_compiler_free(const struct v3d_compiler *compiler);
|
||||
void v3d_optimize_nir(struct v3d_compile *c, struct nir_shader *s);
|
||||
|
||||
|
Reference in New Issue
Block a user