Mesa (master): ilo: no binding table change when constants are pushed

Chia-I Wu olv at kemper.freedesktop.org
Tue Aug 13 11:25:25 UTC 2013


Module: Mesa
Branch: master
Commit: 0f8a86682f311615e5a74ddd7d480fa0c7ac6f7d
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=0f8a86682f311615e5a74ddd7d480fa0c7ac6f7d

Author: Chia-I Wu <olvaffe at gmail.com>
Date:   Tue Aug 13 16:11:27 2013 +0800

ilo: no binding table change when constants are pushed

When constants can be pushed, and nothing else requires new SURFACE_STATEs,
there is no need to emit BINDING_TABLE_STATE.

---

 src/gallium/drivers/ilo/ilo_3d_pipeline_gen6.c |   38 ++++++++++-------------
 1 files changed, 17 insertions(+), 21 deletions(-)

diff --git a/src/gallium/drivers/ilo/ilo_3d_pipeline_gen6.c b/src/gallium/drivers/ilo/ilo_3d_pipeline_gen6.c
index dca4931..245efa2 100644
--- a/src/gallium/drivers/ilo/ilo_3d_pipeline_gen6.c
+++ b/src/gallium/drivers/ilo/ilo_3d_pipeline_gen6.c
@@ -1005,40 +1005,34 @@ gen6_pipeline_state_surfaces_const(struct ilo_3d_pipeline *p,
 {
    const struct ilo_cbuf_state *cbuf = &ilo->cbuf[shader_type];
    uint32_t *surface_state;
+   bool *binding_table_changed;
    int offset, count, i;
-   bool skip = false;
+
+   if (!DIRTY(CBUF))
+      return;
 
    /* SURFACE_STATEs for constant buffers */
    switch (shader_type) {
    case PIPE_SHADER_VERTEX:
-      if (DIRTY(CBUF)) {
-         offset = ILO_VS_CONST_SURFACE(0);
-         surface_state = &p->state.vs.SURFACE_STATE[offset];
-
-         session->binding_table_vs_changed = true;
-      }
-      else {
-         skip = true;
-      }
+      offset = ILO_VS_CONST_SURFACE(0);
+      surface_state = &p->state.vs.SURFACE_STATE[offset];
+      binding_table_changed = &session->binding_table_vs_changed;
       break;
    case PIPE_SHADER_FRAGMENT:
-      if (DIRTY(CBUF)) {
-         offset = ILO_WM_CONST_SURFACE(0);
-         surface_state = &p->state.wm.SURFACE_STATE[offset];
-
-         session->binding_table_fs_changed = true;
-      }
-      else {
-         skip = true;
-      }
+      offset = ILO_WM_CONST_SURFACE(0);
+      surface_state = &p->state.wm.SURFACE_STATE[offset];
+      binding_table_changed = &session->binding_table_fs_changed;
       break;
    default:
-      skip = true;
+      return;
       break;
    }
 
-   if (skip)
+   /* constants are pushed via PCB */
+   if (cbuf->enabled_mask == 0x1 && !cbuf->cso[0].resource) {
+      memset(surface_state, 0, ILO_MAX_CONST_BUFFERS * 4);
       return;
+   }
 
    count = util_last_bit(cbuf->enabled_mask);
    for (i = 0; i < count; i++) {
@@ -1055,6 +1049,8 @@ gen6_pipeline_state_surfaces_const(struct ilo_3d_pipeline *p,
 
    if (count && session->num_surfaces[shader_type] < offset + count)
       session->num_surfaces[shader_type] = offset + count;
+
+   *binding_table_changed = true;
 }
 
 static void




More information about the mesa-commit mailing list