xgl: move to new resource binding model
All except layout(set=) is supported. The change to
pipeline_compiler_interface.{cpp,h} is ugly and fragile. It should be fixed
after adding layout(set=) support.
diff --git a/icd/intel/cmd_pipeline.c b/icd/intel/cmd_pipeline.c
index c90f9ee..aa03f66 100644
--- a/icd/intel/cmd_pipeline.c
+++ b/icd/intel/cmd_pipeline.c
@@ -27,8 +27,8 @@
*/
#include "genhw/genhw.h"
-#include "dset.h"
#include "buf.h"
+#include "desc.h"
#include "img.h"
#include "mem.h"
#include "pipeline.h"
@@ -1466,35 +1466,16 @@
&rmap->slots[surface_count + i];
const struct intel_sampler *sampler;
- switch (slot->path_len) {
- case 0:
- sampler = NULL;
+ switch (slot->type) {
+ case INTEL_PIPELINE_RMAP_SAMPLER:
+ intel_desc_pool_read_sampler(cmd->dev->desc_pool,
+ &slot->u.sampler, &sampler);
break;
- case INTEL_PIPELINE_RMAP_SLOT_RT:
- case INTEL_PIPELINE_RMAP_SLOT_DYN:
- assert(!"unexpected rmap slot type");
+ case INTEL_PIPELINE_RMAP_UNUSED:
sampler = NULL;
break;
- case 1:
- {
- const struct intel_dset *dset = cmd->bind.dset.graphics;
- const XGL_UINT slot_offset = cmd->bind.dset.graphics_offset;
- const struct intel_dset_slot *dset_slot =
- &dset->slots[slot_offset + slot->u.index];
-
- switch (dset_slot->type) {
- case INTEL_DSET_SLOT_SAMPLER:
- sampler = dset_slot->u.sampler;
- break;
- default:
- assert(!"unexpected dset slot type");
- sampler = NULL;
- break;
- }
- }
- break;
default:
- assert(!"nested descriptor set unsupported");
+ assert(!"unexpected rmap type");
sampler = NULL;
break;
}
@@ -1539,16 +1520,15 @@
for (i = 0; i < surface_count; i++) {
const struct intel_pipeline_rmap_slot *slot = &rmap->slots[i];
+ struct intel_null_view null_view;
+ bool need_null_view = false;
- switch (slot->path_len) {
- case 0:
- offset = 0;
- break;
- case INTEL_PIPELINE_RMAP_SLOT_RT:
+ switch (slot->type) {
+ case INTEL_PIPELINE_RMAP_RT:
{
const struct intel_rt_view *view =
- (slot->u.index < cmd->bind.render_pass->fb->rt_count) ?
- cmd->bind.render_pass->fb->rt[slot->u.index] : NULL;
+ (slot->u.rt < cmd->bind.render_pass->fb->rt_count) ?
+ cmd->bind.render_pass->fb->rt[slot->u.rt] : NULL;
if (view) {
offset = cmd_surface_write(cmd, INTEL_CMD_ITEM_SURFACE,
@@ -1559,84 +1539,56 @@
cmd_surface_reloc(cmd, offset, 1, view->img->obj.mem->bo,
view->cmd[1], INTEL_RELOC_WRITE);
} else {
- struct intel_null_view null_view;
- intel_null_view_init(&null_view, cmd->dev);
-
- offset = cmd_surface_write(cmd, INTEL_CMD_ITEM_SURFACE,
- GEN6_ALIGNMENT_SURFACE_STATE,
- null_view.cmd_len, null_view.cmd);
+ need_null_view = true;
}
}
break;
- case INTEL_PIPELINE_RMAP_SLOT_DYN:
+ case INTEL_PIPELINE_RMAP_SURFACE:
{
- const struct intel_buf_view *view =
- cmd->bind.dyn_view.graphics;
+ const int32_t dyn_idx = slot->u.surface.dynamic_offset_index;
+ const struct intel_mem *mem;
+ bool read_only;
+ const uint32_t *cmd_data;
+ uint32_t cmd_len;
- offset = cmd_surface_write(cmd, INTEL_CMD_ITEM_SURFACE,
- GEN6_ALIGNMENT_SURFACE_STATE,
- view->cmd_len, view->cmd);
+ assert(dyn_idx < 0 || dyn_idx <
+ cmd->bind.dset.graphics->layout->dynamic_desc_count);
- cmd_reserve_reloc(cmd, 1);
- cmd_surface_reloc(cmd, offset, 1, view->buf->obj.mem->bo,
- view->cmd[1], INTEL_RELOC_WRITE);
- }
- break;
- case 1:
- {
- const struct intel_dset *dset = cmd->bind.dset.graphics;
- const XGL_UINT slot_offset = cmd->bind.dset.graphics_offset;
- const struct intel_dset_slot *dset_slot =
- &dset->slots[slot_offset + slot->u.index];
- const uint32_t reloc_flags =
- (dset_slot->read_only) ? 0 : INTEL_RELOC_WRITE;
+ intel_desc_pool_read_surface(cmd->dev->desc_pool,
+ &slot->u.surface.offset, stage, &mem,
+ &read_only, &cmd_data, &cmd_len);
+ if (mem) {
+ const uint32_t dynamic_offset = (dyn_idx >= 0) ?
+ cmd->bind.dset.graphics_dynamic_offsets[dyn_idx] : 0;
+ const uint32_t reloc_flags =
+ (read_only) ? 0 : INTEL_RELOC_WRITE;
- switch (dset_slot->type) {
- case INTEL_DSET_SLOT_IMG_VIEW:
offset = cmd_surface_write(cmd, INTEL_CMD_ITEM_SURFACE,
GEN6_ALIGNMENT_SURFACE_STATE,
- dset_slot->u.img_view->cmd_len,
- dset_slot->u.img_view->cmd);
+ cmd_len, cmd_data);
cmd_reserve_reloc(cmd, 1);
- cmd_surface_reloc(cmd, offset, 1,
- dset_slot->u.img_view->img->obj.mem->bo,
- dset_slot->u.img_view->cmd[1], reloc_flags);
- break;
- case INTEL_DSET_SLOT_BUF_VIEW:
- {
- const uint32_t *cmd_data =
- (stage != XGL_SHADER_STAGE_FRAGMENT) ?
- dset_slot->u.buf_view->cmd :
- dset_slot->u.buf_view->fs_cmd;
-
- offset = cmd_surface_write(cmd, INTEL_CMD_ITEM_SURFACE,
- GEN6_ALIGNMENT_SURFACE_STATE,
- dset_slot->u.buf_view->cmd_len,
- cmd_data);
-
- cmd_reserve_reloc(cmd, 1);
- cmd_surface_reloc(cmd, offset, 1,
- dset_slot->u.buf_view->buf->obj.mem->bo,
- cmd_data[1], reloc_flags);
- }
- break;
- case INTEL_DSET_SLOT_SAMPLER:
- assert(0 == cmd->bind.dset.graphics_offset);
-
- offset = cmd_surface_write(cmd, INTEL_CMD_ITEM_SURFACE,
- GEN6_ALIGNMENT_SURFACE_STATE,
- 16, dset_slot->u.sampler->cmd);
- break;
- default:
- assert(!"unexpected dset slot type");
- break;
+ cmd_surface_reloc(cmd, offset, 1, mem->bo,
+ cmd_data[1] + dynamic_offset, reloc_flags);
+ } else {
+ need_null_view = true;
}
}
break;
- default:
- assert(!"nested descriptor set unsupported");
+ case INTEL_PIPELINE_RMAP_UNUSED:
+ need_null_view = true;
break;
+ default:
+ assert(!"unexpected rmap type");
+ need_null_view = true;
+ break;
+ }
+
+ if (need_null_view) {
+ intel_null_view_init(&null_view, cmd->dev);
+ offset = cmd_surface_write(cmd, INTEL_CMD_ITEM_SURFACE,
+ GEN6_ALIGNMENT_SURFACE_STATE,
+ null_view.cmd_len, null_view.cmd);
}
binding_table[i] = offset;
@@ -2899,31 +2851,53 @@
}
static void cmd_bind_graphics_dset(struct intel_cmd *cmd,
- const struct intel_dset *dset,
- XGL_UINT slot_offset)
+ const struct intel_desc_set *dset,
+ const uint32_t *dynamic_offsets)
{
+ const uint32_t size = sizeof(*dynamic_offsets) *
+ dset->layout->dynamic_desc_count;
+
+ if (size > cmd->bind.dset.graphics_dynamic_offset_size) {
+ if (cmd->bind.dset.graphics_dynamic_offsets)
+ icd_free(cmd->bind.dset.graphics_dynamic_offsets);
+
+ cmd->bind.dset.graphics_dynamic_offsets = icd_alloc(size,
+ 4, XGL_SYSTEM_ALLOC_INTERNAL);
+ if (!cmd->bind.dset.graphics_dynamic_offsets) {
+ cmd->result = XGL_ERROR_OUT_OF_MEMORY;
+ return;
+ }
+
+ cmd->bind.dset.graphics_dynamic_offset_size = size;
+ }
+
cmd->bind.dset.graphics = dset;
- cmd->bind.dset.graphics_offset = slot_offset;
+ memcpy(cmd->bind.dset.graphics_dynamic_offsets, dynamic_offsets, size);
}
static void cmd_bind_compute_dset(struct intel_cmd *cmd,
- const struct intel_dset *dset,
- XGL_UINT slot_offset)
+ const struct intel_desc_set *dset,
+ const uint32_t *dynamic_offsets)
{
+ const uint32_t size = sizeof(*dynamic_offsets) *
+ dset->layout->dynamic_desc_count;
+
+ if (size > cmd->bind.dset.compute_dynamic_offset_size) {
+ if (cmd->bind.dset.compute_dynamic_offsets)
+ icd_free(cmd->bind.dset.compute_dynamic_offsets);
+
+ cmd->bind.dset.compute_dynamic_offsets = icd_alloc(size,
+ 4, XGL_SYSTEM_ALLOC_INTERNAL);
+ if (!cmd->bind.dset.compute_dynamic_offsets) {
+ cmd->result = XGL_ERROR_OUT_OF_MEMORY;
+ return;
+ }
+
+ cmd->bind.dset.compute_dynamic_offset_size = size;
+ }
+
cmd->bind.dset.compute = dset;
- cmd->bind.dset.compute_offset = slot_offset;
-}
-
-static void cmd_bind_graphics_dyn_view(struct intel_cmd *cmd,
- const XGL_BUFFER_VIEW_ATTACH_INFO *info)
-{
- cmd->bind.dyn_view.graphics = intel_buf_view(info->view);
-}
-
-static void cmd_bind_compute_dyn_view(struct intel_cmd *cmd,
- const XGL_BUFFER_VIEW_ATTACH_INFO *info)
-{
- cmd->bind.dyn_view.compute = intel_buf_view(info->view);
+ memcpy(cmd->bind.dset.compute_dynamic_offsets, dynamic_offsets, size);
}
static void cmd_bind_vertex_data(struct intel_cmd *cmd,
@@ -3149,41 +3123,18 @@
ICD_EXPORT XGL_VOID XGLAPI xglCmdBindDescriptorSet(
XGL_CMD_BUFFER cmdBuffer,
XGL_PIPELINE_BIND_POINT pipelineBindPoint,
- XGL_UINT index,
XGL_DESCRIPTOR_SET descriptorSet,
- XGL_UINT slotOffset)
+ const XGL_UINT* pUserData)
{
struct intel_cmd *cmd = intel_cmd(cmdBuffer);
- struct intel_dset *dset = intel_dset(descriptorSet);
-
- assert(!index);
+ struct intel_desc_set *dset = intel_desc_set(descriptorSet);
switch (pipelineBindPoint) {
case XGL_PIPELINE_BIND_POINT_COMPUTE:
- cmd_bind_compute_dset(cmd, dset, slotOffset);
+ cmd_bind_compute_dset(cmd, dset, pUserData);
break;
case XGL_PIPELINE_BIND_POINT_GRAPHICS:
- cmd_bind_graphics_dset(cmd, dset, slotOffset);
- break;
- default:
- cmd->result = XGL_ERROR_INVALID_VALUE;
- break;
- }
-}
-
-ICD_EXPORT XGL_VOID XGLAPI xglCmdBindDynamicBufferView(
- XGL_CMD_BUFFER cmdBuffer,
- XGL_PIPELINE_BIND_POINT pipelineBindPoint,
- const XGL_BUFFER_VIEW_ATTACH_INFO* pBufferView)
-{
- struct intel_cmd *cmd = intel_cmd(cmdBuffer);
-
- switch (pipelineBindPoint) {
- case XGL_PIPELINE_BIND_POINT_COMPUTE:
- cmd_bind_compute_dyn_view(cmd, pBufferView);
- break;
- case XGL_PIPELINE_BIND_POINT_GRAPHICS:
- cmd_bind_graphics_dyn_view(cmd, pBufferView);
+ cmd_bind_graphics_dset(cmd, dset, pUserData);
break;
default:
cmd->result = XGL_ERROR_INVALID_VALUE;