iris: emit 3DSTATE_SAMPLER_STATE_POINTERS
authorKenneth Graunke <kenneth@whitecape.org>
Fri, 12 Jan 2018 06:50:12 +0000 (22:50 -0800)
committerKenneth Graunke <kenneth@whitecape.org>
Thu, 21 Feb 2019 18:26:04 +0000 (10:26 -0800)
src/gallium/drivers/iris/iris_context.h
src/gallium/drivers/iris/iris_state.c

index d4eaab75f4a492190738553942a47cc62ced6214..5adafed600cbf8da77a939eba840daafc73d1c83 100644 (file)
@@ -52,6 +52,12 @@ enum iris_dirty {
    IRIS_DIRTY_MULTISAMPLE              = (1ull << 13),
    IRIS_DIRTY_VERTEX_BUFFERS           = (1ull << 14),
    IRIS_DIRTY_SAMPLE_MASK              = (1ull << 15),
+   IRIS_DIRTY_SAMPLER_STATES_VS        = (1ull << 16),
+   IRIS_DIRTY_SAMPLER_STATES_TCS       = (1ull << 17),
+   IRIS_DIRTY_SAMPLER_STATES_TES       = (1ull << 18),
+   IRIS_DIRTY_SAMPLER_STATES_GS        = (1ull << 19),
+   IRIS_DIRTY_SAMPLER_STATES_PS        = (1ull << 20),
+   IRIS_DIRTY_SAMPLER_STATES_CS        = (1ull << 21),
 };
 
 struct iris_depth_stencil_alpha_state;
index 5da3e791a530c70c9e06215df67dce78f032027a..9291bf449a2c5a97a7d824f425a5aa4b5cfdf827 100644 (file)
@@ -725,6 +725,8 @@ iris_bind_sampler_states(struct pipe_context *ctx,
    for (int i = 0; i < count; i++) {
       ice->state.samplers[stage][start + i] = states[i];
    }
+
+   ice->state.dirty |= IRIS_DIRTY_SAMPLER_STATES_VS << stage;
 }
 
 struct iris_sampler_view {
@@ -1404,6 +1406,30 @@ iris_upload_render_state(struct iris_context *ice,
       }
    }
 
+   for (int stage = 0; stage <= MESA_SHADER_FRAGMENT; stage++) {
+      if (!(dirty & (IRIS_DIRTY_SAMPLER_STATES_VS << stage)))
+         continue;
+
+      // XXX: get sampler count from shader; don't emit them all...
+      const int count = IRIS_MAX_TEXTURE_SAMPLERS;
+
+      uint32_t offset;
+      uint32_t *map = iris_alloc_state(batch,
+                                       count * 4 * GENX(SAMPLER_STATE_length),
+                                       32, &offset);
+
+      for (int i = 0; i < count; i++) {
+         memcpy(map, ice->state.samplers[stage][i]->sampler_state,
+                4 * GENX(SAMPLER_STATE_length));
+         map += GENX(SAMPLER_STATE_length);
+      }
+
+      iris_emit_cmd(batch, GENX(3DSTATE_SAMPLER_STATE_POINTERS_VS), ptr) {
+         ptr._3DCommandSubOpcode = 43 + stage;
+         ptr.PointertoVSSamplerState = offset;
+      }
+   }
+
    if (1) {
       iris_emit_cmd(batch, GENX(3DSTATE_VF_TOPOLOGY), topo) {
          topo.PrimitiveTopologyType =
@@ -1469,9 +1495,6 @@ iris_upload_render_state(struct iris_context *ice,
    3DSTATE_BINDING_TABLE_POINTERS_*
      -> TODO
 
-   3DSTATE_SAMPLER_STATE_POINTERS_*
-     -> TODO
-
    3DSTATE_VS
    3DSTATE_HS
    3DSTATE_TE