i965/vs: Move uses of brw_compile from do_vs_prog to brw_vs_emit.
authorKenneth Graunke <kenneth@whitecape.org>
Tue, 27 Nov 2012 07:59:32 +0000 (23:59 -0800)
committerKenneth Graunke <kenneth@whitecape.org>
Thu, 29 Nov 2012 02:15:55 +0000 (18:15 -0800)
The brw_compile structure is closely tied to the Gen4-7 hardware
encoding.  However, do_vs_prog is very generic: it just calls out to
get a compiled program and then uploads it.

This isn't ultimately where we want it, but it's a step in the right
direction: it's now closer to the code generator.

Reviewed-by: Eric Anholt <eric@anholt.net>
Reviewed-by: Anuj Phogat <anuj.phogat@gmail.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 7e6e79e5e7e8ac91acc767c2757f46ec319c0ff0..d5f1abe327076a95748b4b88c7ea57db65b75f0a 100644 (file)
@@ -1127,16 +1127,24 @@ vec4_visitor::run()
 
 extern "C" {
 
-bool
+/**
+ * Compile a vertex shader.
+ *
+ * Returns the final assembly and the program's size.
+ */
+const unsigned *
 brw_vs_emit(struct brw_context *brw,
             struct gl_shader_program *prog,
             struct brw_vs_compile *c,
-            void *mem_ctx)
+            void *mem_ctx,
+            unsigned *final_assembly_size)
 {
    struct intel_context *intel = &brw->intel;
    bool start_busy = false;
    float start_time = 0;
 
+   brw_init_compile(brw, &c->func, mem_ctx);
+
    if (unlikely(INTEL_DEBUG & DEBUG_PERF)) {
       start_busy = (intel->batch.last_bo &&
                     drm_intel_bo_busy(intel->batch.last_bo));
@@ -1174,10 +1182,10 @@ brw_vs_emit(struct brw_context *brw,
    if (!v.run()) {
       prog->LinkStatus = false;
       ralloc_strcat(&prog->InfoLog, v.fail_msg);
-      return false;
+      return NULL;
    }
 
-   return true;
+   return brw_get_program(&c->func, final_assembly_size);
 }
 
 } /* extern "C" */
index b1b7a4f35a58453cec1adb69f28e56bb74218ddc..fc57f8a6727fb157cfe6f256bc6b3ad41aa539a2 100644 (file)
@@ -227,7 +227,6 @@ do_vs_prog(struct brw_context *brw,
 
    mem_ctx = ralloc_context(NULL);
 
-   brw_init_compile(brw, &c.func, mem_ctx);
    c.vp = vp;
 
    /* Allocate the references to the uniforms that will end up in the
@@ -279,7 +278,8 @@ do_vs_prog(struct brw_context *brw,
 
    /* Emit GEN4 code.
     */
-   if (!brw_vs_emit(brw, prog, &c, mem_ctx)) {
+   program = brw_vs_emit(brw, prog, &c, mem_ctx, &program_size);
+   if (program == NULL) {
       ralloc_free(mem_ctx);
       return false;
    }
@@ -306,10 +306,6 @@ do_vs_prog(struct brw_context *brw,
                         c.prog_data.total_scratch * brw->max_vs_threads);
    }
 
-   /* get the program
-    */
-   program = brw_get_program(&c.func, &program_size);
-
    brw_upload_cache(&brw->cache, BRW_VS_PROG,
                    &c.key, sizeof(c.key),
                    program, program_size,
index d0e260e4e81f3900e8dcd11cea4df69358a77dcd..7ac1775c83e32e6453db39faa2394337bbb61bd2 100644 (file)
@@ -103,10 +103,11 @@ struct brw_vs_compile {
    GLuint last_scratch; /**< measured in 32-byte (register size) units */
 };
 
-bool brw_vs_emit(struct brw_context *brw,
-                 struct gl_shader_program *prog,
-                 struct brw_vs_compile *c,
-                 void *mem_ctx);
+const unsigned *brw_vs_emit(struct brw_context *brw,
+                            struct gl_shader_program *prog,
+                            struct brw_vs_compile *c,
+                            void *mem_ctx,
+                            unsigned *program_size);
 bool brw_vs_precompile(struct gl_context *ctx, struct gl_shader_program *prog);
 void brw_vs_debug_recompile(struct brw_context *brw,
                             struct gl_shader_program *prog,