r600g,radeonsi: share r600_surface
[mesa.git] / src / gallium / drivers / ilo / ilo_shader.c
index 5f95a19244fa368aa4201348f2f7d3b3c6c43819..480b477181696456c434cd0e101833a68a5da72d 100644 (file)
@@ -273,6 +273,13 @@ ilo_shader_variant_init(struct ilo_shader_variant *variant,
       break;
    }
 
+   /* use PCB unless constant buffer 0 is not in user buffer  */
+   if ((ilo->cbuf[info->type].enabled_mask & 0x1) &&
+       !ilo->cbuf[info->type].cso[0].user_buffer)
+      variant->use_pcb = false;
+   else
+      variant->use_pcb = true;
+
    num_views = ilo->view[info->type].count;
    assert(info->num_samplers <= num_views);
 
@@ -341,6 +348,8 @@ ilo_shader_variant_guess(struct ilo_shader_variant *variant,
       break;
    }
 
+   variant->use_pcb = true;
+
    variant->num_sampler_views = info->num_samplers;
    for (i = 0; i < info->num_samplers; i++) {
       if (info->shadow_samplers & (1 << i)) {
@@ -746,8 +755,9 @@ ilo_shader_create_vs(const struct ilo_dev_info *dev,
    shader = ilo_shader_state_create(precompile, PIPE_SHADER_VERTEX, state);
 
    /* states used in ilo_shader_variant_init() */
-   shader->info.non_orthogonal_states = ILO_DIRTY_VERTEX_SAMPLER_VIEWS |
-                                        ILO_DIRTY_RASTERIZER;
+   shader->info.non_orthogonal_states = ILO_DIRTY_VIEW_VS |
+                                        ILO_DIRTY_RASTERIZER |
+                                        ILO_DIRTY_CBUF;
 
    return shader;
 }
@@ -762,9 +772,10 @@ ilo_shader_create_gs(const struct ilo_dev_info *dev,
    shader = ilo_shader_state_create(precompile, PIPE_SHADER_GEOMETRY, state);
 
    /* states used in ilo_shader_variant_init() */
-   shader->info.non_orthogonal_states = ILO_DIRTY_GEOMETRY_SAMPLER_VIEWS |
+   shader->info.non_orthogonal_states = ILO_DIRTY_VIEW_GS |
                                         ILO_DIRTY_VS |
-                                        ILO_DIRTY_RASTERIZER;
+                                        ILO_DIRTY_RASTERIZER |
+                                        ILO_DIRTY_CBUF;
 
    return shader;
 }
@@ -779,9 +790,10 @@ ilo_shader_create_fs(const struct ilo_dev_info *dev,
    shader = ilo_shader_state_create(precompile, PIPE_SHADER_FRAGMENT, state);
 
    /* states used in ilo_shader_variant_init() */
-   shader->info.non_orthogonal_states = ILO_DIRTY_FRAGMENT_SAMPLER_VIEWS |
+   shader->info.non_orthogonal_states = ILO_DIRTY_VIEW_FS |
                                         ILO_DIRTY_RASTERIZER |
-                                        ILO_DIRTY_FRAMEBUFFER;
+                                        ILO_DIRTY_FB |
+                                        ILO_DIRTY_CBUF;
 
    return shader;
 }
@@ -891,7 +903,7 @@ ilo_shader_select_kernel_routing(struct ilo_shader_state *shader,
 
    /* we are constructing 3DSTATE_SBE here */
    assert(shader->info.dev->gen >= ILO_GEN(6) &&
-          shader->info.dev->gen <= ILO_GEN(7));
+          shader->info.dev->gen <= ILO_GEN(7.5));
 
    assert(kernel);
 
@@ -900,20 +912,36 @@ ilo_shader_select_kernel_routing(struct ilo_shader_state *shader,
       src_semantics = source->shader->out.semantic_names;
       src_indices = source->shader->out.semantic_indices;
       src_len = source->shader->out.count;
+   }
+   else {
+      src_semantics = kernel->in.semantic_names;
+      src_indices = kernel->in.semantic_indices;
+      src_len = kernel->in.count;
+   }
 
+   /* no change */
+   if (kernel->routing_initialized &&
+       routing->source_skip + routing->source_len <= src_len &&
+       kernel->routing_sprite_coord_enable == sprite_coord_enable &&
+       !memcmp(kernel->routing_src_semantics,
+          &src_semantics[routing->source_skip],
+          sizeof(kernel->routing_src_semantics[0]) * routing->source_len) &&
+       !memcmp(kernel->routing_src_indices,
+          &src_indices[routing->source_skip],
+          sizeof(kernel->routing_src_indices[0]) * routing->source_len))
+      return false;
+
+   if (source) {
       /* skip PSIZE and POSITION (how about the optional CLIPDISTs?) */
       assert(src_semantics[0] == TGSI_SEMANTIC_PSIZE);
       assert(src_semantics[1] == TGSI_SEMANTIC_POSITION);
       routing->source_skip = 2;
+
       routing->source_len = src_len - routing->source_skip;
       src_semantics += routing->source_skip;
       src_indices += routing->source_skip;
    }
    else {
-      src_semantics = kernel->in.semantic_names;
-      src_indices = kernel->in.semantic_indices;
-      src_len = kernel->in.count;
-
       routing->source_skip = 0;
       routing->source_len = src_len;
    }
@@ -997,6 +1025,14 @@ ilo_shader_select_kernel_routing(struct ilo_shader_state *shader,
     */
    routing->source_len = max_src_slot + 1;
 
+   /* remember the states of the source */
+   kernel->routing_initialized = true;
+   kernel->routing_sprite_coord_enable = sprite_coord_enable;
+   memcpy(kernel->routing_src_semantics, src_semantics,
+         sizeof(kernel->routing_src_semantics[0]) * routing->source_len);
+   memcpy(kernel->routing_src_indices, src_indices,
+         sizeof(kernel->routing_src_indices[0]) * routing->source_len);
+
    return true;
 }
 
@@ -1036,6 +1072,12 @@ ilo_shader_get_kernel_param(const struct ilo_shader_state *shader,
    case ILO_KERNEL_URB_DATA_START_REG:
       val = kernel->in.start_grf;
       break;
+   case ILO_KERNEL_SKIP_CBUF0_UPLOAD:
+      val = kernel->skip_cbuf0_upload;
+      break;
+   case ILO_KERNEL_PCB_CBUF0_SIZE:
+      val = kernel->pcb.cbuf0_size;
+      break;
 
    case ILO_KERNEL_VS_INPUT_INSTANCEID:
       val = shader->info.has_instanceid;