compiler: Progagate compile results to xgl, don't use them yet
authorCody Northrop <cody@lunarg.com>
Wed, 24 Sep 2014 21:38:52 +0000 (15:38 -0600)
committerCourtney Goeltzenleuchter <courtney@LunarG.com>
Fri, 31 Oct 2014 21:25:05 +0000 (15:25 -0600)
icd/intel/compiler/pipeline/brw_context.h
icd/intel/compiler/pipeline/brw_fs.cpp
icd/intel/compiler/pipeline/brw_shader.cpp
icd/intel/compiler/pipeline/brw_shader.h
icd/intel/compiler/pipeline/brw_wm.h
icd/intel/compiler/pipeline/pipeline_compiler_interface.cpp
icd/intel/compiler/shader/compiler_interface.cpp

index bb032e28b40a118575ed5355542e72988351e082..c2b73d429a36340229b7ad9c479224d4b92647eb 100644 (file)
@@ -1149,6 +1149,10 @@ struct brw_context
    } shader_time;
 
    struct intel_screen *intelScreen;
+
+   // LunarG : ADD
+   // Give us a place to store our compile results
+   struct gl_shader_program *shader_prog;
 };
 
 
index b2caf05a3b981f54d539ec0f9ae9dfe891a1db20..d2128ab79409a8ed3fb6c2599c5fe6c68e84e112 100644 (file)
@@ -3386,18 +3386,9 @@ brw_fs_precompile(struct gl_context *ctx, struct gl_shader_program *prog)
       return false;
    }
 
-   if (brw->ctx.Const.DeferLinkProgram) {
-      brw_shader_program_save_wm_compile(prog, c);
-   }
-   else {
-      uint32_t old_prog_offset = brw->wm.base.prog_offset;
-      struct brw_wm_prog_data *old_prog_data = brw->wm.prog_data;
-
-//      brw_wm_upload_compile(brw, c);
-
-      brw->wm.base.prog_offset = old_prog_offset;
-      brw->wm.prog_data = old_prog_data;
-   }
+   // Rather than defer or upload to cache, hand off
+   // the compile results back to the brw_context
+   brw_shader_program_save_wm_compile(brw->shader_prog, c);
 
    brw_wm_clear_compile(brw, c);
 
index 5e5ef509b4108e46e105879cd89bdaeef8902e6e..047306b3aca847da71f449ed5dacf1fba85f8bb7 100644 (file)
@@ -73,6 +73,24 @@ brw_shader_program(struct gl_shader_program *prog)
    return (struct brw_shader_program *) prog;
 }
 
+struct brw_wm_prog_data *get_wm_prog_data(struct gl_shader_program *prog)
+{
+   struct brw_shader_program *brw_prog = (struct brw_shader_program *) prog;
+   return &brw_prog->wm.data;
+}
+
+const unsigned *get_wm_program(struct gl_shader_program *prog)
+{
+    struct brw_shader_program *brw_prog = (struct brw_shader_program *) prog;
+    return brw_prog->wm.program;
+}
+
+unsigned get_wm_program_size(struct gl_shader_program *prog)
+{
+    struct brw_shader_program *brw_prog = (struct brw_shader_program *) prog;
+    return brw_prog->wm.program_size;
+}
+
 struct gl_shader *
 brw_new_shader(struct gl_context *ctx, GLuint name, GLuint type)
 {
@@ -83,7 +101,8 @@ brw_new_shader(struct gl_context *ctx, GLuint name, GLuint type)
       shader->base.Type = type;
       shader->base.Stage = _mesa_shader_enum_to_shader_stage(type);
       shader->base.Name = name;
-//      _mesa_init_shader(ctx, &shader->base);
+      // LunarG: Removed
+      //_mesa_init_shader(ctx, &shader->base);
    }
 
    return &shader->base;
index e8fc884f71521cc6fc606f62811951c6874f5856..65176375fe5ee3a7d408b83e03bd0e1edd3e7c50 100644 (file)
@@ -139,8 +139,6 @@ struct brw_vs_compile;
 struct brw_gs_compile;
 struct brw_wm_compile;
 
