mesa: add infrastructure for bindless samplers/images bound to units
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@gmail.com> Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
This commit is contained in:
@@ -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.
|
* Names of the various vertex/fragment program register files, etc.
|
||||||
*
|
*
|
||||||
@@ -2124,6 +2160,22 @@ struct gl_program
|
|||||||
*/
|
*/
|
||||||
gl_texture_index SamplerTargets[MAX_SAMPLERS];
|
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 {
|
union {
|
||||||
struct {
|
struct {
|
||||||
/**
|
/**
|
||||||
|
Reference in New Issue
Block a user