svga: avoid emitting redundant DXSetSamplers command
authorCharmaine Lee <charmainel@vmware.com>
Tue, 16 Aug 2016 01:35:28 +0000 (18:35 -0700)
committerBrian Paul <brianp@vmware.com>
Fri, 26 Aug 2016 12:19:52 +0000 (06:19 -0600)
This patch avoid emitting redundant DXSetSamplers command.

Tested with Lightsmark2008, Heaven, MTT piglit, glretrace, viewperf.

Reviewed-by: Brian Paul <brianp@vmware.com>
src/gallium/drivers/svga/svga_context.c
src/gallium/drivers/svga/svga_state_sampler.c

index d422aec..7ac90f7 100644 (file)
@@ -232,6 +232,8 @@ struct pipe_context *svga_context_create(struct pipe_screen *screen,
 
    memset(&svga->state.hw_draw, 0xcd, sizeof(svga->state.hw_draw));
    memset(&svga->state.hw_draw.views, 0x0, sizeof(svga->state.hw_draw.views));
+   memset(&svga->state.hw_draw.num_samplers, 0,
+      sizeof(svga->state.hw_draw.num_samplers));
    memset(&svga->state.hw_draw.num_sampler_views, 0,
       sizeof(svga->state.hw_draw.num_sampler_views));
    svga->state.hw_draw.num_views = 0;
index 2f0f838..216ab81 100644 (file)
@@ -304,6 +304,7 @@ update_samplers(struct svga_context *svga, unsigned dirty )
       const unsigned count = svga->curr.num_samplers[shader];
       SVGA3dSamplerId ids[PIPE_MAX_SAMPLERS];
       unsigned i;
+      unsigned nsamplers;
 
       for (i = 0; i < count; i++) {
          if (svga->curr.sampler[shader][i]) {
@@ -315,20 +316,25 @@ update_samplers(struct svga_context *svga, unsigned dirty )
          }
       }
 
-      if (count > 0) {
+      for (; i < svga->state.hw_draw.num_samplers[shader]; i++) {
+         ids[i] = SVGA3D_INVALID_ID;
+      }
+
+      nsamplers = MAX2(svga->state.hw_draw.num_samplers[shader], count);
+      if (nsamplers > 0) {
          if (count != svga->state.hw_draw.num_samplers[shader] ||
              memcmp(ids, svga->state.hw_draw.samplers[shader],
                     count * sizeof(ids[0])) != 0) {
             /* HW state is really changing */
             ret = SVGA3D_vgpu10_SetSamplers(svga->swc,
-                                            count,
+                                            nsamplers,
                                             0,                       /* start */
                                             svga_shader_type(shader), /* type */
                                             ids);
             if (ret != PIPE_OK)
                return ret;
             memcpy(svga->state.hw_draw.samplers[shader], ids,
-                   count * sizeof(ids[0]));
+                   nsamplers * sizeof(ids[0]));
             svga->state.hw_draw.num_samplers[shader] = count;
          }
       }
@@ -344,11 +350,20 @@ update_samplers(struct svga_context *svga, unsigned dirty )
          return PIPE_OK; /* probably out of memory */
       }
 
-      ret = SVGA3D_vgpu10_SetSamplers(svga->swc,
-                                      1, /* count */
-                                      unit, /* start */
-                                      SVGA3D_SHADERTYPE_PS,
-                                      &sampler->id);
+      if (svga->state.hw_draw.samplers[PIPE_SHADER_FRAGMENT][unit]
+          != sampler->id) {
+         ret = SVGA3D_vgpu10_SetSamplers(svga->swc,
+                                         1, /* count */
+                                         unit, /* start */
+                                         SVGA3D_SHADERTYPE_PS,
+                                         &sampler->id);
+         if (ret != PIPE_OK)
+            return ret;
+
+         /* save the polygon stipple sampler in the hw draw state */
+         svga->state.hw_draw.samplers[PIPE_SHADER_FRAGMENT][unit] =
+            sampler->id;
+      }
    }
 
    return ret;