-GLboolean brw_link_shader(struct gl_context *ctx, struct gl_shader_program *prog);
-
 const struct brw_shader_program_precompile_key *
 brw_shader_program_get_precompile_key(struct gl_shader_program *shader_prog);
 
@@ -168,6 +166,15 @@ bool
 brw_shader_program_restore_wm_compile(struct gl_shader_program *shader_prog,
                                       struct brw_wm_compile *c);
 
+// LunarG : ADD
+// Exposing some functions that were abstracted away, would be good to put them back
+struct gl_shader_program *brw_new_shader_program(struct gl_context *ctx, GLuint name);
+struct brw_shader_program *get_brw_shader_program(struct gl_shader_program *prog);
+GLboolean brw_link_shader(struct gl_context *ctx, struct gl_shader_program *prog);
+struct brw_wm_prog_data *get_wm_prog_data(struct gl_shader_program *prog);
+const unsigned *get_wm_program(struct gl_shader_program *prog);
+unsigned get_wm_program_size(struct gl_shader_program *prog);
+
 #ifdef __cplusplus
 }
 #endif
index 0c5258440df18c667d9cb7244fb06e29e477bb10..b3102f7f4ad669f728353970701107b117f7f15f 100644 (file)
@@ -135,9 +135,11 @@ const unsigned *brw_wm_fs_emit(struct brw_context *brw,
                                unsigned *final_assembly_size);
 
 void brw_notify_link_shader(struct gl_context *ctx, struct gl_shader_program *prog);
+// LunarG : TODO - find a way to call these as they were
 //GLboolean brw_link_shader(struct gl_context *ctx, struct gl_shader_program *prog);
 struct gl_shader *brw_new_shader(struct gl_context *ctx, GLuint name, GLuint type);
