diff options
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_ff_gs.c | 20 | ||||
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_ff_gs.h | 3 | ||||
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_gs.c | 22 | ||||
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_gs.h | 5 | ||||
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_state.h | 7 | ||||
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_state_upload.c | 35 | ||||
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_vs.c | 31 | ||||
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_vs.h | 3 | ||||
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_wm.c | 44 | ||||
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_wm.h | 3 |
10 files changed, 89 insertions, 84 deletions
diff --git a/src/mesa/drivers/dri/i965/brw_ff_gs.c b/src/mesa/drivers/dri/i965/brw_ff_gs.c index 653c4b6deb3..828e383bbd4 100644 --- a/src/mesa/drivers/dri/i965/brw_ff_gs.c +++ b/src/mesa/drivers/dri/i965/brw_ff_gs.c @@ -221,10 +221,18 @@ static void populate_key(struct brw_context *brw, /* Calculate interpolants for triangle and line rasterization. */ -static void +void brw_upload_ff_gs_prog(struct brw_context *brw) { struct brw_ff_gs_prog_key key; + + if (!brw_state_dirty(brw, + _NEW_LIGHT, + BRW_NEW_PRIMITIVE | + BRW_NEW_TRANSFORM_FEEDBACK | + BRW_NEW_VS_PROG_DATA)) + return; + /* Populate the key: */ populate_key(brw, &key); @@ -247,13 +255,3 @@ void gen6_brw_upload_ff_gs_prog(struct brw_context *brw) { brw_upload_ff_gs_prog(brw); } - -const struct brw_tracked_state brw_ff_gs_prog = { - .dirty = { - .mesa = _NEW_LIGHT, - .brw = BRW_NEW_PRIMITIVE | - BRW_NEW_TRANSFORM_FEEDBACK | - BRW_NEW_VS_PROG_DATA, - }, - .emit = brw_upload_ff_gs_prog -}; diff --git a/src/mesa/drivers/dri/i965/brw_ff_gs.h b/src/mesa/drivers/dri/i965/brw_ff_gs.h index a538948e9ac..e4afdab6599 100644 --- a/src/mesa/drivers/dri/i965/brw_ff_gs.h +++ b/src/mesa/drivers/dri/i965/brw_ff_gs.h @@ -112,4 +112,7 @@ void gen6_sol_program(struct brw_ff_gs_compile *c, unsigned num_verts, bool check_edge_flag); void gen6_brw_upload_ff_gs_prog(struct brw_context *brw); +void +brw_upload_ff_gs_prog(struct brw_context *brw); + #endif diff --git a/src/mesa/drivers/dri/i965/brw_gs.c b/src/mesa/drivers/dri/i965/brw_gs.c index c7ebe5f89f8..1fba76a68af 100644 --- a/src/mesa/drivers/dri/i965/brw_gs.c +++ b/src/mesa/drivers/dri/i965/brw_gs.c @@ -292,8 +292,7 @@ do_gs_prog(struct brw_context *brw, return true; } - -static void +void brw_upload_gs_prog(struct brw_context *brw) { struct gl_context *ctx = &brw->ctx; @@ -303,6 +302,13 @@ brw_upload_gs_prog(struct brw_context *brw) struct brw_geometry_program *gp = (struct brw_geometry_program *) brw->geometry_program; + if (!brw_state_dirty(brw, + _NEW_TEXTURE, + BRW_NEW_GEOMETRY_PROGRAM | + BRW_NEW_TRANSFORM_FEEDBACK | + BRW_NEW_VUE_MAP_VS)) + return; + if (gp == NULL) { /* No geometry shader. Vertex data just passes straight through. */ if (brw->state.dirty.brw & BRW_NEW_VUE_MAP_VS) { @@ -358,18 +364,6 @@ brw_upload_gs_prog(struct brw_context *brw) } } - -const struct brw_tracked_state brw_gs_prog = { - .dirty = { - .mesa = _NEW_TEXTURE, - .brw = BRW_NEW_GEOMETRY_PROGRAM | - BRW_NEW_TRANSFORM_FEEDBACK | - BRW_NEW_VUE_MAP_VS, - }, - .emit = brw_upload_gs_prog -}; - - bool brw_gs_precompile(struct gl_context *ctx, struct gl_shader_program *shader_prog, diff --git a/src/mesa/drivers/dri/i965/brw_gs.h b/src/mesa/drivers/dri/i965/brw_gs.h index 5a15fa92018..5f7c437b311 100644 --- a/src/mesa/drivers/dri/i965/brw_gs.h +++ b/src/mesa/drivers/dri/i965/brw_gs.h @@ -26,6 +26,8 @@ #include <stdbool.h> +#include "brw_context.h" + #ifdef __cplusplus extern "C" { #endif @@ -36,6 +38,9 @@ struct gl_program; bool brw_gs_prog_data_compare(const void *a, const void *b); +void +brw_upload_gs_prog(struct brw_context *brw); + #ifdef __cplusplus } /* extern "C" */ #endif diff --git a/src/mesa/drivers/dri/i965/brw_state.h b/src/mesa/drivers/dri/i965/brw_state.h index f195407e882..71210b9410c 100644 --- a/src/mesa/drivers/dri/i965/brw_state.h +++ b/src/mesa/drivers/dri/i965/brw_state.h @@ -152,6 +152,13 @@ extern const struct brw_tracked_state gen8_vertices; extern const struct brw_tracked_state gen8_vf_topology; extern const struct brw_tracked_state gen8_vs_state; +static inline bool +brw_state_dirty(struct brw_context *brw, GLuint mesa_flags, uint64_t brw_flags) +{ + return ((brw->state.dirty.mesa & mesa_flags) | + (brw->state.dirty.brw & brw_flags)) != 0; +} + /* brw_misc_state.c */ void brw_upload_invariant_state(struct brw_context *brw); uint32_t diff --git a/src/mesa/drivers/dri/i965/brw_state_upload.c b/src/mesa/drivers/dri/i965/brw_state_upload.c index 84e5c104bf3..1b848593de6 100644 --- a/src/mesa/drivers/dri/i965/brw_state_upload.c +++ b/src/mesa/drivers/dri/i965/brw_state_upload.c @@ -36,17 +36,17 @@ #include "drivers/common/meta.h" #include "intel_batchbuffer.h" #include "intel_buffers.h" +#include "brw_vs.h" +#include "brw_ff_gs.h" +#include "brw_gs.h" +#include "brw_wm.h" static const struct brw_tracked_state *gen4_atoms[] = { - &brw_vs_prog, /* must do before GS prog, state base address. */ - &brw_ff_gs_prog, /* must do before state base address */ - &brw_interpolation_map, &brw_clip_prog, /* must do before state base address */ &brw_sf_prog, /* must do before state base address */ - &brw_wm_prog, /* must do before state base address */ /* Once all the programs are done, we know how large urb entry * sizes need to be and can decide if we need to change the urb @@ -107,10 +107,6 @@ static const struct brw_tracked_state *gen4_atoms[] = static const struct brw_tracked_state *gen6_atoms[] = { - &brw_vs_prog, /* must do before state base address */ - &brw_gs_prog, /* must do before state base address */ - &brw_wm_prog, /* must do before state base address */ - &gen6_clip_vp, &gen6_sf_vp, @@ -180,10 +176,6 @@ static const struct brw_tracked_state *gen6_atoms[] = static const struct brw_tracked_state *gen7_atoms[] = { - &brw_vs_prog, - &brw_gs_prog, - &brw_wm_prog, - /* Command packets: */ /* must do before binding table pointers, cc state ptrs */ @@ -256,10 +248,6 @@ static const struct brw_tracked_state *gen7_atoms[] = static const struct brw_tracked_state *gen8_atoms[] = { - &brw_vs_prog, - &brw_gs_prog, - &brw_wm_prog, - /* Command packets: */ &gen8_state_base_address, @@ -565,6 +553,19 @@ brw_print_dirty_count(struct dirty_bit_map *bit_map) } } +static void +brw_upload_programs(struct brw_context *brw) +{ + brw_upload_vs_prog(brw); + + if (brw->gen < 6) + brw_upload_ff_gs_prog(brw); + else + brw_upload_gs_prog(brw); + + brw_upload_wm_prog(brw); +} + /*********************************************************************** * Emit all state: */ @@ -619,6 +620,8 @@ void brw_upload_state(struct brw_context *brw) if (brw->gen == 6) intel_emit_post_sync_nonzero_flush(brw); + brw_upload_programs(brw); + if (unlikely(INTEL_DEBUG)) { /* Debug version which enforces various sanity checks on the * state flags which are generated and checked to help ensure diff --git a/src/mesa/drivers/dri/i965/brw_vs.c b/src/mesa/drivers/dri/i965/brw_vs.c index 2d56b749ea3..2aefd35832c 100644 --- a/src/mesa/drivers/dri/i965/brw_vs.c +++ b/src/mesa/drivers/dri/i965/brw_vs.c @@ -409,8 +409,8 @@ brw_setup_vue_key_clip_info(struct brw_context *brw, } } - -static void brw_upload_vs_prog(struct brw_context *brw) +void +brw_upload_vs_prog(struct brw_context *brw) { struct gl_context *ctx = &brw->ctx; struct brw_vs_prog_key key; @@ -420,6 +420,17 @@ static void brw_upload_vs_prog(struct brw_context *brw) struct gl_program *prog = (struct gl_program *) brw->vertex_program; int i; + if (!brw_state_dirty(brw, + _NEW_BUFFERS | + _NEW_LIGHT | + _NEW_POINT | + _NEW_POLYGON | + _NEW_TEXTURE | + _NEW_TRANSFORM, + BRW_NEW_VERTEX_PROGRAM | + BRW_NEW_VS_ATTRIB_WORKAROUNDS)) + return; + memset(&key, 0, sizeof(key)); /* Just upload the program verbatim for now. Always send it all @@ -482,22 +493,6 @@ static void brw_upload_vs_prog(struct brw_context *brw) } } -/* See brw_vs.c: - */ -const struct brw_tracked_state brw_vs_prog = { - .dirty = { - .mesa = _NEW_BUFFERS | - _NEW_LIGHT | - _NEW_POINT | - _NEW_POLYGON | - _NEW_TEXTURE | - _NEW_TRANSFORM, - .brw = BRW_NEW_VERTEX_PROGRAM | - BRW_NEW_VS_ATTRIB_WORKAROUNDS, - }, - .emit = brw_upload_vs_prog -}; - bool brw_vs_precompile(struct gl_context *ctx, struct gl_shader_program *shader_prog, diff --git a/src/mesa/drivers/dri/i965/brw_vs.h b/src/mesa/drivers/dri/i965/brw_vs.h index 93c5389a737..bad0f070236 100644 --- a/src/mesa/drivers/dri/i965/brw_vs.h +++ b/src/mesa/drivers/dri/i965/brw_vs.h @@ -72,6 +72,9 @@ void brw_vs_debug_recompile(struct brw_context *brw, const struct brw_vs_prog_key *key); bool brw_vs_prog_data_compare(const void *a, const void *b); +void +brw_upload_vs_prog(struct brw_context *brw); + #ifdef __cplusplus } /* extern "C" */ diff --git a/src/mesa/drivers/dri/i965/brw_wm.c b/src/mesa/drivers/dri/i965/brw_wm.c index e7939f097cb..a0eda3a8b94 100644 --- a/src/mesa/drivers/dri/i965/brw_wm.c +++ b/src/mesa/drivers/dri/i965/brw_wm.c @@ -582,8 +582,7 @@ static void brw_wm_populate_key( struct brw_context *brw, key->program_string_id = fp->id; } - -static void +void brw_upload_wm_prog(struct brw_context *brw) { struct gl_context *ctx = &brw->ctx; @@ -591,6 +590,24 @@ brw_upload_wm_prog(struct brw_context *brw) struct brw_fragment_program *fp = (struct brw_fragment_program *) brw->fragment_program; + if (!brw_state_dirty(brw, + _NEW_BUFFERS | + _NEW_COLOR | + _NEW_DEPTH | + _NEW_FRAG_CLAMP | + _NEW_HINT | + _NEW_LIGHT | + _NEW_LINE | + _NEW_MULTISAMPLE | + _NEW_POLYGON | + _NEW_STENCIL | + _NEW_TEXTURE, + BRW_NEW_FRAGMENT_PROGRAM | + BRW_NEW_REDUCED_PRIMITIVE | + BRW_NEW_STATS_WM | + BRW_NEW_VUE_MAP_GEOM_OUT)) + return; + brw_wm_populate_key(brw, &key); if (!brw_search_cache(&brw->cache, BRW_CACHE_FS_PROG, @@ -603,26 +620,3 @@ brw_upload_wm_prog(struct brw_context *brw) } brw->wm.base.prog_data = &brw->wm.prog_data->base; } - - -const struct brw_tracked_state brw_wm_prog = { - .dirty = { - .mesa = _NEW_BUFFERS | - _NEW_COLOR | - _NEW_DEPTH | - _NEW_FRAG_CLAMP | - _NEW_HINT | - _NEW_LIGHT | - _NEW_LINE | - _NEW_MULTISAMPLE | - _NEW_POLYGON | - _NEW_STENCIL | - _NEW_TEXTURE, - .brw = BRW_NEW_FRAGMENT_PROGRAM | - BRW_NEW_REDUCED_PRIMITIVE | - BRW_NEW_STATS_WM | - BRW_NEW_VUE_MAP_GEOM_OUT, - }, - .emit = brw_upload_wm_prog -}; - diff --git a/src/mesa/drivers/dri/i965/brw_wm.h b/src/mesa/drivers/dri/i965/brw_wm.h index a12c7d40a0b..f54530f370b 100644 --- a/src/mesa/drivers/dri/i965/brw_wm.h +++ b/src/mesa/drivers/dri/i965/brw_wm.h @@ -83,4 +83,7 @@ void brw_wm_debug_recompile(struct brw_context *brw, const struct brw_wm_prog_key *key); bool brw_wm_prog_data_compare(const void *a, const void *b); +void +brw_upload_wm_prog(struct brw_context *brw); + #endif |