iris: null for non-existent cbufs
authorKenneth Graunke <kenneth@whitecape.org>
Tue, 2 Oct 2018 17:21:57 +0000 (10:21 -0700)
committerKenneth Graunke <kenneth@whitecape.org>
Thu, 21 Feb 2019 18:26:09 +0000 (10:26 -0800)
prevents BTs from being shifted down incorrectly

src/gallium/drivers/iris/iris_context.h
src/gallium/drivers/iris/iris_program.c
src/gallium/drivers/iris/iris_state.c

index 67460fa2669be4688a94bfa6d16c33acfb952ea3..1f553d71fa2d0de9694d945a337db147bff4047f 100644 (file)
@@ -516,6 +516,9 @@ void gen11_init_state(struct iris_context *ice);
 /* iris_program.c */
 const struct shader_info *iris_get_shader_info(const struct iris_context *ice,
                                                gl_shader_stage stage);
+unsigned iris_get_shader_num_ubos(const struct iris_context *ice,
+                                  gl_shader_stage stage);
+
 
 /* iris_program_cache.c */
 
index a0dcaa771755a737e3b371a00ded5b72df488289..b3eea223cc4429ce25d3081a2e0c08c783f4e232 100644 (file)
@@ -532,6 +532,20 @@ iris_get_shader_info(const struct iris_context *ice, gl_shader_stage stage)
    return &nir->info;
 }
 
+// XXX: this function is gross
+unsigned
+iris_get_shader_num_ubos(const struct iris_context *ice, gl_shader_stage stage)
+{
+   const struct iris_uncompiled_shader *ish = ice->shaders.uncompiled[stage];
+
+   if (ish) {
+      const nir_shader *nir = ish->nir;
+      /* see assign_common_binding_table_offsets */
+      return nir->info.num_ubos + (nir->num_uniforms > 0 ? 1 : 0);
+   }
+   return 0;
+}
+
 /**
  * Get the union of TCS output and TES input slots.
  *
index e8a529c7ccc9672668def51453f6bf8036a09b8a..d3ed36bac9a51d875b9e61d4a64619353f0c9bba 100644 (file)
@@ -3180,6 +3180,26 @@ static const uint32_t push_constant_opcodes[] = {
    [MESA_SHADER_COMPUTE]   = 0,
 };
 
+static uint32_t
+use_null_surface(struct iris_batch *batch, struct iris_context *ice)
+{
+   struct iris_bo *state_bo = iris_resource_bo(ice->state.unbound_tex.res);
+
+   iris_use_pinned_bo(batch, state_bo, false);
+
+   return ice->state.unbound_tex.offset;
+}
+
+static uint32_t
+use_null_fb_surface(struct iris_batch *batch, struct iris_context *ice)
+{
+   struct iris_bo *state_bo = iris_resource_bo(ice->state.null_fb.res);
+
+   iris_use_pinned_bo(batch, state_bo, false);
+
+   return ice->state.null_fb.offset;
+}
+
 /**
  * Add a surface to the validation list, as well as the buffer containing
  * the corresponding SURFACE_STATE.
@@ -3209,34 +3229,19 @@ use_sampler_view(struct iris_batch *batch, struct iris_sampler_view *isv)
 }
 
 static uint32_t
-use_const_buffer(struct iris_batch *batch, struct iris_const_buffer *cbuf)
+use_const_buffer(struct iris_batch *batch,
+                 struct iris_context *ice,
+                 struct iris_const_buffer *cbuf)
 {
+   if (!cbuf->surface_state.res)
+      return use_null_surface(batch, ice);
+
    iris_use_pinned_bo(batch, iris_resource_bo(cbuf->data.res), false);
    iris_use_pinned_bo(batch, iris_resource_bo(cbuf->surface_state.res), false);
 
    return cbuf->surface_state.offset;
 }
 
-static uint32_t
-use_null_surface(struct iris_batch *batch, struct iris_context *ice)
-{
-   struct iris_bo *state_bo = iris_resource_bo(ice->state.unbound_tex.res);
-
-   iris_use_pinned_bo(batch, state_bo, false);
-
-   return ice->state.unbound_tex.offset;
-}
-
-static uint32_t
-use_null_fb_surface(struct iris_batch *batch, struct iris_context *ice)
-{
-   struct iris_bo *state_bo = iris_resource_bo(ice->state.null_fb.res);
-
-   iris_use_pinned_bo(batch, state_bo, false);
-
-   return ice->state.null_fb.offset;
-}
-
 static uint32_t
 use_ssbo(struct iris_batch *batch, struct iris_context *ice,
          struct iris_shader_state *shs, int i)
@@ -3330,12 +3335,10 @@ iris_populate_binding_table(struct iris_context *ice,
       push_bt_entry(addr);
    }
 
-   for (int i = 0; i < 1 + info->num_ubos; i++) {
-      struct iris_const_buffer *cbuf = &shs->constbuf[i];
-      if (!cbuf->surface_state.res)
-         break;
+   const int num_ubos = iris_get_shader_num_ubos(ice, stage);
 
-      uint32_t addr = use_const_buffer(batch, cbuf);
+   for (int i = 0; i < num_ubos; i++) {
+      uint32_t addr = use_const_buffer(batch, ice, &shs->constbuf[i]);
       push_bt_entry(addr);
    }