-struct gl_shader_program *brw_new_shader_program(struct gl_context *ctx, GLuint name);
+// LunarG : TODO - find a way to call these as they were
+//struct gl_shader_program *brw_new_shader_program(struct gl_context *ctx, GLuint name);
 
 bool brw_color_buffer_write_enabled(struct brw_context *brw);
 void brw_wm_debug_recompile(struct brw_context *brw,
index 1f07b27308f49cdc80f71fcc5fb30a24b06c3996..b518fe65665551b0e7743606d3829603cc7451b7 100644 (file)
 
 #include "xgl.h"  // for XGL_RESULT
 #include "shader.h"
+#include "pipeline.h"
 #include "compiler/shader/compiler_interface.h"
 #include "compiler/pipeline/pipeline_compiler_interface.h"
 #include "compiler/pipeline/brw_context.h"
 #include "compiler/pipeline/brw_shader.h"
 #include "compiler/mesa-utils/src/mesa/main/context.h"
+#include "compiler/mesa-utils/src/glsl/ralloc.h"
 #include "compiler/pipeline/brw_device_info.h"
+#include "compiler/pipeline/brw_wm.h"
 
 
 void initialize_brw_context(struct brw_context *brw)
@@ -86,6 +89,14 @@ void initialize_brw_context(struct brw_context *brw)
     //brw->intelScreen->vec4_reg_set
     //brw->intelScreen->wm_reg_sets
 
+
+    brw->shader_prog = brw_new_shader_program(&brw->ctx, 0);
+}
+
+static inline void pipeline_destroy_compile(struct brw_context *brw) {
+    delete brw->intelScreen->devinfo;
+    delete brw->intelScreen;
+    ralloc_free(brw->shader_prog);
 }
 
 extern "C" {
@@ -94,38 +105,57 @@ extern "C" {
 XGL_RESULT intel_pipeline_shader_compile(struct intel_pipeline_shader *pipe_shader,
                                          const struct intel_shader *shader)
 {
-    // first take at standalone backend compile
-    switch(shader->ir->shader_program->Shaders[0]->Type) {
-    case GL_FRAGMENT_SHADER:
-        {
+    XGL_RESULT status = XGL_SUCCESS;
 
-            // create a brw_context
-            struct brw_context local_brw;
-            struct brw_context *brw = &local_brw;
+    // create a brw_context
+    struct brw_context local_brw;
+    struct brw_context *brw = &local_brw;
 
-            initialize_brw_context(brw);
+    // allocate sub structures on the stack
+    initialize_brw_context(brw);
 
-            // LunarG : TODO - should this have been set for us somewhere?
-            shader->ir->shader_program->Type =
-                    shader->ir->shader_program->Shaders[0]->Stage;
+    // LunarG : TODO - should this have been set for us somewhere?
+    shader->ir->shader_program->Type =
+            shader->ir->shader_program->Shaders[0]->Stage;
 
-            brw_link_shader(&brw->ctx, shader->ir->shader_program);
-            //brw_fs_precompile(ctx, shader->ir->shader_program);
+    if (brw_link_shader(&brw->ctx, shader->ir->shader_program)) {
+
+        // first take at standalone backend compile
+        switch(shader->ir->shader_program->Shaders[0]->Type) {
+        case GL_FRAGMENT_SHADER:
+        {
+            // Start pulling bits out of our compile result.
+            // see upload_ps_state() for references about what I believe each of these values are
+            // Note that they will currently be overwritten by pipeline_shader_copy_ir
+            // to allow the triangle to continue rendering
+            // I would prefer to find a way to pull this data out without exposing
+            // the internals of the compiler, but it hasn't presented itself yet
+            struct brw_wm_prog_data *data = get_wm_prog_data(brw->shader_prog);
+            pipe_shader->pCode = (void*)get_wm_program(brw->shader_prog);
+            pipe_shader->codeSize = get_wm_program_size(brw->shader_prog);
+            pipe_shader->out_count;  // this appears to not be hooked up for FS
+            pipe_shader->surface_count = data->base.binding_table.size_bytes / 4;
+            pipe_shader->urb_grf_start = data->first_curbe_grf;
         }
 
-        break;
+            break;
 
-    case GL_VERTEX_SHADER:
-    case GL_GEOMETRY_SHADER:
-    case GL_COMPUTE_SHADER:
-    default:
+        case GL_VERTEX_SHADER:
+        case GL_GEOMETRY_SHADER:
+        case GL_COMPUTE_SHADER:
+        default:
+            assert(0);
+            status = XGL_ERROR_BAD_PIPELINE_DATA;
+        }
+    } else {
         assert(0);
-        return XGL_ERROR_BAD_PIPELINE_DATA;
+        status = XGL_ERROR_BAD_PIPELINE_DATA;
     }
 
-    return XGL_SUCCESS;
+    pipeline_destroy_compile(brw);
+
+    return status;
 }
 
-// note - free ctx, brw_context, devinfo, and screen
 
 } // extern "C"
index bd6d262ee462c684586feb8ebdb52b208316fd20..7685c9913700ecbbab019d5278e8ba2b983d0918 100644 (file)
@@ -33,6 +33,8 @@
 #include "compiler/shader/program.h"
 #include "compiler/mesa-utils/src/mesa/main/context.h"
 #include "compiler/shader/standalone_scaffolding.h"
+#include "compiler/pipeline/brw_wm.h"
+#include "compiler/pipeline/brw_shader.h"
 
 void initialize_mesa_context_to_defaults(struct gl_context *ctx)
 {
@@ -150,12 +152,10 @@ struct gl_shader_program *shader_create_program(struct intel_shader *sh,
     _mesa_create_shader_compiler();
     initialize_mesa_context_to_defaults(ctx);
 
-    struct gl_shader_program *shader_program;
-
-    shader_program = rzalloc (NULL, struct gl_shader_program);
+    struct gl_shader_program *shader_program = brw_new_shader_program(ctx, 0);
     assert(shader_program != NULL);
-    shader_program->InfoLog = ralloc_strdup(shader_program, "");
 
+    shader_program->InfoLog = ralloc_strdup(shader_program, "");
     shader_program->Shaders =
     reralloc(shader_program, shader_program->Shaders,
         struct gl_shader *, shader_program->NumShaders + 1);