[Mesa-dev] [PATCH 5/8] i965/vs: Move uses of brw_compile from do_vs_prog to brw_vs_emit.
Kenneth Graunke
kenneth at whitecape.org
Tue Nov 27 00:42:30 PST 2012
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.
---
src/mesa/drivers/dri/i965/brw_vec4.cpp | 16 ++++++++++++----
src/mesa/drivers/dri/i965/brw_vs.c | 8 ++------
src/mesa/drivers/dri/i965/brw_vs.h | 9 +++++----
3 files changed, 19 insertions(+), 14 deletions(-)
diff --git a/src/mesa/drivers/dri/i965/brw_vec4.cpp b/src/mesa/drivers/dri/i965/brw_vec4.cpp
index 7e6e79e..d5f1abe 100644
--- a/src/mesa/drivers/dri/i965/brw_vec4.cpp
+++ b/src/mesa/drivers/dri/i965/brw_vec4.cpp
@@ -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" */
diff --git a/src/mesa/drivers/dri/i965/brw_vs.c b/src/mesa/drivers/dri/i965/brw_vs.c
index b1b7a4f..fc57f8a 100644
--- a/src/mesa/drivers/dri/i965/brw_vs.c
+++ b/src/mesa/drivers/dri/i965/brw_vs.c
@@ -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,
diff --git a/src/mesa/drivers/dri/i965/brw_vs.h b/src/mesa/drivers/dri/i965/brw_vs.h
index d0e260e..7ac1775 100644
--- a/src/mesa/drivers/dri/i965/brw_vs.h
+++ b/src/mesa/drivers/dri/i965/brw_vs.h
@@ -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,
--
1.8.0
More information about the mesa-dev
mailing list