summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGert Wollny <[email protected]>2019-12-22 17:35:56 +0100
committerGert Wollny <[email protected]>2020-01-04 16:22:40 +0000
commit6c9495b3924a890bb118eec5519157c082dab3da (patch)
treeb4257cf271258fb57cee414dbb2be1291f5d4bc4
parentf69bf7fe8c98c9a4aa4a447443597ae038f6bf0b (diff)
nir: make nir_get_texture_size/lod available outside nir_lower_tex
This functions can be useful in other places. Signed-off-by: Gert Wollny <[email protected]> Reviewed-by: Eric Anholt <[email protected]> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/merge_requests/3286>
-rw-r--r--src/compiler/nir/nir_builtin_builder.c104
-rw-r--r--src/compiler/nir/nir_builtin_builder.h6
-rw-r--r--src/compiler/nir/nir_lower_tex.c117
3 files changed, 117 insertions, 110 deletions
diff --git a/src/compiler/nir/nir_builtin_builder.c b/src/compiler/nir/nir_builtin_builder.c
index c27666949e9..d35542c50a9 100644
--- a/src/compiler/nir/nir_builtin_builder.c
+++ b/src/compiler/nir/nir_builtin_builder.c
@@ -325,3 +325,107 @@ nir_atan2(nir_builder *b, nir_ssa_def *y, nir_ssa_def *x)
return nir_bcsel(b, nir_flt(b, nir_fmin(b, y, rcp_scaled_t), zero),
nir_fneg(b, arc), arc);
}
+
+nir_ssa_def *
+nir_get_texture_size(nir_builder *b, nir_tex_instr *tex)
+{
+ b->cursor = nir_before_instr(&tex->instr);
+
+ nir_tex_instr *txs;
+
+ unsigned num_srcs = 1; /* One for the LOD */
+ for (unsigned i = 0; i < tex->num_srcs; i++) {
+ if (tex->src[i].src_type == nir_tex_src_texture_deref ||
+ tex->src[i].src_type == nir_tex_src_sampler_deref ||
+ tex->src[i].src_type == nir_tex_src_texture_offset ||
+ tex->src[i].src_type == nir_tex_src_sampler_offset ||
+ tex->src[i].src_type == nir_tex_src_texture_handle ||
+ tex->src[i].src_type == nir_tex_src_sampler_handle)
+ num_srcs++;
+ }
+
+ txs = nir_tex_instr_create(b->shader, num_srcs);
+ txs->op = nir_texop_txs;
+ txs->sampler_dim = tex->sampler_dim;
+ txs->is_array = tex->is_array;
+ txs->is_shadow = tex->is_shadow;
+ txs->is_new_style_shadow = tex->is_new_style_shadow;
+ txs->texture_index = tex->texture_index;
+ txs->sampler_index = tex->sampler_index;
+ txs->dest_type = nir_type_int;
+
+ unsigned idx = 0;
+ for (unsigned i = 0; i < tex->num_srcs; i++) {
+ if (tex->src[i].src_type == nir_tex_src_texture_deref ||
+ tex->src[i].src_type == nir_tex_src_sampler_deref ||
+ tex->src[i].src_type == nir_tex_src_texture_offset ||
+ tex->src[i].src_type == nir_tex_src_sampler_offset ||
+ tex->src[i].src_type == nir_tex_src_texture_handle ||
+ tex->src[i].src_type == nir_tex_src_sampler_handle) {
+ nir_src_copy(&txs->src[idx].src, &tex->src[i].src, txs);
+ txs->src[idx].src_type = tex->src[i].src_type;
+ idx++;
+ }
+ }
+ /* Add in an LOD because some back-ends require it */
+ txs->src[idx].src = nir_src_for_ssa(nir_imm_int(b, 0));
+ txs->src[idx].src_type = nir_tex_src_lod;
+
+ nir_ssa_dest_init(&txs->instr, &txs->dest,
+ nir_tex_instr_dest_size(txs), 32, NULL);
+ nir_builder_instr_insert(b, &txs->instr);
+
+ return nir_i2f32(b, &txs->dest.ssa);
+}
+
+nir_ssa_def *
+nir_get_texture_lod(nir_builder *b, nir_tex_instr *tex)
+{
+ b->cursor = nir_before_instr(&tex->instr);
+
+ nir_tex_instr *tql;
+
+ unsigned num_srcs = 0;
+ for (unsigned i = 0; i < tex->num_srcs; i++) {
+ if (tex->src[i].src_type == nir_tex_src_coord ||
+ tex->src[i].src_type == nir_tex_src_texture_deref ||
+ tex->src[i].src_type == nir_tex_src_sampler_deref ||
+ tex->src[i].src_type == nir_tex_src_texture_offset ||
+ tex->src[i].src_type == nir_tex_src_sampler_offset ||
+ tex->src[i].src_type == nir_tex_src_texture_handle ||
+ tex->src[i].src_type == nir_tex_src_sampler_handle)
+ num_srcs++;
+ }
+
+ tql = nir_tex_instr_create(b->shader, num_srcs);
+ tql->op = nir_texop_lod;
+ tql->coord_components = tex->coord_components;
+ tql->sampler_dim = tex->sampler_dim;
+ tql->is_array = tex->is_array;
+ tql->is_shadow = tex->is_shadow;
+ tql->is_new_style_shadow = tex->is_new_style_shadow;
+ tql->texture_index = tex->texture_index;
+ tql->sampler_index = tex->sampler_index;
+ tql->dest_type = nir_type_float;
+
+ unsigned idx = 0;
+ for (unsigned i = 0; i < tex->num_srcs; i++) {
+ if (tex->src[i].src_type == nir_tex_src_coord ||
+ tex->src[i].src_type == nir_tex_src_texture_deref ||
+ tex->src[i].src_type == nir_tex_src_sampler_deref ||
+ tex->src[i].src_type == nir_tex_src_texture_offset ||
+ tex->src[i].src_type == nir_tex_src_sampler_offset ||
+ tex->src[i].src_type == nir_tex_src_texture_handle ||
+ tex->src[i].src_type == nir_tex_src_sampler_handle) {
+ nir_src_copy(&tql->src[idx].src, &tex->src[i].src, tql);
+ tql->src[idx].src_type = tex->src[i].src_type;
+ idx++;
+ }
+ }
+
+ nir_ssa_dest_init(&tql->instr, &tql->dest, 2, 32, NULL);
+ nir_builder_instr_insert(b, &tql->instr);
+
+ /* The LOD is the y component of the result */
+ return nir_channel(b, &tql->dest.ssa, 1);
+}
diff --git a/src/compiler/nir/nir_builtin_builder.h b/src/compiler/nir/nir_builtin_builder.h
index 0b4d1d0135e..5610d480452 100644
--- a/src/compiler/nir/nir_builtin_builder.h
+++ b/src/compiler/nir/nir_builtin_builder.h
@@ -49,6 +49,12 @@ nir_ssa_def* nir_upsample(nir_builder *b, nir_ssa_def *hi, nir_ssa_def *lo);
nir_ssa_def* nir_atan(nir_builder *b, nir_ssa_def *y_over_x);
nir_ssa_def* nir_atan2(nir_builder *b, nir_ssa_def *y, nir_ssa_def *x);
+nir_ssa_def *
+nir_get_texture_lod(nir_builder *b, nir_tex_instr *tex);
+
+nir_ssa_def *
+nir_get_texture_size(nir_builder *b, nir_tex_instr *tex);
+
static inline nir_ssa_def *
nir_nan_check2(nir_builder *b, nir_ssa_def *x, nir_ssa_def *y, nir_ssa_def *res)
{
diff --git a/src/compiler/nir/nir_lower_tex.c b/src/compiler/nir/nir_lower_tex.c
index 05b46b90252..6c8c6aa1164 100644
--- a/src/compiler/nir/nir_lower_tex.c
+++ b/src/compiler/nir/nir_lower_tex.c
@@ -37,6 +37,7 @@
#include "nir.h"
#include "nir_builder.h"
+#include "nir_builtin_builder.h"
#include "nir_format_convert.h"
static bool
@@ -103,110 +104,6 @@ project_src(nir_builder *b, nir_tex_instr *tex)
return true;
}
-static nir_ssa_def *
-get_texture_size(nir_builder *b, nir_tex_instr *tex)
-{
- b->cursor = nir_before_instr(&tex->instr);
-
- nir_tex_instr *txs;
-
- unsigned num_srcs = 1; /* One for the LOD */
- for (unsigned i = 0; i < tex->num_srcs; i++) {
- if (tex->src[i].src_type == nir_tex_src_texture_deref ||
- tex->src[i].src_type == nir_tex_src_sampler_deref ||
- tex->src[i].src_type == nir_tex_src_texture_offset ||
- tex->src[i].src_type == nir_tex_src_sampler_offset ||
- tex->src[i].src_type == nir_tex_src_texture_handle ||
- tex->src[i].src_type == nir_tex_src_sampler_handle)
- num_srcs++;
- }
-
- txs = nir_tex_instr_create(b->shader, num_srcs);
- txs->op = nir_texop_txs;
- txs->sampler_dim = tex->sampler_dim;
- txs->is_array = tex->is_array;
- txs->is_shadow = tex->is_shadow;
- txs->is_new_style_shadow = tex->is_new_style_shadow;
- txs->texture_index = tex->texture_index;
- txs->sampler_index = tex->sampler_index;
- txs->dest_type = nir_type_int;
-
- unsigned idx = 0;
- for (unsigned i = 0; i < tex->num_srcs; i++) {
- if (tex->src[i].src_type == nir_tex_src_texture_deref ||
- tex->src[i].src_type == nir_tex_src_sampler_deref ||
- tex->src[i].src_type == nir_tex_src_texture_offset ||
- tex->src[i].src_type == nir_tex_src_sampler_offset ||
- tex->src[i].src_type == nir_tex_src_texture_handle ||
- tex->src[i].src_type == nir_tex_src_sampler_handle) {
- nir_src_copy(&txs->src[idx].src, &tex->src[i].src, txs);
- txs->src[idx].src_type = tex->src[i].src_type;
- idx++;
- }
- }
- /* Add in an LOD because some back-ends require it */
- txs->src[idx].src = nir_src_for_ssa(nir_imm_int(b, 0));
- txs->src[idx].src_type = nir_tex_src_lod;
-
- nir_ssa_dest_init(&txs->instr, &txs->dest,
- nir_tex_instr_dest_size(txs), 32, NULL);
- nir_builder_instr_insert(b, &txs->instr);
-
- return nir_i2f32(b, &txs->dest.ssa);
-}
-
-static nir_ssa_def *
-get_texture_lod(nir_builder *b, nir_tex_instr *tex)
-{
- b->cursor = nir_before_instr(&tex->instr);
-
- nir_tex_instr *tql;
-
- unsigned num_srcs = 0;
- for (unsigned i = 0; i < tex->num_srcs; i++) {
- if (tex->src[i].src_type == nir_tex_src_coord ||
- tex->src[i].src_type == nir_tex_src_texture_deref ||
- tex->src[i].src_type == nir_tex_src_sampler_deref ||
- tex->src[i].src_type == nir_tex_src_texture_offset ||
- tex->src[i].src_type == nir_tex_src_sampler_offset ||
- tex->src[i].src_type == nir_tex_src_texture_handle ||
- tex->src[i].src_type == nir_tex_src_sampler_handle)
- num_srcs++;
- }
-
- tql = nir_tex_instr_create(b->shader, num_srcs);
- tql->op = nir_texop_lod;
- tql->coord_components = tex->coord_components;
- tql->sampler_dim = tex->sampler_dim;
- tql->is_array = tex->is_array;
- tql->is_shadow = tex->is_shadow;
- tql->is_new_style_shadow = tex->is_new_style_shadow;
- tql->texture_index = tex->texture_index;
- tql->sampler_index = tex->sampler_index;
- tql->dest_type = nir_type_float;
-
- unsigned idx = 0;
- for (unsigned i = 0; i < tex->num_srcs; i++) {
- if (tex->src[i].src_type == nir_tex_src_coord ||
- tex->src[i].src_type == nir_tex_src_texture_deref ||
- tex->src[i].src_type == nir_tex_src_sampler_deref ||
- tex->src[i].src_type == nir_tex_src_texture_offset ||
- tex->src[i].src_type == nir_tex_src_sampler_offset ||
- tex->src[i].src_type == nir_tex_src_texture_handle ||
- tex->src[i].src_type == nir_tex_src_sampler_handle) {
- nir_src_copy(&tql->src[idx].src, &tex->src[i].src, tql);
- tql->src[idx].src_type = tex->src[i].src_type;
- idx++;
- }
- }
-
- nir_ssa_dest_init(&tql->instr, &tql->dest, 2, 32, NULL);
- nir_builder_instr_insert(b, &tql->instr);
-
- /* The LOD is the y component of the result */
- return nir_channel(b, &tql->dest.ssa, 1);
-}
-
static bool
lower_offset(nir_builder *b, nir_tex_instr *tex)
{
@@ -229,7 +126,7 @@ lower_offset(nir_builder *b, nir_tex_instr *tex)
if (tex->sampler_dim == GLSL_SAMPLER_DIM_RECT) {
offset_coord = nir_fadd(b, coord, nir_i2f32(b, offset));
} else {
- nir_ssa_def *txs = get_texture_size(b, tex);
+ nir_ssa_def *txs = nir_get_texture_size(b, tex);
nir_ssa_def *scale = nir_frcp(b, txs);
offset_coord = nir_fadd(b, coord,
@@ -271,7 +168,7 @@ lower_rect(nir_builder *b, nir_tex_instr *tex)
*/
tex->sampler_dim = GLSL_SAMPLER_DIM_2D;
- nir_ssa_def *txs = get_texture_size(b, tex);
+ nir_ssa_def *txs = nir_get_texture_size(b, tex);
nir_ssa_def *scale = nir_frcp(b, txs);
/* Walk through the sources normalizing the requested arguments. */
@@ -297,7 +194,7 @@ lower_implicit_lod(nir_builder *b, nir_tex_instr *tex)
b->cursor = nir_before_instr(&tex->instr);
- nir_ssa_def *lod = get_texture_lod(b, tex);
+ nir_ssa_def *lod = nir_get_texture_lod(b, tex);
int bias_idx = nir_tex_instr_src_index(tex, nir_tex_src_bias);
if (bias_idx >= 0) {
@@ -508,7 +405,7 @@ lower_gradient_cube_map(nir_builder *b, nir_tex_instr *tex)
assert(tex->dest.is_ssa);
/* Use textureSize() to get the width and height of LOD 0 */
- nir_ssa_def *size = get_texture_size(b, tex);
+ nir_ssa_def *size = nir_get_texture_size(b, tex);
/* Cubemap texture lookups first generate a texture coordinate normalized
* to [-1, 1] on the appropiate face. The appropiate face is determined
@@ -675,7 +572,7 @@ lower_gradient(nir_builder *b, nir_tex_instr *tex)
}
nir_ssa_def *size =
- nir_channels(b, get_texture_size(b, tex), component_mask);
+ nir_channels(b, nir_get_texture_size(b, tex), component_mask);
/* Scale the gradients by width and height. Effectively, the incoming
* gradients are s'(x,y), t'(x,y), and r'(x,y) from equation 3.19 in the
@@ -737,7 +634,7 @@ saturate_src(nir_builder *b, nir_tex_instr *tex, unsigned sat_mask)
/* non-normalized texture coords, so clamp to texture
* size rather than [0.0, 1.0]
*/
- nir_ssa_def *txs = get_texture_size(b, tex);
+ nir_ssa_def *txs = nir_get_texture_size(b, tex);
comp[j] = nir_fmax(b, comp[j], nir_imm_float(b, 0.0));
comp[j] = nir_fmin(b, comp[j], nir_channel(b, txs, j));
} else {