[Mesa-dev] [RFC PATCH 11/65] mesa: add infrastructure for bindless samplers/images bound to units

Nicolai Hähnle nhaehnle at gmail.com
Wed May 24 10:28:08 UTC 2017


On 19.05.2017 18:52, Samuel Pitoiset wrote:
> Yes, ARB_bindless_texture allows to do this. In other words, in
> a situation like:
> 
> layout (bindless_sampler) uniform sampler2D tex;
> 
> The 'tex' sampler uniform can be either set with glUniform1()
> (old-style bound samplers) or with glUniformHandleui() (resident
> handles).
> 
> When glUniform1() is used, we have to somehow make the texture
> resident "under the hood". This is done by requesting a texture
> handle to the driver, making the handle resident in the current
> context and overwriting the value directly in the constant buffer.
> 
> Signed-off-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
> ---
>   src/mesa/main/mtypes.h | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++
>   1 file changed, 52 insertions(+)
> 
> diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h
> index 70865b373d..1d168e8c68 100644
> --- a/src/mesa/main/mtypes.h
> +++ b/src/mesa/main/mtypes.h
> @@ -1988,6 +1988,42 @@ struct gl_perf_query_state
>   
>   
>   /**
> + * A bindless sampler object.
> + */
> +struct gl_bindless_sampler
> +{
> +   /** Texture unit (set by glUniform1()). */
> +   GLubyte unit;
> +
> +   /** Texture Target (TEXTURE_1D/2D/3D/etc_INDEX). */
> +   gl_texture_index target;
> +
> +   /** Whether this bindless sampler is bound to a unit. */
> +   GLboolean bound;
> +
> +   /** Pointer to the base of the data. */
> +   GLvoid *data;
> +};
> +
> +/**
> + * A bindless image object.
> + */
> +struct gl_bindless_image
> +{
> +   /** Image unit (set by glUniform1()). */
> +   GLubyte unit;
> +
> +   /** Access qualifier (GL_READ_WRITE, GL_READ_ONLY, GL_WRITE_ONLY) */
> +   GLenum access;
> +
> +   /** Whether this bindless image is bound to a unit. */
> +   GLboolean bound;
> +
> +   /** Pointer to the base of the data. */
> +   GLvoid *data;
> +};
> +
> +/**
>    * Names of the various vertex/fragment program register files, etc.
>    *
>    * NOTE: first four tokens must fit into 2 bits (see t_vb_arbprogram.c)
> @@ -2121,6 +2157,22 @@ struct gl_program
>             */
>            gl_texture_index SamplerTargets[MAX_SAMPLERS];
>   
> +         /**
> +          * Number of samplers declared with the bindless_sampler layout
> +          * qualifier as specified by ARB_bindless_texture.
> +          */
> +         GLuint NumBindlessSamplers;
> +         GLboolean HasBoundBindlessSampler;
> +         struct gl_bindless_sampler *BindlessSamplers;
> +
> +         /**
> +          * Number of images declared with the bindless_image layout qualifier
> +          * as specified by ARB_bindless_texture.
> +          */
> +         GLuint NumBindlessImages;
> +         GLboolean HasBoundBindlessImage;
> +         struct gl_bindless_image *BindlessImages;
> +

This could go into the sh part of the union below, couldn't it?

Cheers,
Nicolai


>            union {
>               struct {
>                  /**
> 


-- 
Lerne, wie die Welt wirklich ist,
Aber vergiss niemals, wie sie sein sollte.


More information about the mesa-dev mailing list