intel: add support for FF vertex fetch
shaderEntityIndex is used to index pVertexBindingDescriptions instead of
pVertexAttributeDescriptions. Not really sure how that works.
https://cvs.khronos.org/bugzilla/show_bug.cgi?id=12774#c26
diff --git a/icd/intel/cmd_pipeline.c b/icd/intel/cmd_pipeline.c
index cd29da2..00006a5 100644
--- a/icd/intel/cmd_pipeline.c
+++ b/icd/intel/cmd_pipeline.c
@@ -1641,6 +1641,91 @@
}
}
+static void gen6_3DSTATE_VERTEX_BUFFERS(struct intel_cmd *cmd)
+{
+ const struct intel_pipeline *pipeline = cmd->bind.pipeline.graphics;
+ const struct intel_pipeline_rmap *rmap = pipeline->vs.rmap;
+ const struct intel_dset *dset = cmd->bind.dset.graphics;
+ const uint8_t cmd_len = 1 + 4 * pipeline->vb_count;
+ uint32_t *dw;
+ XGL_UINT pos, i;
+
+ CMD_ASSERT(cmd, 6, 7.5);
+
+ if (!pipeline->vb_count)
+ return;
+
+ pos = cmd_batch_pointer(cmd, cmd_len, &dw);
+
+ dw[0] = GEN6_RENDER_CMD(3D, 3DSTATE_VERTEX_BUFFERS) | (cmd_len - 2);
+ dw++;
+ pos++;
+
+ for (i = 0; i < pipeline->vb_count; i++) {
+ const XGL_UINT vb_offset = rmap->rt_count + rmap->resource_count +
+ rmap->uav_count + rmap->sampler_count;
+ const struct intel_pipeline_rmap_slot *slot = (i < rmap->vb_count) ?
+ &rmap->slots[vb_offset + i] : NULL;
+ struct intel_mem_view *view = NULL;
+
+ if (slot) {
+ switch (slot->path_len) {
+ case 1:
+ view = (dset->slots[slot->u.index].type ==
+ INTEL_DSET_SLOT_MEM_VIEW) ?
+ &dset->slots[slot->u.index].u.mem_view : NULL;
+ break;
+ default:
+ break;
+ }
+ }
+
+ assert(pipeline->vb[i].strideInBytes <= 2048);
+
+ dw[0] = i << GEN6_VB_STATE_DW0_INDEX__SHIFT |
+ pipeline->vb[i].strideInBytes;
+
+ if (cmd_gen(cmd) >= INTEL_GEN(7))
+ dw[0] |= GEN7_VB_STATE_DW0_ADDR_MODIFIED;
+
+ switch (pipeline->vb[i].stepRate) {
+ case XGL_VERTEX_INPUT_STEP_RATE_VERTEX:
+ dw[0] |= GEN6_VB_STATE_DW0_ACCESS_VERTEXDATA;
+ dw[3] = 0;
+ break;
+ case XGL_VERTEX_INPUT_STEP_RATE_INSTANCE:
+ dw[0] |= GEN6_VB_STATE_DW0_ACCESS_INSTANCEDATA;
+ dw[3] = 1;
+ break;
+ case XGL_VERTEX_INPUT_STEP_RATE_DRAW:
+ dw[0] |= GEN6_VB_STATE_DW0_ACCESS_INSTANCEDATA;
+ dw[3] = 0;
+ break;
+ default:
+ assert(!"unknown step rate");
+ dw[0] |= GEN6_VB_STATE_DW0_ACCESS_VERTEXDATA;
+ dw[3] = 0;
+ break;
+ }
+
+ if (view) {
+ const uint32_t begin = view->cmd[1];
+ const uint32_t end = view->mem->size - 1;
+
+ cmd_reserve_reloc(cmd, 2);
+ cmd_batch_reloc(cmd, pos + 1, view->mem->bo, begin, 0);
+ cmd_batch_reloc(cmd, pos + 2, view->mem->bo, end, 0);
+ } else {
+ dw[0] |= GEN6_VB_STATE_DW0_IS_NULL;
+ dw[1] = 0;
+ dw[2] = 0;
+ }
+
+ dw += 4;
+ pos += 4;
+ }
+}
+
static void gen6_3DSTATE_VS(struct intel_cmd *cmd)
{
const struct intel_pipeline *pipeline = cmd->bind.pipeline.graphics;
@@ -1751,6 +1836,7 @@
/* 3DSTATE_MULTISAMPLE and 3DSTATE_SAMPLE_MASK */
cmd_batch_write(cmd, msaa->cmd_len, msaa->cmd);
+ gen6_3DSTATE_VERTEX_BUFFERS(cmd);
gen6_3DSTATE_VS(cmd);
}