anv: Add pipeline_has_stage guards a few places
authorJason Ekstrand <jason.ekstrand@intel.com>
Thu, 25 Aug 2016 19:22:28 +0000 (12:22 -0700)
committerJason Ekstrand <jason.ekstrand@intel.com>
Tue, 30 Aug 2016 22:08:23 +0000 (15:08 -0700)
All of these worked before because they were depending on prog_data to be
null.  Soon, we won't be able to depend on a nice prog_data pointer and
it's nice to be more explicit anyway.

Signed-off-by: Jason Ekstrand <jason@jlekstrand.net>
Cc: "12.0" <mesa-stable@lists.freedesktop.org>
src/intel/vulkan/anv_cmd_buffer.c
src/intel/vulkan/anv_private.h
src/intel/vulkan/genX_l3.c
src/intel/vulkan/genX_pipeline_util.h

index 380260a330f7224cef2583c3c1610880d1ad3568..6c082aa77efff799e623c494026250d8da11033f 100644 (file)
@@ -738,20 +738,26 @@ anv_cmd_buffer_emit_binding_table(struct anv_cmd_buffer *cmd_buffer,
 {
    struct anv_framebuffer *fb = cmd_buffer->state.framebuffer;
    struct anv_subpass *subpass = cmd_buffer->state.subpass;
-   struct anv_pipeline_bind_map *map;
+   struct anv_pipeline *pipeline;
    uint32_t bias, state_offset;
 
    switch (stage) {
    case  MESA_SHADER_COMPUTE:
-      map = &cmd_buffer->state.compute_pipeline->bindings[stage];
+      pipeline = cmd_buffer->state.compute_pipeline;
       bias = 1;
       break;
    default:
-      map = &cmd_buffer->state.pipeline->bindings[stage];
+      pipeline = cmd_buffer->state.pipeline;
       bias = 0;
       break;
    }
 
+   if (!anv_pipeline_has_stage(pipeline, stage)) {
+      *bt_state = (struct anv_state) { 0, };
+      return VK_SUCCESS;
+   }
+
+   struct anv_pipeline_bind_map *map = &pipeline->bindings[stage];
    if (bias + map->surface_count == 0) {
       *bt_state = (struct anv_state) { 0, };
       return VK_SUCCESS;
@@ -904,13 +910,19 @@ VkResult
 anv_cmd_buffer_emit_samplers(struct anv_cmd_buffer *cmd_buffer,
                              gl_shader_stage stage, struct anv_state *state)
 {
-   struct anv_pipeline_bind_map *map;
+   struct anv_pipeline *pipeline;
 
    if (stage == MESA_SHADER_COMPUTE)
-      map = &cmd_buffer->state.compute_pipeline->bindings[stage];
+      pipeline = cmd_buffer->state.compute_pipeline;
    else
-      map = &cmd_buffer->state.pipeline->bindings[stage];
+      pipeline = cmd_buffer->state.pipeline;
+
+   if (!anv_pipeline_has_stage(pipeline, stage)) {
+      *state = (struct anv_state) { 0, };
+      return VK_SUCCESS;
+   }
 
+   struct anv_pipeline_bind_map *map = &pipeline->bindings[stage];
    if (map->sampler_count == 0) {
       *state = (struct anv_state) { 0, };
       return VK_SUCCESS;
@@ -1077,6 +1089,10 @@ struct anv_state
 anv_cmd_buffer_push_constants(struct anv_cmd_buffer *cmd_buffer,
                               gl_shader_stage stage)
 {
+   /* If we don't have this stage, bail. */
+   if (!anv_pipeline_has_stage(cmd_buffer->state.pipeline, stage))
+      return (struct anv_state) { .offset = 0 };
+
    struct anv_push_constants *data =
       cmd_buffer->state.push_constants[stage];
    const struct brw_stage_prog_data *prog_data =
index 5fcbb92d3482be649d5166ea5563d42b92c11e87..6a8c6fc2bedad51400efd35475a59f2443b6a19d 100644 (file)
@@ -1520,6 +1520,13 @@ struct anv_pipeline {
    } gen9;
 };
 
+static inline bool
+anv_pipeline_has_stage(const struct anv_pipeline *pipeline,
+                       gl_shader_stage stage)
+{
+   return (pipeline->active_stages & mesa_to_vk_shader_stage(stage)) != 0;
+}
+
 static inline const struct brw_vs_prog_data *
 get_vs_prog_data(struct anv_pipeline *pipeline)
 {
index 0d36e3cd4c032fa9409e170c5e786be58496e0f8..8b3b8acb0987a2d73427350faac0704cd2bf4ea6 100644 (file)
@@ -315,10 +315,13 @@ get_pipeline_state_l3_weights(const struct anv_pipeline *pipeline)
    bool needs_dc = false, needs_slm = false;
 
    for (unsigned i = 0; i < MESA_SHADER_STAGES; i++) {
+      if (!anv_pipeline_has_stage(pipeline, i))
+         continue;
+
       const struct brw_stage_prog_data *prog_data = pipeline->prog_data[i];
 
       needs_dc |= pipeline->needs_data_cache;
-      needs_slm |= prog_data && prog_data->total_shared;
+      needs_slm |= prog_data->total_shared;
    }
 
    return get_default_l3_weights(&pipeline->device->info,
index c1ff6dff1797d2c3495140a5c3782d114f7e27bc..62fd01cd4b75c17085905f48c8b47e7a28e70721 100644 (file)
@@ -668,11 +668,15 @@ emit_cb_state(struct anv_pipeline *pipeline,
       blend_state.Entry[i].WriteDisableBlue = true;
    }
 
-   struct anv_pipeline_bind_map *map =
-      &pipeline->bindings[MESA_SHADER_FRAGMENT];
+   uint32_t surface_count = 0;
+   struct anv_pipeline_bind_map *map;
+   if (anv_pipeline_has_stage(pipeline, MESA_SHADER_FRAGMENT)) {
+      map = &pipeline->bindings[MESA_SHADER_FRAGMENT];
+      surface_count = map->surface_count;
+   }
 
    bool has_writeable_rt = false;
-   for (unsigned i = 0; i < map->surface_count; i++) {
+   for (unsigned i = 0; i < surface_count; i++) {
       struct anv_pipeline_binding *binding = &map->surface_to_descriptor[i];
 
       /* All color attachments are at the beginning of the binding table */