From 444b703a88f8a9c6487db278e8e4331e9fb87d12 Mon Sep 17 00:00:00 2001 From: Samuel Pitoiset Date: Thu, 11 May 2017 17:29:47 +0200 Subject: [PATCH] mesa: add infrastructure for bindless samplers/images bound to units MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit 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 Reviewed-by: Nicolai Hähnle --- 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 8a80f4feb45..7f913608f60 100644 --- a/src/mesa/main/mtypes.h +++ b/src/mesa/main/mtypes.h @@ -1990,6 +1990,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. * @@ -2124,6 +2160,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; + union { struct { /** -- 2.30.2