freedreno/ir3: need different compiler options for a5xx
authorRob Clark <robdclark@gmail.com>
Tue, 23 May 2017 13:09:41 +0000 (09:09 -0400)
committerRob Clark <robdclark@gmail.com>
Tue, 23 May 2017 16:26:35 +0000 (12:26 -0400)
vertex_id_zero_based differs..

Signed-off-by: Rob Clark <robdclark@gmail.com>
src/gallium/drivers/freedreno/freedreno_screen.c
src/gallium/drivers/freedreno/ir3/ir3_cmdline.c
src/gallium/drivers/freedreno/ir3/ir3_nir.c
src/gallium/drivers/freedreno/ir3/ir3_nir.h

index e8ed082a6188dfb5d44176cd09537e705b6289b5..a783d2045468e79438d6bfd1385c8b73bc3ee4cf 100644 (file)
@@ -676,7 +676,7 @@ fd_get_compiler_options(struct pipe_screen *pscreen,
        struct fd_screen *screen = fd_screen(pscreen);
 
        if (is_ir3(screen))
-               return ir3_get_compiler_options();
+               return ir3_get_compiler_options(screen->compiler);
 
        return NULL;
 }
index ba1bfa8b3b3f5ec4bae936fe0ba6f3fef283cfb3..10cf9c4556841d90f4acf8eed69a2ca6b8620821 100644 (file)
@@ -96,6 +96,8 @@ fixup_varying_slots(struct exec_list *var_list)
        }
 }
 
+static struct ir3_compiler *compiler;
+
 static nir_shader *
 load_glsl(unsigned num_files, char* const* files, gl_shader_stage stage)
 {
@@ -109,7 +111,7 @@ load_glsl(unsigned num_files, char* const* files, gl_shader_stage stage)
        if (!prog)
                errx(1, "couldn't parse `%s'", files[0]);
 
-       nir_shader *nir = glsl_to_nir(prog, stage, ir3_get_compiler_options());
+       nir_shader *nir = glsl_to_nir(prog, stage, ir3_get_compiler_options(compiler));
 
        standalone_compiler_cleanup(prog);
 
@@ -366,6 +368,8 @@ int main(int argc, char **argv)
 
        nir_shader *nir;
 
+       compiler = ir3_compiler_create(NULL, gpu_id);
+
        if (s.from_tgsi) {
                struct tgsi_token toks[65536];
 
@@ -392,7 +396,7 @@ int main(int argc, char **argv)
                return -1;
        }
 
-       s.compiler = ir3_compiler_create(NULL, gpu_id);
+       s.compiler = compiler;
        s.nir = ir3_optimize_nir(&s, nir, NULL);
 
        v.key = key;
index d0083d8fc8d8cb89273fe85e3aa0773265d2e14e..9fb41fcce0c4ef5b5845116730d588542dbf4cf1 100644 (file)
@@ -52,6 +52,23 @@ static const nir_shader_compiler_options options = {
                .lower_extract_word = true,
 };
 
+static const nir_shader_compiler_options options_5xx = {
+               .lower_fpow = true,
+               .lower_fsat = true,
+               .lower_scmp = true,
+               .lower_flrp32 = true,
+               .lower_flrp64 = true,
+               .lower_ffract = true,
+               .lower_fmod32 = true,
+               .lower_fmod64 = true,
+               .lower_fdiv = true,
+               .fuse_ffma = true,
+               .native_integers = true,
+               .vertex_id_zero_based = false,
+               .lower_extract_byte = true,
+               .lower_extract_word = true,
+};
+
 struct nir_shader *
 ir3_tgsi_to_nir(const struct tgsi_token *tokens)
 {
@@ -59,8 +76,10 @@ ir3_tgsi_to_nir(const struct tgsi_token *tokens)
 }
 
 const nir_shader_compiler_options *
-ir3_get_compiler_options(void)
+ir3_get_compiler_options(struct ir3_compiler *compiler)
 {
+       if (compiler->gpu_id >= 500)
+               return &options_5xx;
        return &options;
 }
 
index e1e95238c208653be41671b29461d559cec7fe42..2e2e093b09896db66e6e09f36555e028614ca597 100644 (file)
@@ -38,7 +38,7 @@ bool ir3_nir_lower_if_else(nir_shader *shader);
 bool ir3_nir_apply_trig_workarounds(nir_shader *shader);
 
 struct nir_shader * ir3_tgsi_to_nir(const struct tgsi_token *tokens);
-const nir_shader_compiler_options * ir3_get_compiler_options(void);
+const nir_shader_compiler_options * ir3_get_compiler_options(struct ir3_compiler *compiler);
 bool ir3_key_lowers_nir(const struct ir3_shader_key *key);
 struct nir_shader * ir3_optimize_nir(struct ir3_shader *shader, nir_shader *s,
                const struct ir3_shader_key *key);