summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Ekstrand <jason.ekstrand@intel.com>2014-10-16 16:53:03 -0700
committerJason Ekstrand <jason.ekstrand@intel.com>2015-01-15 07:18:59 -0800
commit4b4f90dbff1880e2fd5f1b00813ea4778d63d084 (patch)
tree315f322c5ffed0a89cb809231867f2f43f892519
parent744b4e9348db1767a772fda2a5cbe33abbba7db1 (diff)
nir: Add NIR_TRUE and NIR_FALSE constants and use them for boolean immediates
Reviewed-by: Connor Abbott <cwabbott0@gmail.com>
-rw-r--r--src/glsl/nir/nir.h3
-rw-r--r--src/glsl/nir/nir_lower_variables_scalar.c20
2 files changed, 19 insertions, 4 deletions
diff --git a/src/glsl/nir/nir.h b/src/glsl/nir/nir.h
index 1e708dfa985..195908d9a13 100644
--- a/src/glsl/nir/nir.h
+++ b/src/glsl/nir/nir.h
@@ -40,6 +40,9 @@
extern "C" {
#endif
+#define NIR_FALSE 0u
+#define NIR_TRUE (~0u)
+
struct nir_function_overload;
struct nir_function;
diff --git a/src/glsl/nir/nir_lower_variables_scalar.c b/src/glsl/nir/nir_lower_variables_scalar.c
index 48e43fefc79..b754fa3f859 100644
--- a/src/glsl/nir/nir_lower_variables_scalar.c
+++ b/src/glsl/nir/nir_lower_variables_scalar.c
@@ -352,13 +352,24 @@ get_deref_tail(nir_deref *deref)
/* helper for reg_const_load which emits a single instruction */
static void
reg_const_load_single_instr(nir_reg_dest reg, nir_constant *constant,
+ enum glsl_base_type base_type,
unsigned num_components, unsigned offset,
nir_function_impl *impl, void *mem_ctx)
{
nir_load_const_instr *instr = nir_load_const_instr_create(mem_ctx);
instr->num_components = num_components;
for (unsigned i = 0; i < num_components; i++) {
- instr->value.u[i] = constant->value.u[i + offset];
+ switch (base_type) {
+ case GLSL_TYPE_FLOAT:
+ case GLSL_TYPE_INT:
+ case GLSL_TYPE_UINT:
+ instr->value.u[i] = constant->value.u[i + offset];
+ break;
+ case GLSL_TYPE_BOOL:
+ instr->value.u[i] = constant->value.u[i + offset] ?
+ NIR_TRUE : NIR_FALSE;
+ break;
+ }
}
instr->dest.reg = reg;
instr->dest.reg.base_offset += offset;
@@ -376,20 +387,21 @@ reg_const_load(nir_reg_dest reg, nir_constant *constant,
const struct glsl_type *subtype;
unsigned subtype_size;
- switch (glsl_get_base_type(type)) {
+ enum glsl_base_type base_type = glsl_get_base_type(type);
+ switch (base_type) {
case GLSL_TYPE_FLOAT:
case GLSL_TYPE_INT:
case GLSL_TYPE_UINT:
case GLSL_TYPE_BOOL:
if (glsl_type_is_matrix(type)) {
for (unsigned i = 0; i < glsl_get_matrix_columns(type); i++) {
- reg_const_load_single_instr(reg, constant,
+ reg_const_load_single_instr(reg, constant, base_type,
glsl_get_vector_elements(type),
i * glsl_get_vector_elements(type),
impl, mem_ctx);
}
} else {
- reg_const_load_single_instr(reg, constant,
+ reg_const_load_single_instr(reg, constant, base_type,
glsl_get_vector_elements(type), 0,
impl, mem_ctx);
}