nir,spirv: add sparse image loads

Signed-off-by: Rhys Perry <pendingchaos02@gmail.com>
Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/7774>
This commit is contained in:
Rhys Perry
2020-11-20 16:14:26 +00:00
committed by Marge Bot
parent 3a7972f72a
commit 1fd8b46667
9 changed files with 62 additions and 11 deletions

View File

@@ -83,6 +83,7 @@ gather_intrinsic(struct access_state *state, nir_intrinsic_instr *instr)
switch (instr->intrinsic) {
case nir_intrinsic_image_deref_load:
case nir_intrinsic_image_deref_store:
case nir_intrinsic_image_deref_sparse_load:
case nir_intrinsic_image_deref_atomic_add:
case nir_intrinsic_image_deref_atomic_imin:
case nir_intrinsic_image_deref_atomic_umin:
@@ -96,7 +97,8 @@ gather_intrinsic(struct access_state *state, nir_intrinsic_instr *instr)
case nir_intrinsic_image_deref_atomic_fadd:
var = nir_intrinsic_get_var(instr, 0);
read = instr->intrinsic != nir_intrinsic_image_deref_store;
write = instr->intrinsic != nir_intrinsic_image_deref_load;
write = instr->intrinsic != nir_intrinsic_image_deref_load &&
instr->intrinsic != nir_intrinsic_image_deref_sparse_load;
/* In OpenGL, buffer images use normal buffer objects, whereas other
* image types use textures which cannot alias with buffer objects.
@@ -119,6 +121,7 @@ gather_intrinsic(struct access_state *state, nir_intrinsic_instr *instr)
case nir_intrinsic_bindless_image_load:
case nir_intrinsic_bindless_image_store:
case nir_intrinsic_bindless_image_sparse_load:
case nir_intrinsic_bindless_image_atomic_add:
case nir_intrinsic_bindless_image_atomic_imin:
case nir_intrinsic_bindless_image_atomic_umin:
@@ -131,7 +134,8 @@ gather_intrinsic(struct access_state *state, nir_intrinsic_instr *instr)
case nir_intrinsic_bindless_image_atomic_comp_swap:
case nir_intrinsic_bindless_image_atomic_fadd:
read = instr->intrinsic != nir_intrinsic_bindless_image_store;
write = instr->intrinsic != nir_intrinsic_bindless_image_load;
write = instr->intrinsic != nir_intrinsic_bindless_image_load &&
instr->intrinsic != nir_intrinsic_bindless_image_sparse_load;
if (nir_intrinsic_image_dim(instr) == GLSL_SAMPLER_DIM_BUF) {
state->buffers_read |= read;
@@ -218,7 +222,8 @@ update_access(struct access_state *state, nir_intrinsic_instr *instr, bool is_im
bool is_memory_writeonly = access & ACCESS_NON_READABLE;
if (instr->intrinsic != nir_intrinsic_bindless_image_load &&
instr->intrinsic != nir_intrinsic_bindless_image_store) {
instr->intrinsic != nir_intrinsic_bindless_image_store &&
instr->intrinsic != nir_intrinsic_bindless_image_sparse_load) {
const nir_variable *var = nir_get_binding_variable(
state->shader, nir_chase_binding(instr->src[0]));
is_memory_readonly |= var && (var->data.access & ACCESS_NON_WRITEABLE);
@@ -246,6 +251,7 @@ process_intrinsic(struct access_state *state, nir_intrinsic_instr *instr)
switch (instr->intrinsic) {
case nir_intrinsic_bindless_image_load:
case nir_intrinsic_bindless_image_store:
case nir_intrinsic_bindless_image_sparse_load:
return update_access(state, instr, true,
nir_intrinsic_image_dim(instr) == GLSL_SAMPLER_DIM_BUF);
@@ -258,7 +264,8 @@ process_intrinsic(struct access_state *state, nir_intrinsic_instr *instr)
}
case nir_intrinsic_image_deref_load:
case nir_intrinsic_image_deref_store: {
case nir_intrinsic_image_deref_store:
case nir_intrinsic_image_deref_sparse_load: {
nir_variable *var = nir_intrinsic_get_var(instr, 0);
bool is_buffer =