ilo: introduce sampler CSO
[mesa.git] / src / gallium / drivers / ilo / ilo_state.c
index 1151242ea578997b418384f24550ac05fa93d88f..ab2a4e9ae10548527f6a53829ea552717c6c1829 100644 (file)
@@ -186,12 +186,13 @@ static void *
 ilo_create_sampler_state(struct pipe_context *pipe,
                          const struct pipe_sampler_state *state)
 {
-   struct pipe_sampler_state *sampler;
+   struct ilo_context *ilo = ilo_context(pipe);
+   struct ilo_sampler_cso *sampler;
 
-   sampler = MALLOC_STRUCT(pipe_sampler_state);
+   sampler = MALLOC_STRUCT(ilo_sampler_cso);
    assert(sampler);
 
-   *sampler = *state;
+   ilo_gpe_init_sampler_cso(ilo->dev, state, sampler);
 
    return sampler;
 }
@@ -201,10 +202,10 @@ bind_samplers(struct ilo_context *ilo,
               unsigned shader, unsigned start, unsigned count,
               void **samplers, bool unbind_old)
 {
-   struct pipe_sampler_state **dst = ilo->sampler[shader].states;
+   const struct ilo_sampler_cso **dst = ilo->sampler[shader].cso;
    unsigned i;
 
-   assert(start + count <= Elements(ilo->sampler[shader].states));
+   assert(start + count <= Elements(ilo->sampler[shader].cso));
 
    if (unbind_old) {
       if (!samplers) {
@@ -237,7 +238,7 @@ bind_samplers(struct ilo_context *ilo,
    if (ilo->sampler[shader].count <= start + count) {
       count += start;
 
-      while (count > 0 && !ilo->sampler[shader].states[count - 1])
+      while (count > 0 && !ilo->sampler[shader].cso[count - 1])
          count--;
 
       ilo->sampler[shader].count = count;
@@ -581,10 +582,9 @@ ilo_set_scissor_states(struct pipe_context *pipe,
                        const struct pipe_scissor_state *scissors)
 {
    struct ilo_context *ilo = ilo_context(pipe);
-   unsigned i;
 
-   for (i = 0; i < num_scissors; i++)
-      ilo->scissor.states[start_slot + i] = scissors[i];
+   ilo_gpe_set_scissor(ilo->dev, start_slot, num_scissors,
+         scissors, &ilo->scissor);
 
    ilo->dirty |= ILO_DIRTY_SCISSOR;
 }
@@ -600,11 +600,17 @@ ilo_set_viewport_states(struct pipe_context *pipe,
    if (viewports) {
       unsigned i;
 
-      for (i = 0; i < num_viewports; i++)
-         ilo->viewport.states[start_slot + i] = viewports[i];
+      for (i = 0; i < num_viewports; i++) {
+         ilo_gpe_set_viewport_cso(ilo->dev, &viewports[i],
+               &ilo->viewport.cso[start_slot + i]);
+      }
 
       if (ilo->viewport.count < start_slot + num_viewports)
          ilo->viewport.count = start_slot + num_viewports;
+
+      /* need to save viewport 0 for util_blitter */
+      if (!start_slot && num_viewports)
+         ilo->viewport.viewport0 = viewports[0];
    }
    else {
       if (ilo->viewport.count <= start_slot + num_viewports &&
@@ -1050,3 +1056,14 @@ ilo_init_state_functions(struct ilo_context *ilo)
    ilo->base.set_compute_resources = ilo_set_compute_resources;
    ilo->base.set_global_binding = ilo_set_global_binding;
 }
+
+void
+ilo_init_states(struct ilo_context *ilo)
+{
+   ilo_gpe_set_scissor_null(ilo->dev, &ilo->scissor);
+}
+
+void
+ilo_cleanup_states(struct ilo_context *ilo)
+{
+}