i965/vs: Rework vs_emit to take a nir_shader and a brw_compiler
authorJason Ekstrand <jason.ekstrand@intel.com>
Thu, 8 Oct 2015 20:53:33 +0000 (13:53 -0700)
committerJason Ekstrand <jason.ekstrand@intel.com>
Mon, 19 Oct 2015 15:47:03 +0000 (08:47 -0700)
This commit removes all dependence on GL state by getting rid of the
brw_context parameter and the GL data structures.

v2 (Jason Ekstrand):
   - Patch use_legacy_snorm_formula through as a function argument rather
     than trying to go through the shader key.

Reviewed-by: Topi Pohjolainen <topi.pohjolainen@intel.com>
src/mesa/drivers/dri/i965/brw_vec4.cpp
src/mesa/drivers/dri/i965/brw_vs.c
src/mesa/drivers/dri/i965/brw_vs.h

index bcd1f487f0ba530358df28540ba3eb4e9a88d32f..1b3bce820977cc96ad4b926b46d6269413c27c03 100644 (file)
@@ -1920,51 +1920,42 @@ extern "C" {
  * Returns the final assembly and the program's size.
  */
 const unsigned *
-brw_vs_emit(struct brw_context *brw,
+brw_vs_emit(const struct brw_compiler *compiler, void *log_data,
             void *mem_ctx,
             const struct brw_vs_prog_key *key,
             struct brw_vs_prog_data *prog_data,
-            struct gl_vertex_program *vp,
-            struct gl_shader_program *prog,
+            const nir_shader *shader,
+            gl_clip_plane *clip_planes,
+            bool use_legacy_snorm_formula,
             int shader_time_index,
-            unsigned *final_assembly_size)
+            unsigned *final_assembly_size,
+            char **error_str)
 {
    const unsigned *assembly = NULL;
 
-   if (brw->intelScreen->compiler->scalar_vs) {
+   if (compiler->scalar_vs) {
       prog_data->base.dispatch_mode = DISPATCH_MODE_SIMD8;
 
-      fs_visitor v(brw->intelScreen->compiler, brw,
-                   mem_ctx, key, &prog_data->base.base,
+      fs_visitor v(compiler, log_data, mem_ctx, key, &prog_data->base.base,
                    NULL, /* prog; Only used for TEXTURE_RECTANGLE on gen < 8 */
-                   vp->Base.nir, 8, shader_time_index);
-      if (!v.run_vs(brw_select_clip_planes(&brw->ctx))) {
-         if (prog) {
-            prog->LinkStatus = false;
-            ralloc_strcat(&prog->InfoLog, v.fail_msg);
-         }
-
-         _mesa_problem(NULL, "Failed to compile vertex shader: %s\n",
-                       v.fail_msg);
+                   shader, 8, shader_time_index);
+      if (!v.run_vs(clip_planes)) {
+         if (error_str)
+            *error_str = ralloc_strdup(mem_ctx, v.fail_msg);
 
          return NULL;
       }
 
-      fs_generator g(brw->intelScreen->compiler, brw,
-                     mem_ctx, (void *) key, &prog_data->base.base,
-                     v.promoted_constants,
+      fs_generator g(compiler, log_data, mem_ctx, (void *) key,
+                     &prog_data->base.base, v.promoted_constants,
                      v.runtime_check_aads_emit, "VS");
       if (INTEL_DEBUG & DEBUG_VS) {
-         char *name;
-         if (prog) {
-            name = ralloc_asprintf(mem_ctx, "%s vertex shader %d",
-                                   prog->Label ? prog->Label : "unnamed",
-                                   prog->Name);
-         } else {
-            name = ralloc_asprintf(mem_ctx, "vertex program %d",
-                                   vp->Base.Id);
-         }
-         g.enable_debug(name);
+         const char *debug_name =
+            ralloc_asprintf(mem_ctx, "%s vertex shader %s",
+                            shader->info.label ? shader->info.label : "unnamed",
+                            shader->info.name);
+
+         g.enable_debug(debug_name);
       }
       g.generate_code(v.cfg, 8);
       assembly = g.get_assembly(final_assembly_size);
@@ -1973,26 +1964,19 @@ brw_vs_emit(struct brw_context *brw,
    if (!assembly) {
       prog_data->base.dispatch_mode = DISPATCH_MODE_4X2_DUAL_OBJECT;
 
-      vec4_vs_visitor v(brw->intelScreen->compiler, brw, key, prog_data,
-                        vp->Base.nir, brw_select_clip_planes(&brw->ctx),
-                        mem_ctx, shader_time_index,
-                        !_mesa_is_gles3(&brw->ctx));
+      vec4_vs_visitor v(compiler, log_data, key, prog_data,
+                        shader, clip_planes, mem_ctx,
+                        shader_time_index, use_legacy_snorm_formula);
       if (!v.run()) {
-         if (prog) {
-            prog->LinkStatus = false;
-            ralloc_strcat(&prog->InfoLog, v.fail_msg);
-         }
-
-         _mesa_problem(NULL, "Failed to compile vertex shader: %s\n",
-                       v.fail_msg);
+         if (error_str)
+            *error_str = ralloc_strdup(mem_ctx, v.fail_msg);
 
          return NULL;
       }
 
-      vec4_generator g(brw->intelScreen->compiler, brw,
-                       &prog_data->base,
+      vec4_generator g(compiler, log_data, &prog_data->base,
                        mem_ctx, INTEL_DEBUG & DEBUG_VS, "vertex", "VS");
-      assembly = g.generate_assembly(v.cfg, final_assembly_size, vp->Base.nir);
+      assembly = g.generate_assembly(v.cfg, final_assembly_size, shader);
    }
 
    return assembly;
index 725311732ce794435aa403c47d77107daed0c3e0..353c5a049681cee5a7adcfd5890184352cd94b71 100644 (file)
@@ -31,6 +31,7 @@
 
 
 #include "main/compiler.h"
+#include "main/context.h"
 #include "brw_context.h"
 #include "brw_vs.h"
 #include "brw_util.h"
@@ -201,9 +202,20 @@ brw_codegen_vs_prog(struct brw_context *brw,
 
    /* Emit GEN4 code.
     */
-   program = brw_vs_emit(brw, mem_ctx, key, &prog_data,
-                         &vp->program, prog, st_index, &program_size);
+   char *error_str;
+   program = brw_vs_emit(brw->intelScreen->compiler, brw, mem_ctx, key,
+                         &prog_data, vp->program.Base.nir,
+                         brw_select_clip_planes(&brw->ctx),
+                         !_mesa_is_gles3(&brw->ctx),
+                         st_index, &program_size, &error_str);
    if (program == NULL) {
+      if (prog) {
+         prog->LinkStatus = false;
+         ralloc_strcat(&prog->InfoLog, error_str);
+      }
+
+      _mesa_problem(NULL, "Failed to compile vertex shader: %s\n", error_str);
+
       ralloc_free(mem_ctx);
       return false;
    }
index c927cacd787abbc0654f522838177efcba489faf..b65dd3b6012821b8a6d2373eda9b4474e5ea550a 100644 (file)
 extern "C" {
 #endif
 
-const unsigned *brw_vs_emit(struct brw_context *brw,
+struct nir_shader;
+
+const unsigned *brw_vs_emit(const struct brw_compiler *compiler, void *log_data,
                             void *mem_ctx,
                             const struct brw_vs_prog_key *key,
                             struct brw_vs_prog_data *prog_data,
-                            struct gl_vertex_program *vp,
-                            struct gl_shader_program *shader_prog,
+                            const struct nir_shader *shader,
+                            gl_clip_plane *clip_planes,
+                            bool use_legacy_snorm_formula,
                             int shader_time_index,
-                            unsigned *program_size);
+                            unsigned *final_assembly_size,
+                            char **error_str);
 void brw_vs_debug_recompile(struct brw_context *brw,
                             struct gl_shader_program *prog,
                             const struct brw_vs_prog_key *key);