summaryrefslogtreecommitdiff
path: root/src/gallium/drivers/etnaviv/etnaviv_screen.c
diff options
context:
space:
mode:
authorJonathan Marek <jonathan@marek.ca>2019-05-11 09:51:42 -0400
committerJonathan Marek <jonathan@marek.ca>2019-08-06 10:33:17 -0400
commited7a27719a9fceb7271dfd97b2217c787356f21a (patch)
tree58ec81594147a7daabc4bbb3f8c2b2b473ab02e6 /src/gallium/drivers/etnaviv/etnaviv_screen.c
parentee1ed59458741d36b217f80ebd83ffbd3426bf05 (diff)
etnaviv: add alternative NIR compiler
enable with ETNA_MESA_DEBUG=nir Signed-off-by: Jonathan Marek <jonathan@marek.ca> Reviewed-by: Philipp Zabel <p.zabel@pengutronix.de>
Diffstat (limited to 'src/gallium/drivers/etnaviv/etnaviv_screen.c')
-rw-r--r--src/gallium/drivers/etnaviv/etnaviv_screen.c36
1 files changed, 35 insertions, 1 deletions
diff --git a/src/gallium/drivers/etnaviv/etnaviv_screen.c b/src/gallium/drivers/etnaviv/etnaviv_screen.c
index c0b39ec600c..88ab1b02249 100644
--- a/src/gallium/drivers/etnaviv/etnaviv_screen.c
+++ b/src/gallium/drivers/etnaviv/etnaviv_screen.c
@@ -72,6 +72,7 @@ static const struct debug_named_value debug_options[] = {
{"draw_stall", ETNA_DBG_DRAW_STALL, "Stall FE/PE after each rendered primitive"},
{"shaderdb", ETNA_DBG_SHADERDB, "Enable shaderdb output"},
{"no_singlebuffer",ETNA_DBG_NO_SINGLEBUF, "Disable single buffer feature"},
+ {"nir", ETNA_DBG_NIR, "use new NIR compiler"},
DEBUG_NAMED_VALUE_END
};
@@ -154,6 +155,11 @@ etna_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
return 1;
case PIPE_CAP_NATIVE_FENCE_FD:
return screen->drm_version >= ETNA_DRM_VERSION_FENCE_FD;
+ case PIPE_CAP_TGSI_FS_POSITION_IS_SYSVAL:
+ case PIPE_CAP_TGSI_FS_FACE_IS_INTEGER_SYSVAL: /* note: not integer */
+ return DBG_ENABLED(ETNA_DBG_NIR);
+ case PIPE_CAP_TGSI_FS_POINT_IS_SYSVAL:
+ return 0;
/* Memory */
case PIPE_CAP_CONSTANT_BUFFER_OFFSET_ALIGNMENT:
@@ -322,7 +328,7 @@ etna_screen_get_shader_param(struct pipe_screen *pscreen,
? screen->specs.fragment_sampler_count
: screen->specs.vertex_sampler_count;
case PIPE_SHADER_CAP_PREFERRED_IR:
- return PIPE_SHADER_IR_TGSI;
+ return DBG_ENABLED(ETNA_DBG_NIR) ? PIPE_SHADER_IR_NIR : PIPE_SHADER_IR_TGSI;
case PIPE_SHADER_CAP_MAX_CONST_BUFFER_SIZE:
return 4096;
case PIPE_SHADER_CAP_TGSI_DROUND_SUPPORTED:
@@ -743,6 +749,13 @@ etna_screen_bo_from_handle(struct pipe_screen *pscreen,
return bo;
}
+static const void *
+etna_get_compiler_options(struct pipe_screen *pscreen,
+ enum pipe_shader_ir ir, unsigned shader)
+{
+ return &etna_screen(pscreen)->options;
+}
+
struct pipe_screen *
etna_screen_create(struct etna_device *dev, struct etna_gpu *gpu,
struct renderonly *ro)
@@ -845,6 +858,26 @@ etna_screen_create(struct etna_device *dev, struct etna_gpu *gpu,
if (!etna_get_specs(screen))
goto fail;
+ screen->options = (nir_shader_compiler_options) {
+ .lower_fpow = true,
+ .lower_sub = true,
+ .lower_ftrunc = true,
+ .fuse_ffma = true,
+ .lower_bitops = true,
+ .lower_all_io_to_temps = true,
+ .vertex_id_zero_based = true,
+ .lower_flrp32 = true,
+ .lower_fmod = true,
+ .lower_vector_cmp = true,
+ .lower_fdph = true,
+ .lower_fdiv = true, /* !screen->specs.has_new_transcendentals */
+ .lower_fsign = !screen->specs.has_sign_floor_ceil,
+ .lower_ffloor = !screen->specs.has_sign_floor_ceil,
+ .lower_fceil = !screen->specs.has_sign_floor_ceil,
+ .lower_fsqrt = !screen->specs.has_sin_cos_sqrt,
+ .lower_sincos = !screen->specs.has_sin_cos_sqrt,
+ };
+
/* apply debug options that disable individual features */
if (DBG_ENABLED(ETNA_DBG_NO_EARLY_Z))
screen->features[viv_chipFeatures] |= chipFeatures_NO_EARLY_Z;
@@ -861,6 +894,7 @@ etna_screen_create(struct etna_device *dev, struct etna_gpu *gpu,
pscreen->get_param = etna_screen_get_param;
pscreen->get_paramf = etna_screen_get_paramf;
pscreen->get_shader_param = etna_screen_get_shader_param;
+ pscreen->get_compiler_options = etna_get_compiler_options;
pscreen->get_name = etna_screen_get_name;
pscreen->get_vendor = etna_screen_get_vendor;