From: Jason Ekstrand Date: Thu, 16 Oct 2014 23:53:03 +0000 (-0700) Subject: nir: Add NIR_TRUE and NIR_FALSE constants and use them for boolean immediates X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=4b4f90dbff1880e2fd5f1b00813ea4778d63d084;p=mesa.git nir: Add NIR_TRUE and NIR_FALSE constants and use them for boolean immediates Reviewed-by: Connor Abbott --- 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); }