svga: avoid emitting redundant SetSamplers() commands
[mesa.git] / src / gallium / drivers / svga / svga_state_sampler.c
index c5d52bbfd149d2165e5477bae729e2cf2188c839..b070f65feaf0643129c7dce7a6e6ad3fd5350dde 100644 (file)
@@ -301,13 +301,21 @@ update_samplers(struct svga_context *svga, unsigned dirty )
       }
 
       if (count > 0) {
-         ret = SVGA3D_vgpu10_SetSamplers(svga->swc,
-                                         count,
-                                         0,                        /* start */
-                                         svga_shader_type(shader), /* type */
-                                         ids);
-         if (ret != PIPE_OK)
-            return ret;
+         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,
+                                            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]));
+            svga->state.hw_draw.num_samplers[shader] = count;
+         }
       }
    }