summaryrefslogtreecommitdiffstats
path: root/src/mesa
diff options
context:
space:
mode:
Diffstat (limited to 'src/mesa')
-rw-r--r--src/mesa/drivers/dri/i965/brw_ff_gs.c20
-rw-r--r--src/mesa/drivers/dri/i965/brw_ff_gs.h3
-rw-r--r--src/mesa/drivers/dri/i965/brw_gs.c22
-rw-r--r--src/mesa/drivers/dri/i965/brw_gs.h5
-rw-r--r--src/mesa/drivers/dri/i965/brw_state.h7
-rw-r--r--src/mesa/drivers/dri/i965/brw_state_upload.c35
-rw-r--r--src/mesa/drivers/dri/i965/brw_vs.c31
-rw-r--r--src/mesa/drivers/dri/i965/brw_vs.h3
-rw-r--r--src/mesa/drivers/dri/i965/brw_wm.c44
-rw-r--r--src/mesa/drivers/dri/i965/brw_wm.h3
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