xgl: move to new resource binding model
authorChia-I Wu <olv@lunarg.com>
Sun, 4 Jan 2015 08:27:24 +0000 (16:27 +0800)
committerCourtney Goeltzenleuchter <courtney@LunarG.com>
Thu, 5 Feb 2015 00:58:09 +0000 (17:58 -0700)
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.

27 files changed:
demos/cube.c
demos/tri.c
icd/intel/CMakeLists.txt
icd/intel/cmd.c
icd/intel/cmd.h
icd/intel/cmd_pipeline.c
icd/intel/compiler/pipeline/pipeline_compiler_interface.cpp
icd/intel/compiler/pipeline/pipeline_compiler_interface.h
icd/intel/desc.c [new file with mode: 0644]
icd/intel/desc.h [new file with mode: 0644]
icd/intel/dev.c
icd/intel/dev.h
icd/intel/dset.c [deleted file]
icd/intel/dset.h [deleted file]
icd/intel/obj.c
icd/intel/pipeline.c
icd/intel/pipeline.h
include/xgl.h
include/xglDbg.h
include/xglLayer.h
tests/render_tests.cpp
tests/xglrenderframework.cpp
tests/xglrenderframework.h
tests/xgltestbinding.cpp
tests/xgltestbinding.h
xgl-generate.py
xgl.py

index 1b6a07e..ad3ba5d 100644 (file)
@@ -232,8 +232,9 @@ struct demo {
         XGL_BUFFER_VIEW_ATTACH_INFO attach;
     } uniform_data;
 
-    XGL_DESCRIPTOR_SET dset;
-
+    XGL_DESCRIPTOR_SET_LAYOUT desc_layout_vs;
+    XGL_DESCRIPTOR_SET_LAYOUT desc_layout_fs;
+    XGL_DESCRIPTOR_SET_LAYOUT *desc_layout_last;
     XGL_PIPELINE pipeline;
 
     XGL_DYNAMIC_VP_STATE_OBJECT viewport;
@@ -251,6 +252,9 @@ struct demo {
 
     XGL_CMD_BUFFER cmd;
 
+    XGL_DESCRIPTOR_REGION desc_region;
+    XGL_DESCRIPTOR_SET desc_set;
+
     xcb_window_t window;
     xcb_intern_atom_reply_t *atom_wm_delete_window;
 
@@ -316,7 +320,7 @@ static void demo_draw_build_cmd(struct demo *demo)
     xglCmdBindPipeline(demo->cmd, XGL_PIPELINE_BIND_POINT_GRAPHICS,
                                   demo->pipeline);
     xglCmdBindDescriptorSet(demo->cmd, XGL_PIPELINE_BIND_POINT_GRAPHICS,
-            0, demo->dset, 0);
+            demo->desc_set, NULL);
 
     xglCmdBindDynamicStateObject(demo->cmd, XGL_STATE_BIND_VIEWPORT, demo->viewport);
     xglCmdBindDynamicStateObject(demo->cmd, XGL_STATE_BIND_RASTER, demo->raster);
@@ -874,36 +878,40 @@ void demo_prepare_cube_data_buffer(struct demo *demo)
     demo->uniform_data.attach.view = demo->uniform_data.view;
 }
 
-static void demo_prepare_descriptor_set(struct demo *demo)
+static void demo_prepare_descriptor_layout(struct demo *demo)
 {
-    const XGL_DESCRIPTOR_SET_CREATE_INFO descriptor_set = {
-        .sType = XGL_STRUCTURE_TYPE_DESCRIPTOR_SET_CREATE_INFO,
+    const XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO descriptor_layout_vs = {
+        .sType = XGL_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,
         .pNext = NULL,
-        .slots = DEMO_TEXTURE_COUNT * 2 + 2,
+        .descriptorType = XGL_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
+        .count = 1,
+        .stageFlags = XGL_SHADER_STAGE_FLAGS_VERTEX_BIT,
+        .immutableSampler = XGL_NULL_HANDLE,
     };
+    const XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO descriptor_layout_fs = {
+        .sType = XGL_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,
+        .pNext = NULL,
+        .descriptorType = XGL_DESCRIPTOR_TYPE_SAMPLER_TEXTURE,
+        .count = DEMO_TEXTURE_COUNT,
+        .stageFlags = XGL_SHADER_STAGE_FLAGS_FRAGMENT_BIT,
+        .immutableSampler = XGL_NULL_HANDLE,
+    };
+    const uint32_t bind_point = 0;
     XGL_RESULT err;
 
-    err = xglCreateDescriptorSet(demo->device, &descriptor_set, &demo->dset);
+    err = xglCreateDescriptorSetLayout(demo->device,
+            XGL_SHADER_STAGE_FLAGS_VERTEX_BIT, &bind_point,
+            XGL_NULL_HANDLE, &descriptor_layout_vs,
+            &demo->desc_layout_vs);
     assert(!err);
 
-    xglBeginDescriptorSetUpdate(demo->dset);
-    xglClearDescriptorSetSlots(demo->dset, 0, DEMO_TEXTURE_COUNT * 2 + 2);
-
-//    xglAttachMemoryViewDescriptors(demo->dset, 0, 1, &demo->vertices.view);
-
-    xglAttachBufferViewDescriptors(demo->dset, 0, 1, &demo->uniform_data.attach);
-
-    XGL_IMAGE_VIEW_ATTACH_INFO image_view;
-
-    image_view.sType = XGL_STRUCTURE_TYPE_IMAGE_VIEW_ATTACH_INFO;
-    image_view.pNext = NULL;
-    image_view.view = demo->textures[0].view;
-    image_view.layout = XGL_IMAGE_LAYOUT_GENERAL;
-
-    xglAttachSamplerDescriptors(demo->dset, 1, 1, &demo->textures[0].sampler);
-    xglAttachImageViewDescriptors(demo->dset, 2, 1, &image_view);
+    err = xglCreateDescriptorSetLayout(demo->device,
+            XGL_SHADER_STAGE_FLAGS_FRAGMENT_BIT, &bind_point,
+            demo->desc_layout_vs, &descriptor_layout_fs,
+            &demo->desc_layout_fs);
+    assert(!err);
 
-    xglEndDescriptorSetUpdate(demo->dset);
+    demo->desc_layout_last = &demo->desc_layout_fs;
 }
 
 static XGL_SHADER demo_prepare_shader(struct demo *demo,
@@ -1047,12 +1055,11 @@ static void demo_prepare_pipeline(struct demo *demo)
     XGL_PIPELINE_SHADER_STAGE_CREATE_INFO fs;
     XGL_PIPELINE_VP_STATE_CREATE_INFO vp;
     XGL_PIPELINE_MS_STATE_CREATE_INFO ms;
-    XGL_DESCRIPTOR_SLOT_INFO vs_slots[3];
-    XGL_DESCRIPTOR_SLOT_INFO fs_slots[3];
     XGL_RESULT err;
 
     memset(&pipeline, 0, sizeof(pipeline));
     pipeline.sType = XGL_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
+    pipeline.lastSetLayout = *demo->desc_layout_last;
 
     memset(&ia, 0, sizeof(ia));
     ia.sType = XGL_STRUCTURE_TYPE_PIPELINE_IA_STATE_CREATE_INFO;
@@ -1091,39 +1098,17 @@ static void demo_prepare_pipeline(struct demo *demo)
     ds.stencilTestEnable = XGL_FALSE;
     ds.front = ds.back;
 
-    memset(&vs_slots, 0, sizeof(vs_slots));
-    vs_slots[0].slotObjectType = XGL_SLOT_SHADER_RESOURCE;
-    vs_slots[0].shaderEntityIndex = 0;
-
-    memset(&fs_slots, 0, sizeof(fs_slots));
-    fs_slots[1].slotObjectType = XGL_SLOT_SHADER_SAMPLER;
-    fs_slots[1].shaderEntityIndex = 0;
-    fs_slots[2].slotObjectType = XGL_SLOT_SHADER_TEXTURE_RESOURCE;
-    fs_slots[2].shaderEntityIndex = 0;
-
     memset(&vs, 0, sizeof(vs));
     vs.sType = XGL_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
     vs.shader.stage = XGL_SHADER_STAGE_VERTEX;
     vs.shader.shader = demo_prepare_vs(demo);
     assert(vs.shader.shader != NULL);
-    XGL_DESCRIPTOR_SET_MAPPING ds_mapping1;
-    ds_mapping1.descriptorCount = 3;
-    ds_mapping1.pDescriptorInfo = vs_slots;
-    vs.shader.pDescriptorSetMapping = &ds_mapping1;
-    vs.shader.linkConstBufferCount = 0;
-    vs.shader.descriptorSetMappingCount = 1;
 
     memset(&fs, 0, sizeof(fs));
     fs.sType = XGL_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
     fs.shader.stage = XGL_SHADER_STAGE_FRAGMENT;
     fs.shader.shader = demo_prepare_fs(demo);
     assert(fs.shader.shader != NULL);
-    XGL_DESCRIPTOR_SET_MAPPING ds_mapping2;
-    ds_mapping2.descriptorCount = 3;
-    ds_mapping2.pDescriptorInfo = fs_slots;
-    fs.shader.pDescriptorSetMapping = &ds_mapping2;
-    fs.shader.linkConstBufferCount = 0;
-    fs.shader.descriptorSetMappingCount = 1;
 
     memset(&ms, 0, sizeof(ms));
     ms.sType = XGL_STRUCTURE_TYPE_PIPELINE_MS_STATE_CREATE_INFO;
@@ -1193,6 +1178,82 @@ static void demo_prepare_dynamic_states(struct demo *demo)
     assert(!err);
 }
 
+static void demo_prepare_descriptor_region(struct demo *demo)
+{
+    const XGL_DESCRIPTOR_TYPE_COUNT type_counts[2] = {
+        [0] = {
+            .type = XGL_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
+            .count = 1,
+        },
+        [1] = {
+            .type = XGL_DESCRIPTOR_TYPE_SAMPLER_TEXTURE,
+            .count = DEMO_TEXTURE_COUNT,
+        },
+    };
+    const XGL_DESCRIPTOR_REGION_CREATE_INFO descriptor_region = {
+        .sType = XGL_STRUCTURE_TYPE_DESCRIPTOR_REGION_CREATE_INFO,
+        .pNext = NULL,
+        .count = 2,
+        .pTypeCount = type_counts,
+    };
+    XGL_RESULT err;
+
+    err = xglCreateDescriptorRegion(demo->device,
+            XGL_DESCRIPTOR_REGION_USAGE_ONE_SHOT, 1,
+            &descriptor_region, &demo->desc_region);
+    assert(!err);
+}
+
+static void demo_prepare_descriptor_set(struct demo *demo)
+{
+    const XGL_BUFFER_VIEW_ATTACH_INFO *view_info_vs =
+        &demo->uniform_data.attach;
+    XGL_IMAGE_VIEW_ATTACH_INFO view_info[DEMO_TEXTURE_COUNT];
+    XGL_SAMPLER_IMAGE_VIEW_INFO combined_info[DEMO_TEXTURE_COUNT];
+    XGL_UPDATE_SAMPLER_TEXTURES update_fs;
+    XGL_UPDATE_BUFFERS update_vs;
+    XGL_RESULT err;
+    uint32_t count;
+    XGL_UINT i;
+
+    for (i = 0; i < DEMO_TEXTURE_COUNT; i++) {
+        view_info[i].sType = XGL_STRUCTURE_TYPE_IMAGE_VIEW_ATTACH_INFO;
+        view_info[i].pNext = NULL;
+        view_info[i].view = demo->textures[i].view,
+        view_info[i].layout = XGL_IMAGE_LAYOUT_GENERAL;
+
+        combined_info[i].pSampler = demo->textures[i].sampler;
+        combined_info[i].pImageView = &view_info[i];
+    }
+
+    memset(&update_vs, 0, sizeof(update_vs));
+    update_vs.sType = XGL_STRUCTURE_TYPE_UPDATE_BUFFERS;
+    update_vs.pNext = &update_fs;
+    update_vs.descriptorType = XGL_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
+    update_vs.count = 1;
+    update_vs.pBufferViews = &view_info_vs;
+
+    memset(&update_fs, 0, sizeof(update_fs));
+    update_fs.sType = XGL_STRUCTURE_TYPE_UPDATE_SAMPLER_TEXTURES;
+    update_fs.index = 1;
+    update_fs.count = DEMO_TEXTURE_COUNT;
+    update_fs.pSamplerImageViews = combined_info;
+
+    err = xglAllocDescriptorSets(demo->desc_region,
+            XGL_DESCRIPTOR_SET_USAGE_STATIC,
+            1, demo->desc_layout_last,
+            &demo->desc_set, &count);
+    assert(!err && count == 1);
+
+    xglBeginDescriptorRegionUpdate(demo->device,
+            XGL_DESCRIPTOR_UPDATE_MODE_FASTEST);
+
+    xglClearDescriptorSets(demo->desc_region, 1, &demo->desc_set);
+    xglUpdateDescriptors(demo->desc_set, &update_vs);
+
+    xglEndDescriptorRegionUpdate(demo->device, demo->cmd);
+}
+
 static void demo_prepare(struct demo *demo)
 {
     const XGL_CMD_BUFFER_CREATE_INFO cmd = {
@@ -1207,13 +1268,16 @@ static void demo_prepare(struct demo *demo)
     demo_prepare_depth(demo);
     demo_prepare_textures(demo);
     demo_prepare_cube_data_buffer(demo);
-    demo_prepare_descriptor_set(demo);
 
+    demo_prepare_descriptor_layout(demo);
     demo_prepare_pipeline(demo);
     demo_prepare_dynamic_states(demo);
 
     err = xglCreateCommandBuffer(demo->device, &cmd, &demo->cmd);
     assert(!err);
+
+    demo_prepare_descriptor_region(demo);
+    demo_prepare_descriptor_set(demo);
 }
 
 static void demo_handle_event(struct demo *demo,
@@ -1420,6 +1484,9 @@ static void demo_cleanup(struct demo *demo)
 {
     XGL_UINT i;
 
+    xglDestroyObject(demo->desc_set);
+    xglDestroyObject(demo->desc_region);
+
     xglDestroyObject(demo->cmd);
 
     xglDestroyObject(demo->viewport);
@@ -1428,8 +1495,8 @@ static void demo_cleanup(struct demo *demo)
     xglDestroyObject(demo->depth_stencil);
 
     xglDestroyObject(demo->pipeline);
-
-    xglDestroyObject(demo->dset);
+    xglDestroyObject(demo->desc_layout_fs);
+    xglDestroyObject(demo->desc_layout_vs);
 
 //    xglFreeMemory(demo->vertices.mem);
 
index 8d74698..ee085dc 100644 (file)
@@ -64,8 +64,7 @@ struct demo {
         XGL_VERTEX_INPUT_ATTRIBUTE_DESCRIPTION vi_attrs[2];
     } vertices;
 
-    XGL_DESCRIPTOR_SET dset;
-
+    XGL_DESCRIPTOR_SET_LAYOUT desc_layout;
     XGL_PIPELINE pipeline;
 
     XGL_DYNAMIC_VP_STATE_OBJECT viewport;
@@ -75,6 +74,9 @@ struct demo {
 
     XGL_CMD_BUFFER cmd;
 
+    XGL_DESCRIPTOR_REGION desc_region;
+    XGL_DESCRIPTOR_SET desc_set;
+
     xcb_window_t window;
     xcb_intern_atom_reply_t *atom_wm_delete_window;
 
@@ -140,7 +142,7 @@ static void demo_draw_build_cmd(struct demo *demo)
     xglCmdBindPipeline(demo->cmd, XGL_PIPELINE_BIND_POINT_GRAPHICS,
                                   demo->pipeline);
     xglCmdBindDescriptorSet(demo->cmd, XGL_PIPELINE_BIND_POINT_GRAPHICS,
-            0, demo->dset, 0);
+            demo->desc_set, NULL);
 
     xglCmdBindDynamicStateObject(demo->cmd, XGL_STATE_BIND_VIEWPORT, demo->viewport);
     xglCmdBindDynamicStateObject(demo->cmd, XGL_STATE_BIND_RASTER, demo->raster);
@@ -543,37 +545,24 @@ static void demo_prepare_vertices(struct demo *demo)
     demo->vertices.vi_attrs[1].offsetInBytes = sizeof(float) * 3;
 }
 
-static void demo_prepare_descriptor_set(struct demo *demo)
+static void demo_prepare_descriptor_layout(struct demo *demo)
 {
-    const XGL_DESCRIPTOR_SET_CREATE_INFO descriptor_set = {
-        .sType = XGL_STRUCTURE_TYPE_DESCRIPTOR_SET_CREATE_INFO,
+    const XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO descriptor_layout = {
+        .sType = XGL_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,
         .pNext = NULL,
-        .slots = DEMO_TEXTURE_COUNT * 2,
+        .descriptorType = XGL_DESCRIPTOR_TYPE_SAMPLER_TEXTURE,
+        .count = DEMO_TEXTURE_COUNT,
+        .stageFlags = XGL_SHADER_STAGE_FLAGS_FRAGMENT_BIT,
+        .immutableSampler = XGL_NULL_HANDLE,
     };
+    const uint32_t bind_point = 0;
     XGL_RESULT err;
-    XGL_UINT i;
 
-    err = xglCreateDescriptorSet(demo->device, &descriptor_set, &demo->dset);
+    err = xglCreateDescriptorSetLayout(demo->device,
+            XGL_SHADER_STAGE_FLAGS_ALL, &bind_point,
+            XGL_NULL_HANDLE, &descriptor_layout,
+            &demo->desc_layout);
     assert(!err);
-
-    xglBeginDescriptorSetUpdate(demo->dset);
-    xglClearDescriptorSetSlots(demo->dset, 0, DEMO_TEXTURE_COUNT * 2);
-
-    for (i = 0; i < DEMO_TEXTURE_COUNT; i++) {
-        const XGL_IMAGE_VIEW_ATTACH_INFO image_view = {
-            .sType = XGL_STRUCTURE_TYPE_IMAGE_VIEW_ATTACH_INFO,
-            .pNext = NULL,
-            .view = demo->textures[i].view,
-           .layout = XGL_IMAGE_LAYOUT_GENERAL,
-        };
-
-        xglAttachSamplerDescriptors(demo->dset, 2 * i, 1,
-                &demo->textures[i].sampler);
-        xglAttachImageViewDescriptors(demo->dset, 2 * i + 1, 1,
-                &image_view);
-    }
-
-    xglEndDescriptorSetUpdate(demo->dset);
 }
 
 static XGL_SHADER demo_prepare_shader(struct demo *demo,
@@ -653,12 +642,11 @@ static void demo_prepare_pipeline(struct demo *demo)
     XGL_PIPELINE_SHADER_STAGE_CREATE_INFO fs;
     XGL_PIPELINE_VP_STATE_CREATE_INFO vp;
     XGL_PIPELINE_MS_STATE_CREATE_INFO ms;
-    XGL_DESCRIPTOR_SLOT_INFO fs_slots[DEMO_TEXTURE_COUNT * 2];
     XGL_RESULT err;
-    XGL_UINT i;
 
     memset(&pipeline, 0, sizeof(pipeline));
     pipeline.sType = XGL_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
+    pipeline.lastSetLayout = demo->desc_layout;
 
     vi = demo->vertices.vi;
 
@@ -701,30 +689,16 @@ static void demo_prepare_pipeline(struct demo *demo)
     ds.stencilTestEnable = XGL_FALSE;
     ds.front = ds.back;
 
-    memset(&fs_slots, 0, sizeof(fs_slots));
-    for (i = 0; i < DEMO_TEXTURE_COUNT; i++) {
-        fs_slots[2 * i].slotObjectType = XGL_SLOT_SHADER_SAMPLER;
-        fs_slots[2 * i].shaderEntityIndex = i;
-        fs_slots[2 * i + 1].slotObjectType = XGL_SLOT_SHADER_TEXTURE_RESOURCE;
-        fs_slots[2 * i + 1].shaderEntityIndex = i;
-    }
-
     memset(&vs, 0, sizeof(vs));
     vs.sType = XGL_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
     vs.shader.stage = XGL_SHADER_STAGE_VERTEX;
     vs.shader.shader = demo_prepare_vs(demo);
     vs.shader.linkConstBufferCount = 0;
-    vs.shader.descriptorSetMappingCount = 0;
 
     memset(&fs, 0, sizeof(fs));
     fs.sType = XGL_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
     fs.shader.stage = XGL_SHADER_STAGE_FRAGMENT;
     fs.shader.shader = demo_prepare_fs(demo);
-    XGL_DESCRIPTOR_SET_MAPPING ds_mapping;
-    ds_mapping.descriptorCount = DEMO_TEXTURE_COUNT * 2;
-    ds_mapping.pDescriptorInfo = fs_slots;
-    fs.shader.descriptorSetMappingCount = 1;
-    fs.shader.pDescriptorSetMapping = &ds_mapping;
 
     memset(&ms, 0, sizeof(ms));
     ms.sType = XGL_STRUCTURE_TYPE_PIPELINE_MS_STATE_CREATE_INFO;
@@ -796,6 +770,65 @@ static void demo_prepare_dynamic_states(struct demo *demo)
     assert(!err);
 }
 
+static void demo_prepare_descriptor_region(struct demo *demo)
+{
+    const XGL_DESCRIPTOR_TYPE_COUNT type_count = {
+        .type = XGL_DESCRIPTOR_TYPE_SAMPLER_TEXTURE,
+        .count = DEMO_TEXTURE_COUNT,
+    };
+    const XGL_DESCRIPTOR_REGION_CREATE_INFO descriptor_region = {
+        .sType = XGL_STRUCTURE_TYPE_DESCRIPTOR_REGION_CREATE_INFO,
+        .pNext = NULL,
+        .count = 1,
+        .pTypeCount = &type_count,
+    };
+    XGL_RESULT err;
+
+    err = xglCreateDescriptorRegion(demo->device,
+            XGL_DESCRIPTOR_REGION_USAGE_ONE_SHOT, 1,
+            &descriptor_region, &demo->desc_region);
+    assert(!err);
+}
+
+static void demo_prepare_descriptor_set(struct demo *demo)
+{
+    XGL_IMAGE_VIEW_ATTACH_INFO view_info[DEMO_TEXTURE_COUNT];
+    XGL_SAMPLER_IMAGE_VIEW_INFO combined_info[DEMO_TEXTURE_COUNT];
+    XGL_UPDATE_SAMPLER_TEXTURES update;
+    XGL_RESULT err;
+    uint32_t count;
+    XGL_UINT i;
+
+    for (i = 0; i < DEMO_TEXTURE_COUNT; i++) {
+        view_info[i].sType = XGL_STRUCTURE_TYPE_IMAGE_VIEW_ATTACH_INFO;
+        view_info[i].pNext = NULL;
+        view_info[i].view = demo->textures[i].view,
+        view_info[i].layout = XGL_IMAGE_LAYOUT_GENERAL;
+
+        combined_info[i].pSampler = demo->textures[i].sampler;
+        combined_info[i].pImageView = &view_info[i];
+    }
+
+    memset(&update, 0, sizeof(update));
+    update.sType = XGL_STRUCTURE_TYPE_UPDATE_SAMPLER_TEXTURES;
+    update.count = DEMO_TEXTURE_COUNT;
+    update.pSamplerImageViews = combined_info;
+
+    err = xglAllocDescriptorSets(demo->desc_region,
+            XGL_DESCRIPTOR_SET_USAGE_STATIC,
+            1, &demo->desc_layout,
+            &demo->desc_set, &count);
+    assert(!err && count == 1);
+
+    xglBeginDescriptorRegionUpdate(demo->device,
+            XGL_DESCRIPTOR_UPDATE_MODE_FASTEST);
+
+    xglClearDescriptorSets(demo->desc_region, 1, &demo->desc_set);
+    xglUpdateDescriptors(demo->desc_set, &update);
+
+    xglEndDescriptorRegionUpdate(demo->device, demo->cmd);
+}
+
 static void demo_prepare(struct demo *demo)
 {
     const XGL_CMD_BUFFER_CREATE_INFO cmd = {
@@ -810,13 +843,15 @@ static void demo_prepare(struct demo *demo)
     demo_prepare_depth(demo);
     demo_prepare_textures(demo);
     demo_prepare_vertices(demo);
-    demo_prepare_descriptor_set(demo);
-
+    demo_prepare_descriptor_layout(demo);
     demo_prepare_pipeline(demo);
     demo_prepare_dynamic_states(demo);
 
     err = xglCreateCommandBuffer(demo->device, &cmd, &demo->cmd);
     assert(!err);
+
+    demo_prepare_descriptor_region(demo);
+    demo_prepare_descriptor_set(demo);
 }
 
 static void demo_handle_event(struct demo *demo,
@@ -989,6 +1024,9 @@ static void demo_cleanup(struct demo *demo)
 {
     XGL_UINT i;
 
+    xglDestroyObject(demo->desc_set);
+    xglDestroyObject(demo->desc_region);
+
     xglDestroyObject(demo->cmd);
 
     xglDestroyObject(demo->viewport);
@@ -997,8 +1035,7 @@ static void demo_cleanup(struct demo *demo)
     xglDestroyObject(demo->depth_stencil);
 
     xglDestroyObject(demo->pipeline);
-
-    xglDestroyObject(demo->dset);
+    xglDestroyObject(demo->desc_layout);
 
     xglBindObjectMemory(demo->vertices.buf, XGL_NULL_HANDLE, 0);
     xglDestroyObject(demo->vertices.buf);
index b3474af..1548e1d 100644 (file)
@@ -18,8 +18,8 @@ set(sources
     cmd_mi.c
     cmd_prepare.c
     cmd_pipeline.c
+    desc.c
     dev.c
-    dset.c
     intel.c
     intel_gpa.c
     event.c
index 494ed69..46305a5 100644 (file)
@@ -233,6 +233,11 @@ static void cmd_reset(struct intel_cmd *cmd)
     if (cmd->bind.shader_cache.entries)
         icd_free(cmd->bind.shader_cache.entries);
 
+    if (cmd->bind.dset.graphics_dynamic_offsets)
+        icd_free(cmd->bind.dset.graphics_dynamic_offsets);
+    if (cmd->bind.dset.compute_dynamic_offsets)
+        icd_free(cmd->bind.dset.compute_dynamic_offsets);
+
     memset(&cmd->bind, 0, sizeof(cmd->bind));
 
     cmd->reloc_used = 0;
index 2298187..1415bc1 100644 (file)
@@ -41,7 +41,7 @@ struct intel_raster_state;
 struct intel_msaa_state;
 struct intel_blend_state;
 struct intel_ds_state;
-struct intel_dset;
+struct intel_desc_set;
 
 struct intel_cmd_item;
 struct intel_cmd_reloc;
@@ -169,18 +169,15 @@ struct intel_cmd_bind {
     } state;
 
     struct {
-        const struct intel_dset *graphics;
-        XGL_UINT graphics_offset;
-        const struct intel_dset *compute;
-        XGL_UINT compute_offset;
+        const struct intel_desc_set *graphics;
+        uint32_t *graphics_dynamic_offsets;
+        size_t graphics_dynamic_offset_size;
+        const struct intel_desc_set *compute;
+        uint32_t *compute_dynamic_offsets;
+        size_t compute_dynamic_offset_size;
     } dset;
 
     struct {
-        struct intel_buf_view *graphics;
-        struct intel_buf_view *compute;
-    } dyn_view;
-
-    struct {
         const struct intel_buf *buf[INTEL_MAX_VERTEX_BINDING_COUNT];
         XGL_GPU_SIZE offset[INTEL_MAX_VERTEX_BINDING_COUNT];
     } vertex;
index c90f9ee..aa03f66 100644 (file)
@@ -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 @@ static uint32_t emit_samplers(struct intel_cmd *cmd,
             &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 @@ static uint32_t emit_binding_table(struct intel_cmd *cmd,
 
     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,86 +1539,58 @@ static uint32_t emit_binding_table(struct intel_cmd *cmd,
                     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;
-
-                offset = cmd_surface_write(cmd, INTEL_CMD_ITEM_SURFACE,
-                        GEN6_ALIGNMENT_SURFACE_STATE,
-                        view->cmd_len, view->cmd);
+                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;
+
+                assert(dyn_idx < 0 || dyn_idx <
+                        cmd->bind.dset.graphics->layout->dynamic_desc_count);
+
+                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;
 
-                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;
-
-                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;
+        case INTEL_PIPELINE_RMAP_UNUSED:
+            need_null_view = true;
+            break;
         default:
-            assert(!"nested descriptor set unsupported");
+            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_compute_delta(struct intel_cmd *cmd,
 }
 
 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)
 {
-    cmd->bind.dset.compute = dset;
-    cmd->bind.dset.compute_offset = slot_offset;
-}
+    const uint32_t size = sizeof(*dynamic_offsets) *
+        dset->layout->dynamic_desc_count;
 
-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);
-}
+    if (size > cmd->bind.dset.compute_dynamic_offset_size) {
+        if (cmd->bind.dset.compute_dynamic_offsets)
+            icd_free(cmd->bind.dset.compute_dynamic_offsets);
 
-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);
+        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;
+    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 xglCmdBindDynamicStateObject(
 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)
-{
-    struct intel_cmd *cmd = intel_cmd(cmdBuffer);
-    struct intel_dset *dset = intel_dset(descriptorSet);
-
-    assert(!index);
-
-    switch (pipelineBindPoint) {
-    case XGL_PIPELINE_BIND_POINT_COMPUTE:
-        cmd_bind_compute_dset(cmd, dset, slotOffset);
-        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)
+    const XGL_UINT*                             pUserData)
 {
     struct intel_cmd *cmd = intel_cmd(cmdBuffer);
+    struct intel_desc_set *dset = intel_desc_set(descriptorSet);
 
     switch (pipelineBindPoint) {
     case XGL_PIPELINE_BIND_POINT_COMPUTE:
-        cmd_bind_compute_dyn_view(cmd, pBufferView);
+        cmd_bind_compute_dset(cmd, dset, pUserData);
         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;
index da2e91a..e976671 100644 (file)
  *   LunarG
  */
 
+extern "C" {
+#include "desc.h"
 #include "gpu.h"
 #include "shader.h"
 #include "pipeline.h"
+}
+
 #include "compiler/shader/compiler_interface.h"
 #include "compiler/pipeline/pipeline_compiler_interface.h"
 #include "compiler/pipeline/brw_context.h"
 #include "compiler/pipeline/brw_device_info.h"
 #include "compiler/pipeline/brw_wm.h"
 
+struct brw_binding_table {
+    uint32_t count;
+
+    uint32_t rt_start;
+
+    uint32_t texture_start;
+    uint32_t texture_used;
+
+    uint32_t ubo_start;
+};
 
 static void initialize_brw_context(struct brw_context *brw,
                                    const struct intel_gpu *gpu)
@@ -259,202 +273,20 @@ static void fs_data_dump(FILE *fp, struct brw_wm_prog_data* data)
     fflush(fp);
 }
 
-static struct intel_pipeline_rmap_slot *rmap_get_slot(struct intel_pipeline_rmap *rmap,
-                                                      XGL_DESCRIPTOR_SET_SLOT_TYPE type,
-                                                      XGL_UINT index)
-{
-    // The ordering of below offsets is important.  Textures need to come before
-    // buffers with the current compiler conventions.
-    const XGL_UINT texture_resource_offset = rmap->rt_count;
-    const XGL_UINT resource_offset = texture_resource_offset + rmap->texture_resource_count;
-    const XGL_UINT uav_offset = resource_offset + rmap->resource_count;
-    const XGL_UINT sampler_offset = uav_offset + rmap->uav_count;
-    struct intel_pipeline_rmap_slot *slot;
-
-    switch (type) {
-    case XGL_SLOT_UNUSED:
-        slot = NULL;
-        break;
-    case XGL_SLOT_SHADER_TEXTURE_RESOURCE:
-        slot = &rmap->slots[texture_resource_offset + index];
-        break;
-    case XGL_SLOT_SHADER_RESOURCE:
-        slot = &rmap->slots[resource_offset + index];
-        break;
-    case XGL_SLOT_SHADER_UAV:
-        slot = &rmap->slots[uav_offset + index];
-        break;
-    case XGL_SLOT_SHADER_SAMPLER:
-        slot = &rmap->slots[sampler_offset + index];
-        break;
-    default:
-        assert(!"unknown rmap slot type");
-        slot = NULL;
-        break;
-    }
-
-    return slot;
-}
-
-static bool rmap_init_slots_with_path(struct intel_pipeline_rmap *rmap,
-                                      const XGL_DESCRIPTOR_SET_MAPPING *mapping,
-                                      XGL_UINT *nest_path,
-                                      XGL_UINT nest_level)
-{
-    XGL_UINT i;
-
-    for (i = 0; i < mapping->descriptorCount; i++) {
-        const XGL_DESCRIPTOR_SLOT_INFO *info = &mapping->pDescriptorInfo[i];
-        struct intel_pipeline_rmap_slot *slot;
-
-        if (info->slotObjectType == XGL_SLOT_NEXT_DESCRIPTOR_SET) {
-            nest_path[nest_level] = i;
-            if (!rmap_init_slots_with_path(rmap, info->pNextLevelSet,
-                        nest_path, nest_level + 1))
-                return false;
-
-            continue;
-        }
-
-        slot = rmap_get_slot(rmap, info->slotObjectType,
-                info->shaderEntityIndex);
-        if (!slot || slot->path_len)
-            continue;
-
-        slot->path_len = nest_level + 1;
-
-        if (nest_level) {
-            slot->u.path = (XGL_UINT *) icd_alloc(sizeof(slot->u.path[0]) *
-                    slot->path_len, 0, XGL_SYSTEM_ALLOC_INTERNAL);
-            if (!slot->u.path) {
-                slot->path_len = 0;
-                return false;
-            }
-
-            memcpy(slot->u.path, nest_path,
-                    sizeof(slot->u.path[0]) * nest_level);
-            slot->u.path[nest_level] = i;
-        } else {
-            slot->u.index = i;
-        }
-    }
-
-    return true;
-}
-
-static bool rmap_init_slots(struct intel_pipeline_rmap *rmap,
-                            const XGL_DESCRIPTOR_SET_MAPPING *mapping,
-                            XGL_UINT depth)
-{
-    XGL_UINT *nest_path;
-    bool ok;
-
-    if (depth) {
-        nest_path = (XGL_UINT *) icd_alloc(sizeof(nest_path[0]) * depth,
-                0, XGL_SYSTEM_ALLOC_INTERNAL_TEMP);
-        if (!nest_path)
-            return false;
-    } else {
-        nest_path = NULL;
-    }
-
-    ok = rmap_init_slots_with_path(rmap, mapping, nest_path, 0);
-
-    if (nest_path)
-        icd_free(nest_path);
-
-    return ok;
-}
-
-static void rmap_update_count(struct intel_pipeline_rmap *rmap,
-                              XGL_DESCRIPTOR_SET_SLOT_TYPE type,
-                              XGL_UINT index, XGL_UINT rt_count, XGL_UINT ubo_start)
-{
-    rmap->rt_count = rt_count;
-
-    switch (type) {
-    case XGL_SLOT_UNUSED:
-        break;
-    case XGL_SLOT_SHADER_TEXTURE_RESOURCE:
-        if (rmap->texture_resource_count < index + 1)
-            if (index < ubo_start - rt_count)
-                rmap->texture_resource_count = index + 1;
-        break;
-    case XGL_SLOT_SHADER_RESOURCE:
-        if (rmap->resource_count < index + 1)
-            rmap->resource_count = index + 1;
-        break;
-    case XGL_SLOT_SHADER_UAV:
-        if (rmap->uav_count < index + 1)
-            rmap->uav_count = index + 1;
-        break;
-    case XGL_SLOT_SHADER_SAMPLER:
-        if (rmap->sampler_count < index + 1)
-            rmap->sampler_count = index + 1;
-        break;
-    default:
-        assert(!"unknown rmap slot type");
-        break;
-    }
-}
-
-static XGL_UINT rmap_init_counts(struct intel_pipeline_rmap *rmap,
-                                 const XGL_DESCRIPTOR_SET_MAPPING *mapping,
-                                 XGL_UINT rt_count, XGL_UINT ubo_start)
-{
-    XGL_UINT depth = 0;
-    XGL_UINT i;
-
-    for (i = 0; i < mapping->descriptorCount; i++) {
-        const XGL_DESCRIPTOR_SLOT_INFO *info = &mapping->pDescriptorInfo[i];
-
-        if (info->slotObjectType == XGL_SLOT_NEXT_DESCRIPTOR_SET) {
-            const XGL_UINT d = rmap_init_counts(rmap,
-                    info->pNextLevelSet, rt_count, ubo_start);
-            if (depth < d + 1)
-                depth = d + 1;
-
-            continue;
-        }
-
-        rmap_update_count(rmap, info->slotObjectType,
-                info->shaderEntityIndex, rt_count, ubo_start);
-    }
-
-    return depth;
-}
-
 static void rmap_destroy(struct intel_pipeline_rmap *rmap)
 {
-    XGL_UINT i;
-
-    for (i = 0; i < rmap->slot_count; i++) {
-        struct intel_pipeline_rmap_slot *slot = &rmap->slots[i];
-
-        switch (slot->path_len) {
-        case 0:
-        case 1:
-        case INTEL_PIPELINE_RMAP_SLOT_RT:
-        case INTEL_PIPELINE_RMAP_SLOT_DYN:
-            break;
-        default:
-            icd_free(slot->u.path);
-            break;
-        }
-    }
-
     icd_free(rmap->slots);
     icd_free(rmap);
 }
 
 static struct intel_pipeline_rmap *rmap_create(const struct intel_gpu *gpu,
-                                               const XGL_DESCRIPTOR_SET_MAPPING *mapping,
-                                               const XGL_DYNAMIC_BUFFER_VIEW_SLOT_INFO *dyn,
-                                               XGL_UINT rt_count, XGL_UINT ubo_start)
+                                               XGL_PIPELINE_SHADER_STAGE stage,
+                                               const struct intel_desc_layout *layout,
+                                               const struct brw_binding_table *bt)
 {
     struct intel_pipeline_rmap *rmap;
-    struct intel_pipeline_rmap_slot *slot;
-    XGL_UINT depth, rt;
+    struct intel_desc_layout_iter iter;
+    uint32_t surface_count, i;
 
     rmap = (struct intel_pipeline_rmap *)
         icd_alloc(sizeof(*rmap), 0, XGL_SYSTEM_ALLOC_INTERNAL);
@@ -463,13 +295,14 @@ static struct intel_pipeline_rmap *rmap_create(const struct intel_gpu *gpu,
 
     memset(rmap, 0, sizeof(*rmap));
 
-    depth = rmap_init_counts(rmap, mapping, rt_count, ubo_start);
-
-    /* add RTs and the dynamic buffer view */
-    rmap_update_count(rmap, dyn->slotObjectType, dyn->shaderEntityIndex, rt_count, ubo_start);
-
-    rmap->slot_count = rmap->rt_count + rmap->texture_resource_count + rmap->resource_count +
-        rmap->uav_count + rmap->sampler_count;
+    /* Fix the compiler and fix these!  No point in understanding them. */
+    rmap->rt_count = bt->texture_start;
+    rmap->texture_resource_count = bt->ubo_start - bt->texture_start;
+    rmap->uav_count = bt->count - bt->ubo_start;
+    rmap->sampler_count = rmap->texture_resource_count;
+    surface_count = rmap->rt_count + rmap->texture_resource_count +
+        rmap->uav_count;
+    rmap->slot_count = surface_count + rmap->sampler_count;
 
     rmap->slots = (struct intel_pipeline_rmap_slot *)
         icd_alloc(sizeof(rmap->slots[0]) * rmap->slot_count,
@@ -481,21 +314,42 @@ static struct intel_pipeline_rmap *rmap_create(const struct intel_gpu *gpu,
 
     memset(rmap->slots, 0, sizeof(rmap->slots[0]) * rmap->slot_count);
 
-    if (!rmap_init_slots(rmap, mapping, depth)) {
-        rmap_destroy(rmap);
-        return NULL;
+    for (i = 0; i < bt->rt_start; i++)
+        rmap->slots[i].type = INTEL_PIPELINE_RMAP_UNUSED;
+
+    for (i = bt->rt_start; i < bt->texture_start; i++) {
+        rmap->slots[i].type = INTEL_PIPELINE_RMAP_RT;
+        rmap->slots[i].u.rt = i - bt->rt_start;
     }
 
-    /* add RTs and the dynamic buffer view */
-    slot = rmap_get_slot(rmap, dyn->slotObjectType, dyn->shaderEntityIndex);
-    if (slot) {
-        slot->path_len = INTEL_PIPELINE_RMAP_SLOT_DYN;
-        slot->u.index = 0;
+    intel_desc_layout_find_bind_point(layout, stage, 0, 0, &iter);
+    for (i = bt->texture_start; i < bt->ubo_start; i++) {
+        if (bt->texture_used & (1 << (i - bt->texture_start))) {
+            rmap->slots[i].type = INTEL_PIPELINE_RMAP_SURFACE;
+            rmap->slots[i].u.surface.offset = iter.offset_begin;
+            rmap->slots[i].u.surface.dynamic_offset_index = -1;
+
+            rmap->slots[bt->count + i - bt->texture_start].type =
+                INTEL_PIPELINE_RMAP_SAMPLER;
+            rmap->slots[bt->count + i - bt->texture_start].u.sampler =
+                iter.offset_begin;
+        } else {
+            rmap->slots[i].type = INTEL_PIPELINE_RMAP_UNUSED;
+
+            rmap->slots[bt->count + i - bt->texture_start].type =
+                INTEL_PIPELINE_RMAP_UNUSED;;
+        }
+
+        intel_desc_layout_advance_iter(layout, &iter);
     }
-    for (rt = 0; rt < rmap->rt_count; rt++) {
-        slot = &rmap->slots[rt];
-        slot->path_len = INTEL_PIPELINE_RMAP_SLOT_RT;
-        slot->u.index = rt;
+
+    intel_desc_layout_find_bind_point(layout, stage, 0, 0, &iter);
+    for (i = bt->ubo_start; i < bt->count; i++) {
+        rmap->slots[i].type = INTEL_PIPELINE_RMAP_SURFACE;
+        rmap->slots[i].u.surface.offset = iter.offset_begin;
+        rmap->slots[i].u.surface.dynamic_offset_index = -1;
+
+        intel_desc_layout_advance_iter(layout, &iter);
     }
 
     return rmap;
@@ -523,15 +377,19 @@ void intel_destroy_brw_context(struct brw_context *brw)
 // invoke backend compiler to generate ISA and supporting data structures
 XGL_RESULT intel_pipeline_shader_compile(struct intel_pipeline_shader *pipe_shader,
                                          const struct intel_gpu *gpu,
+                                         const struct intel_desc_layout *layout,
                                          const XGL_PIPELINE_SHADER *info)
 {
     const struct intel_ir *ir = intel_shader(info->shader)->ir;
     /* XXX how about constness? */
     struct gl_shader_program *sh_prog = (struct gl_shader_program *) ir;
     XGL_RESULT status = XGL_SUCCESS;
+    struct brw_binding_table bt;
 
     struct brw_context *brw = intel_create_brw_context(gpu);
 
+    memset(&bt, 0, sizeof(bt));
+
     // LunarG : TODO - should this have been set for us somewhere?
     sh_prog->Type = sh_prog->Shaders[0]->Stage;
 
@@ -591,6 +449,11 @@ XGL_RESULT intel_pipeline_shader_compile(struct intel_pipeline_shader *pipe_shad
             pipe_shader->surface_count = data->base.base.binding_table.size_bytes / 4;
             pipe_shader->ubo_start     = data->base.base.binding_table.ubo_start;
 
+            bt.count = data->base.base.binding_table.size_bytes / 4;
+            bt.texture_start = data->base.base.binding_table.texture_start;
+            bt.texture_used = sh_prog->_LinkedShaders[MESA_SHADER_VERTEX]->Program->SamplersUsed;
+            bt.ubo_start = data->base.base.binding_table.ubo_start;
+
             pipe_shader->per_thread_scratch_size = data->base.total_scratch;
 
             if (unlikely(INTEL_DEBUG & DEBUG_VS)) {
@@ -674,6 +537,12 @@ XGL_RESULT intel_pipeline_shader_compile(struct intel_pipeline_shader *pipe_shad
                 }
             }
 
+            bt.count = data->base.binding_table.size_bytes / 4;
+            bt.rt_start = data->binding_table.render_target_start;
+            bt.texture_start = data->base.binding_table.texture_start;
+            bt.texture_used = sh_prog->_LinkedShaders[MESA_SHADER_FRAGMENT]->Program->SamplersUsed;
+            bt.ubo_start = data->base.binding_table.ubo_start;
+
             // Ensure this is 1:1, or create a converter
             pipe_shader->barycentric_interps = data->barycentric_interp_modes;
 
@@ -711,36 +580,8 @@ XGL_RESULT intel_pipeline_shader_compile(struct intel_pipeline_shader *pipe_shad
     }
 
     if (status == XGL_SUCCESS) {
-        XGL_UINT rt_count = 0;
-
-        if (info->stage == XGL_SHADER_STAGE_FRAGMENT) {
-            const struct gl_program *prog =
-                sh_prog->_LinkedShaders[MESA_SHADER_FRAGMENT]->Program;
-
-            rt_count = _mesa_bitcount_64(prog->OutputsWritten &
-                    ~(BITFIELD64_BIT(FRAG_RESULT_DEPTH) |
-                      BITFIELD64_BIT(FRAG_RESULT_SAMPLE_MASK)));
-        }
-
-        XGL_DESCRIPTOR_SET_MAPPING null_map;
-        XGL_DESCRIPTOR_SET_MAPPING *pMapping = info->pDescriptorSetMapping;
-        null_map.descriptorCount = 0;
-
-        if (! info->descriptorSetMappingCount) {
-            pMapping = &null_map;
-        }
-
-        pipe_shader->rmap = rmap_create(gpu,
-                pMapping,
-                &info->dynamicBufferViewMapping,
-                rt_count, pipe_shader->ubo_start);
-
-        if (pipe_shader->rmap) {
-            // Ensure that all textures in descriptor set were consumed.  This
-            // is temporary until we move resource map building to compiler.
-            assert(pipe_shader->ubo_start == rt_count +
-                    pipe_shader->rmap->texture_resource_count);
-        } else {
+        pipe_shader->rmap = rmap_create(gpu, info->stage, layout, &bt);
+        if (!pipe_shader->rmap) {
             intel_pipeline_shader_cleanup(pipe_shader);
             status = XGL_ERROR_OUT_OF_MEMORY;
         }
index ef0d7eb..c65d11d 100644 (file)
@@ -36,6 +36,7 @@ extern "C" {
 #include "dev.h"
 
 struct brw_context;
+struct intel_desc_layout;
 struct intel_gpu;
 struct intel_ir;
 struct intel_pipeline_shader;
@@ -45,6 +46,7 @@ void intel_destroy_brw_context(struct brw_context *brw);
 
 XGL_RESULT intel_pipeline_shader_compile(struct intel_pipeline_shader *ips,
                                          const struct intel_gpu *gpu,
+                                         const struct intel_desc_layout *layout,
                                          const XGL_PIPELINE_SHADER *info);
 
 void intel_pipeline_shader_cleanup(struct intel_pipeline_shader *sh);
diff --git a/icd/intel/desc.c b/icd/intel/desc.c
new file mode 100644 (file)
index 0000000..3ffe151
--- /dev/null
@@ -0,0 +1,1120 @@
+/*
+ * XGL
+ *
+ * Copyright (C) 2015 LunarG, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ * Authors:
+ *   Chia-I Wu <olv@lunarg.com>
+ */
+
+#include "buf.h"
+#include "cmd.h"
+#include "dev.h"
+#include "gpu.h"
+#include "img.h"
+#include "sampler.h"
+#include "view.h"
+#include "desc.h"
+
+enum intel_desc_surface_type {
+    INTEL_DESC_SURFACE_UNUSED,
+    INTEL_DESC_SURFACE_BUF,
+    INTEL_DESC_SURFACE_IMG,
+};
+
+struct intel_desc_surface {
+    const struct intel_mem *mem;
+    bool read_only;
+
+    enum intel_desc_surface_type type;
+    union {
+        const void *unused;
+        const struct intel_buf_view *buf;
+        const struct intel_img_view *img;
+    } u;
+};
+
+struct intel_desc_sampler {
+    const struct intel_sampler *sampler;
+};
+
+static bool desc_pool_init_desc_sizes(struct intel_desc_pool *pool,
+                                      const struct intel_gpu *gpu)
+{
+    pool->surface_desc_size = sizeof(struct intel_desc_surface);
+    pool->sampler_desc_size = sizeof(struct intel_desc_sampler);
+
+    return true;
+}
+
+XGL_RESULT intel_desc_pool_create(struct intel_dev *dev,
+                                  struct intel_desc_pool **pool_ret)
+{
+    const uint32_t surface_count = 16384;
+    const uint32_t sampler_count = 16384;
+    struct intel_desc_pool *pool;
+
+    pool = icd_alloc(sizeof(*pool), 0, XGL_SYSTEM_ALLOC_INTERNAL);
+    if (!pool)
+        return XGL_ERROR_OUT_OF_MEMORY;
+
+    memset(pool, 0, sizeof(*pool));
+
+    if (!desc_pool_init_desc_sizes(pool, dev->gpu)) {
+        icd_free(pool);
+        return XGL_ERROR_UNKNOWN;
+    }
+
+    intel_desc_offset_set(&pool->size,
+            pool->surface_desc_size * surface_count,
+            pool->sampler_desc_size * sampler_count);
+
+    pool->surfaces = icd_alloc(pool->size.surface,
+            64, XGL_SYSTEM_ALLOC_INTERNAL);
+    if (!pool->surfaces) {
+        icd_free(pool);
+        return XGL_ERROR_OUT_OF_MEMORY;
+    }
+
+    pool->samplers = icd_alloc(pool->size.sampler,
+            64, XGL_SYSTEM_ALLOC_INTERNAL);
+    if (!pool->samplers) {
+        icd_free(pool->surfaces);
+        icd_free(pool);
+        return XGL_ERROR_OUT_OF_MEMORY;
+    }
+
+    *pool_ret = pool;
+
+    return XGL_SUCCESS;
+}
+
+void intel_desc_pool_destroy(struct intel_desc_pool *pool)
+{
+    icd_free(pool->samplers);
+    icd_free(pool->surfaces);
+    icd_free(pool);
+}
+
+/**
+ * Get the size of a descriptor in the pool.
+ */
+static XGL_RESULT desc_pool_get_desc_size(const struct intel_desc_pool *pool,
+                                            XGL_DESCRIPTOR_TYPE type,
+                                            struct intel_desc_offset *size)
+{
+    uint32_t surface_size = 0, sampler_size = 0;
+
+    switch (type) {
+    case XGL_DESCRIPTOR_TYPE_SAMPLER:
+        sampler_size = pool->sampler_desc_size;
+        break;
+    case XGL_DESCRIPTOR_TYPE_SAMPLER_TEXTURE:
+        surface_size = pool->surface_desc_size;
+        sampler_size = pool->sampler_desc_size;
+        break;
+    case XGL_DESCRIPTOR_TYPE_TEXTURE:
+    case XGL_DESCRIPTOR_TYPE_TEXTURE_BUFFER:
+    case XGL_DESCRIPTOR_TYPE_IMAGE:
+    case XGL_DESCRIPTOR_TYPE_IMAGE_BUFFER:
+    case XGL_DESCRIPTOR_TYPE_UNIFORM_BUFFER:
+    case XGL_DESCRIPTOR_TYPE_SHADER_STORAGE_BUFFER:
+    case XGL_DESCRIPTOR_TYPE_RAW_BUFFER:
+    case XGL_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC:
+    case XGL_DESCRIPTOR_TYPE_SHADER_STORAGE_BUFFER_DYNAMIC:
+    case XGL_DESCRIPTOR_TYPE_RAW_BUFFER_DYNAMIC:
+        surface_size = pool->surface_desc_size;
+        break;
+    default:
+        assert(!"unknown descriptor type");
+        return XGL_ERROR_INVALID_VALUE;
+        break;
+    }
+
+    intel_desc_offset_set(size, surface_size, sampler_size);
+
+    return XGL_SUCCESS;
+}
+
+XGL_RESULT intel_desc_pool_alloc(struct intel_desc_pool *pool,
+                                 const XGL_DESCRIPTOR_REGION_CREATE_INFO *info,
+                                 struct intel_desc_offset *begin,
+                                 struct intel_desc_offset *end)
+{
+    uint32_t surface_size = 0, sampler_size = 0;
+    struct intel_desc_offset alloc;
+    uint32_t i;
+
+    /* calculate sizes needed */
+    for (i = 0; i < info->count; i++) {
+        const XGL_DESCRIPTOR_TYPE_COUNT *tc = &info->pTypeCount[i];
+        struct intel_desc_offset size;
+        XGL_RESULT ret;
+
+        ret = desc_pool_get_desc_size(pool, tc->type, &size);
+        if (ret != XGL_SUCCESS)
+            return ret;
+
+        surface_size += size.surface * tc->count;
+        sampler_size += size.sampler * tc->count;
+    }
+
+    intel_desc_offset_set(&alloc, surface_size, sampler_size);
+
+    *begin = pool->cur;
+    intel_desc_offset_add(end, &pool->cur, &alloc);
+
+    if (!intel_desc_offset_within(end, &pool->size))
+        return XGL_ERROR_OUT_OF_MEMORY;
+
+    /* increment the writer pointer */
+    pool->cur = *end;
+
+    return XGL_SUCCESS;
+}
+
+static void desc_pool_validate_begin_end(const struct intel_desc_pool *pool,
+                                         const struct intel_desc_offset *begin,
+                                         const struct intel_desc_offset *end)
+{
+    assert(begin->surface % pool->surface_desc_size == 0 &&
+           begin->sampler % pool->sampler_desc_size == 0);
+    assert(end->surface % pool->surface_desc_size == 0 &&
+           end->sampler % pool->sampler_desc_size == 0);
+    assert(intel_desc_offset_within(end, &pool->size));
+}
+
+void intel_desc_pool_free(struct intel_desc_pool *pool,
+                          const struct intel_desc_offset *begin,
+                          const struct intel_desc_offset *end)
+{
+    desc_pool_validate_begin_end(pool, begin, end);
+
+    /* is it ok not to reclaim? */
+}
+
+XGL_RESULT intel_desc_pool_begin_update(struct intel_desc_pool *pool,
+                                        XGL_DESCRIPTOR_UPDATE_MODE mode)
+{
+    /* no-op */
+    return XGL_SUCCESS;
+}
+
+XGL_RESULT intel_desc_pool_end_update(struct intel_desc_pool *pool,
+                                      struct intel_cmd *cmd)
+{
+    /* No pipelined update.  cmd_draw() will do the work. */
+    return XGL_SUCCESS;
+}
+
+void intel_desc_pool_clear(struct intel_desc_pool *pool,
+                           const struct intel_desc_offset *begin,
+                           const struct intel_desc_offset *end)
+{
+    uint32_t i;
+
+    desc_pool_validate_begin_end(pool, begin, end);
+
+    for (i = begin->surface; i < end->surface; i += pool->surface_desc_size) {
+        struct intel_desc_surface *desc = (struct intel_desc_surface *)
+            ((char *) pool->surfaces + i);
+
+        desc->mem = NULL;
+        desc->type = INTEL_DESC_SURFACE_UNUSED;
+        desc->u.unused = NULL;
+    }
+
+    for (i = begin->sampler; i < end->sampler; i += pool->sampler_desc_size) {
+        struct intel_desc_sampler *desc = (struct intel_desc_sampler *)
+            ((char *) pool->samplers + i);
+
+        desc->sampler = NULL;
+    }
+}
+
+void intel_desc_pool_update(struct intel_desc_pool *pool,
+                            const struct intel_desc_offset *begin,
+                            const struct intel_desc_offset *end,
+                            const struct intel_desc_surface *surfaces,
+                            const struct intel_desc_sampler *samplers)
+{
+    desc_pool_validate_begin_end(pool, begin, end);
+
+    if (begin->surface < end->surface) {
+        memcpy((char *) pool->surfaces + begin->surface, surfaces,
+                end->surface - begin->surface);
+    }
+
+    if (begin->sampler < end->sampler) {
+        memcpy((char *) pool->samplers + begin->sampler, samplers,
+                end->sampler - begin->sampler);
+    }
+}
+
+void intel_desc_pool_copy(struct intel_desc_pool *pool,
+                          const struct intel_desc_offset *begin,
+                          const struct intel_desc_offset *end,
+                          const struct intel_desc_offset *src)
+{
+    struct intel_desc_offset src_end;
+    const struct intel_desc_surface *surfaces;
+    const struct intel_desc_sampler *samplers;
+
+    /* no overlap */
+    assert(intel_desc_offset_within(src, begin) ||
+           intel_desc_offset_within(end, src));
+
+    /* no read past pool */
+    intel_desc_offset_sub(&src_end, end, begin);
+    intel_desc_offset_add(&src_end, src, &src_end);
+    assert(intel_desc_offset_within(&src_end, &pool->size));
+
+    surfaces = (const struct intel_desc_surface *)
+        ((const char *) pool->surfaces + src->surface);
+    samplers = (const struct intel_desc_surface *)
+        ((const char *) pool->samplers + src->sampler);
+
+    intel_desc_pool_update(pool, begin, end, surfaces, samplers);
+}
+
+void intel_desc_pool_read_surface(const struct intel_desc_pool *pool,
+                                  const struct intel_desc_offset *offset,
+                                  XGL_PIPELINE_SHADER_STAGE stage,
+                                  const struct intel_mem **mem,
+                                  bool *read_only,
+                                  const uint32_t **cmd,
+                                  uint32_t *cmd_len)
+{
+    const struct intel_desc_surface *desc;
+    struct intel_desc_offset end;
+
+    intel_desc_offset_set(&end,
+            offset->surface + pool->surface_desc_size, offset->sampler);
+    desc_pool_validate_begin_end(pool, offset, &end);
+
+    desc = (const struct intel_desc_surface *)
+        ((const char *) pool->surfaces + offset->surface);
+
+    *mem = desc->mem;
+    *read_only = desc->read_only;
+    switch (desc->type) {
+    case INTEL_DESC_SURFACE_BUF:
+        *cmd = (stage == XGL_SHADER_STAGE_FRAGMENT) ?
+            desc->u.buf->fs_cmd : desc->u.buf->cmd;
+        *cmd_len = desc->u.buf->cmd_len;
+        break;
+    case INTEL_DESC_SURFACE_IMG:
+        *cmd = desc->u.img->cmd;
+        *cmd_len = desc->u.img->cmd_len;
+        break;
+    case INTEL_DESC_SURFACE_UNUSED:
+    default:
+        *cmd = NULL;
+        *cmd_len = 0;
+        break;
+    }
+}
+
+void intel_desc_pool_read_sampler(const struct intel_desc_pool *pool,
+                                  const struct intel_desc_offset *offset,
+                                  const struct intel_sampler **sampler)
+{
+    const struct intel_desc_sampler *desc;
+    struct intel_desc_offset end;
+
+    intel_desc_offset_set(&end,
+            offset->surface, offset->sampler + pool->sampler_desc_size);
+    desc_pool_validate_begin_end(pool, offset, &end);
+
+    desc = (const struct intel_desc_sampler *)
+        ((const char *) pool->samplers + offset->sampler);
+
+    *sampler = desc->sampler;
+}
+
+static void desc_region_destroy(struct intel_obj *obj)
+{
+    struct intel_desc_region *region = intel_desc_region_from_obj(obj);
+
+    intel_desc_region_destroy(region);
+}
+
+XGL_RESULT intel_desc_region_create(struct intel_dev *dev,
+                                    XGL_DESCRIPTOR_REGION_USAGE usage,
+                                    uint32_t max_sets,
+                                    const XGL_DESCRIPTOR_REGION_CREATE_INFO *info,
+                                    struct intel_desc_region **region_ret)
+{
+    struct intel_desc_region *region;
+    XGL_RESULT ret;
+
+    region = (struct intel_desc_region *)
+        intel_base_create(dev, sizeof(*region), dev->base.dbg,
+                XGL_DBG_OBJECT_DESCRIPTOR_REGION, info, 0);
+    if (!region)
+        return XGL_ERROR_OUT_OF_MEMORY;
+
+    region->dev = dev;
+
+    ret = intel_desc_pool_alloc(dev->desc_pool, info,
+            &region->pool_begin, &region->pool_end);
+    if (ret != XGL_SUCCESS) {
+        intel_base_destroy(&region->obj.base);
+        return ret;
+    }
+
+    /* point to head */
+    region->cur = region->pool_begin;
+
+    region->obj.destroy = desc_region_destroy;
+
+    *region_ret = region;
+
+    return XGL_SUCCESS;
+}
+
+void intel_desc_region_destroy(struct intel_desc_region *region)
+{
+    intel_desc_pool_free(region->dev->desc_pool,
+            &region->pool_begin, &region->pool_end);
+    intel_base_destroy(&region->obj.base);
+}
+
+XGL_RESULT intel_desc_region_alloc(struct intel_desc_region *region,
+                                   const struct intel_desc_layout *layout,
+                                   struct intel_desc_offset *begin,
+                                   struct intel_desc_offset *end)
+{
+    *begin = region->cur;
+    intel_desc_offset_add(end, &region->cur, &layout->pool_size);
+
+    if (!intel_desc_offset_within(end, &region->pool_end))
+        return XGL_ERROR_OUT_OF_MEMORY;
+
+    /* increment the writer pointer */
+    region->cur = *end;
+
+    return XGL_SUCCESS;
+}
+
+void intel_desc_region_free_all(struct intel_desc_region *region)
+{
+    /* reset to head */
+    region->cur = region->pool_begin;
+}
+
+static void desc_set_destroy(struct intel_obj *obj)
+{
+    struct intel_desc_set *set = intel_desc_set_from_obj(obj);
+
+    intel_desc_set_destroy(set);
+}
+
+XGL_RESULT intel_desc_set_create(struct intel_dev *dev,
+                                 struct intel_desc_region *region,
+                                 XGL_DESCRIPTOR_SET_USAGE usage,
+                                 const struct intel_desc_layout *layout,
+                                 struct intel_desc_set **set_ret)
+{
+    struct intel_desc_set *set;
+    XGL_RESULT ret;
+
+    set = (struct intel_desc_set *)
+        intel_base_create(dev, sizeof(*set), dev->base.dbg,
+                XGL_DBG_OBJECT_DESCRIPTOR_SET, NULL, 0);
+    if (!set)
+        return XGL_ERROR_OUT_OF_MEMORY;
+
+    set->pool = dev->desc_pool;
+    ret = intel_desc_region_alloc(region, layout,
+            &set->pool_begin, &set->pool_end);
+    if (ret != XGL_SUCCESS) {
+        intel_base_destroy(&set->obj.base);
+        return ret;
+    }
+
+    set->layout = layout;
+
+    set->obj.destroy = desc_set_destroy;
+
+    *set_ret = set;
+
+    return XGL_SUCCESS;
+}
+
+void intel_desc_set_destroy(struct intel_desc_set *set)
+{
+    intel_base_destroy(&set->obj.base);
+}
+
+static void desc_set_update(struct intel_desc_set *set,
+                            const struct intel_desc_layout_iter *iter,
+                            const struct intel_desc_surface *surfaces,
+                            const struct intel_desc_sampler *samplers)
+{
+    struct intel_desc_offset begin, end;
+
+    intel_desc_offset_add(&begin, &set->pool_begin, &iter->offset_begin);
+    intel_desc_offset_add(&end, &set->pool_begin, &iter->offset_end);
+
+    intel_desc_pool_update(set->pool, &begin, &end, surfaces, samplers);
+}
+
+static bool desc_set_img_layout_read_only(XGL_IMAGE_LAYOUT layout)
+{
+    switch (layout) {
+    case XGL_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL:
+    case XGL_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL:
+    case XGL_IMAGE_LAYOUT_TRANSFER_SOURCE_OPTIMAL:
+        return true;
+    default:
+        return false;
+    }
+}
+
+void intel_desc_set_update_samplers(struct intel_desc_set *set,
+                                    const XGL_UPDATE_SAMPLERS *update)
+{
+    struct intel_desc_layout_iter iter;
+    uint32_t i;
+
+    if (!intel_desc_layout_find_index(set->layout, update->index, &iter))
+        return;
+
+    for (i = 0; i < update->count; i++) {
+        const struct intel_sampler *sampler =
+            intel_sampler((XGL_SAMPLER) update->pSamplers[i]);
+        struct intel_desc_sampler desc;
+
+        if (iter.type != XGL_DESCRIPTOR_TYPE_SAMPLER)
+            break;
+
+        desc.sampler = sampler;
+        desc_set_update(set, &iter, NULL, &desc);
+
+        if (!intel_desc_layout_advance_iter(set->layout, &iter))
+            break;
+    }
+}
+
+void intel_desc_set_update_sampler_textures(struct intel_desc_set *set,
+                                            const XGL_UPDATE_SAMPLER_TEXTURES *update)
+{
+    struct intel_desc_layout_iter iter;
+    const struct intel_sampler *immutable_sampler = NULL;
+    uint32_t i;
+
+    if (!intel_desc_layout_find_index(set->layout, update->index, &iter))
+        return;
+
+    for (i = 0; i < update->count; i++) {
+        const struct intel_sampler *sampler =
+            intel_sampler(update->pSamplerImageViews[i].pSampler);
+        const XGL_IMAGE_VIEW_ATTACH_INFO *info =
+            update->pSamplerImageViews[i].pImageView;
+        const struct intel_img_view *view = intel_img_view(info->view);
+        struct intel_desc_surface view_desc;
+        struct intel_desc_sampler sampler_desc;
+
+        if (iter.type != XGL_DESCRIPTOR_TYPE_SAMPLER_TEXTURE)
+            return;
+
+        /* update every immutable sampler once */
+        if (immutable_sampler != iter.range->immutable_sampler) {
+            immutable_sampler = iter.range->immutable_sampler;
+
+            if (immutable_sampler) {
+                struct intel_desc_offset begin, end;
+
+                intel_desc_offset_add(&begin, &set->pool_begin,
+                        &iter.offset_begin);
+                intel_desc_offset_set(&end, begin.surface,
+                        begin.sampler + set->pool->sampler_desc_size);
+
+                sampler_desc.sampler = immutable_sampler;
+                intel_desc_pool_update(set->pool, &begin, &end,
+                        NULL, &sampler_desc);
+            }
+        }
+
+        view_desc.mem = view->img->obj.mem;
+        view_desc.read_only = desc_set_img_layout_read_only(info->layout);
+        view_desc.type = INTEL_DESC_SURFACE_IMG;
+        view_desc.u.img = view;
+
+        sampler_desc.sampler = sampler;
+
+        desc_set_update(set, &iter, &view_desc, &sampler_desc);
+
+        if (!intel_desc_layout_advance_iter(set->layout, &iter))
+            break;
+    }
+}
+
+void intel_desc_set_update_images(struct intel_desc_set *set,
+                                  const XGL_UPDATE_IMAGES *update)
+{
+    struct intel_desc_layout_iter iter;
+    uint32_t i;
+
+    if (!intel_desc_layout_find_index(set->layout, update->index, &iter))
+        return;
+
+    for (i = 0; i < update->count; i++) {
+        const XGL_IMAGE_VIEW_ATTACH_INFO *info = update->pImageViews[i];
+        const struct intel_img_view *view = intel_img_view(info->view);
+        struct intel_desc_surface desc;
+
+        if (iter.type != update->descriptorType)
+            break;
+
+        desc.mem = view->img->obj.mem;
+        desc.read_only = desc_set_img_layout_read_only(info->layout);
+        desc.type = INTEL_DESC_SURFACE_IMG;
+        desc.u.img = view;
+        desc_set_update(set, &iter, &desc, NULL);
+
+        if (!intel_desc_layout_advance_iter(set->layout, &iter))
+            break;
+    }
+}
+
+void intel_desc_set_update_buffers(struct intel_desc_set *set,
+                                   const XGL_UPDATE_BUFFERS *update)
+{
+    struct intel_desc_layout_iter iter;
+    uint32_t i;
+
+    if (!intel_desc_layout_find_index(set->layout, update->index, &iter))
+        return;
+
+    for (i = 0; i < update->count; i++) {
+        const XGL_BUFFER_VIEW_ATTACH_INFO *info = update->pBufferViews[i];
+        const struct intel_buf_view *view = intel_buf_view(info->view);
+        struct intel_desc_surface desc;
+
+        if (iter.type != update->descriptorType)
+            break;
+
+        desc.mem = view->buf->obj.mem;
+        desc.read_only = false;
+        desc.type = INTEL_DESC_SURFACE_BUF;
+        desc.u.buf = view;
+        desc_set_update(set, &iter, &desc, NULL);
+
+        if (!intel_desc_layout_advance_iter(set->layout, &iter))
+            break;
+    }
+}
+
+void intel_desc_set_update_as_copy(struct intel_desc_set *set,
+                                   const XGL_UPDATE_AS_COPY *update)
+{
+    const struct intel_desc_set *src_set =
+        intel_desc_set(update->descriptorSet);
+    struct intel_desc_layout_iter iter, src_iter;
+    struct intel_desc_offset begin, end, src_begin;
+    uint32_t i;
+
+    /* disallow combined sampler textures */
+    if (update->descriptorType == XGL_DESCRIPTOR_TYPE_SAMPLER_TEXTURE)
+        return;
+
+    /* no update->index? */
+    if (!intel_desc_layout_find_index(set->layout, 0, &iter))
+        return;
+    if (!intel_desc_layout_find_index(src_set->layout,
+                update->descriptorIndex, &src_iter))
+        return;
+
+    intel_desc_offset_add(&begin, &set->pool_begin, &iter.offset_begin);
+    intel_desc_offset_add(&src_begin, &src_set->pool_begin,
+            &src_iter.offset_end);
+
+    /* advance to end */
+    for (i = 0; i < update->count; i++) {
+        if (iter.type != update->descriptorType ||
+            src_iter.type != update->descriptorType ||
+            !intel_desc_layout_advance_iter(set->layout, &iter) ||
+            !intel_desc_layout_advance_iter(src_set->layout, &src_iter))
+            break;
+    }
+    if (i < update->count)
+        return;
+
+    intel_desc_offset_add(&end, &src_set->pool_begin, &iter.offset_end);
+
+    intel_desc_pool_copy(src_set->pool, &begin, &end, &src_begin);
+}
+
+static void desc_layout_destroy(struct intel_obj *obj)
+{
+    struct intel_desc_layout *layout = intel_desc_layout_from_obj(obj);
+
+    intel_desc_layout_destroy(layout);
+}
+
+static XGL_RESULT desc_layout_alloc_ranges(struct intel_desc_layout *layout,
+                                           const struct intel_desc_pool *pool,
+                                           const XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO *info)
+{
+    /* calculate counts */
+    while (info) {
+        if (info->sType !=
+                XGL_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO)
+            return XGL_ERROR_INVALID_POINTER;
+
+        switch (info->descriptorType) {
+        case XGL_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC:
+        case XGL_DESCRIPTOR_TYPE_SHADER_STORAGE_BUFFER_DYNAMIC:
+        case XGL_DESCRIPTOR_TYPE_RAW_BUFFER_DYNAMIC:
+            layout->dynamic_desc_count += info->count;
+            break;
+        default:
+            break;
+        }
+
+        layout->range_count++;
+        info = info->pNext;
+    }
+
+    layout->ranges = icd_alloc(sizeof(layout->ranges[0]) *
+            layout->range_count, 0, XGL_SYSTEM_ALLOC_INTERNAL);
+    if (!layout->ranges)
+        return XGL_ERROR_OUT_OF_MEMORY;
+
+    memset(layout->ranges, 0, sizeof(layout->ranges[0]) *
+            layout->range_count);
+
+    return XGL_SUCCESS;
+}
+
+static XGL_RESULT desc_layout_init_ranges(struct intel_desc_layout *layout,
+                                          const struct intel_desc_pool *pool,
+                                          const XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO *info)
+{
+    struct intel_desc_offset offset;
+    uint32_t index, i;
+    XGL_RESULT ret;
+
+    ret = desc_layout_alloc_ranges(layout, pool, info);
+    if (ret != XGL_SUCCESS)
+        return ret;
+
+    if (layout->prior_layout) {
+        index = layout->prior_layout->end;
+        offset = layout->prior_layout->pool_size;
+    } else {
+        index = 0;
+        intel_desc_offset_set(&offset, 0, 0);
+    }
+
+    layout->begin = index;
+
+    /* initialize the ranges */
+    for (i = 0; i < layout->range_count; i++, info = info->pNext) {
+        struct intel_desc_layout_range *range = &layout->ranges[i];
+        struct intel_desc_offset size;
+
+        ret = desc_pool_get_desc_size(pool, info->descriptorType, &size);
+        if (ret != XGL_SUCCESS)
+            return ret;
+
+        /* info->stageFlags does not gain us anything */
+        range->type = info->descriptorType;
+
+        range->begin = index;
+        range->offset = offset;
+
+        if (info->immutableSampler != XGL_NULL_HANDLE) {
+            range->immutable_sampler = intel_sampler(info->immutableSampler);
+            /* do not increment sampler offset */
+            intel_desc_offset_set(&range->increment, size.surface, 0);
+        } else {
+            range->immutable_sampler = NULL;
+            range->increment = size;
+        }
+
+        /* increment index and offset */
+        index += info->count;
+        intel_desc_offset_mad(&size, &range->increment, &size,
+                info->count - 1);
+        intel_desc_offset_add(&offset, &offset, &size);
+
+        range->end = index;
+    }
+
+    layout->end = index;
+    layout->pool_size = offset;
+
+    return XGL_SUCCESS;
+}
+
+static XGL_RESULT desc_layout_init_bind_points(struct intel_desc_layout *layout,
+                                               XGL_FLAGS stage_flags,
+                                               const uint32_t *bind_points)
+{
+    if (!bind_points)
+        return XGL_ERROR_INVALID_POINTER;
+
+    layout->stage_flags = stage_flags;
+
+    if (stage_flags == XGL_SHADER_STAGE_FLAGS_ALL) {
+        layout->bind_point_vs = *bind_points;
+        layout->bind_point_tcs = *bind_points;
+        layout->bind_point_tes = *bind_points;
+        layout->bind_point_gs = *bind_points;
+        layout->bind_point_fs = *bind_points;
+        layout->bind_point_cs = *bind_points;
+    } else {
+        if (stage_flags & XGL_SHADER_STAGE_FLAGS_VERTEX_BIT)
+            layout->bind_point_vs = *bind_points++;
+        if (stage_flags & XGL_SHADER_STAGE_FLAGS_TESS_CONTROL_BIT)
+            layout->bind_point_tcs = *bind_points++;
+        if (stage_flags & XGL_SHADER_STAGE_FLAGS_TESS_EVALUATION_BIT)
+            layout->bind_point_tes = *bind_points++;
+        if (stage_flags & XGL_SHADER_STAGE_FLAGS_GEOMETRY_BIT)
+            layout->bind_point_gs = *bind_points++;
+        if (stage_flags & XGL_SHADER_STAGE_FLAGS_FRAGMENT_BIT)
+            layout->bind_point_fs = *bind_points++;
+        if (stage_flags & XGL_SHADER_STAGE_FLAGS_COMPUTE_BIT)
+            layout->bind_point_cs = *bind_points++;
+    }
+
+    return XGL_SUCCESS;
+}
+
+XGL_RESULT intel_desc_layout_create(struct intel_dev *dev,
+                                    XGL_FLAGS stage_flags,
+                                    const uint32_t *bind_points,
+                                    const struct intel_desc_layout *prior_layout,
+                                    const XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO *info,
+                                    struct intel_desc_layout **layout_ret)
+{
+    struct intel_desc_layout *layout;
+    XGL_RESULT ret;
+
+    layout = (struct intel_desc_layout *)
+        intel_base_create(dev, sizeof(*layout), dev->base.dbg,
+                XGL_DBG_OBJECT_DESCRIPTOR_SET_LAYOUT, info, 0);
+    if (!layout)
+        return XGL_ERROR_OUT_OF_MEMORY;
+
+    layout->prior_layout = prior_layout;
+
+    ret = desc_layout_init_bind_points(layout, stage_flags, bind_points);
+    if (ret == XGL_SUCCESS)
+        ret = desc_layout_init_ranges(layout, dev->desc_pool, info);
+    if (ret != XGL_SUCCESS) {
+        intel_desc_layout_destroy(layout);
+        return ret;
+    }
+
+    layout->obj.destroy = desc_layout_destroy;
+
+    *layout_ret = layout;
+
+    return XGL_SUCCESS;
+}
+
+void intel_desc_layout_destroy(struct intel_desc_layout *layout)
+{
+    icd_free(layout->ranges);
+    intel_base_destroy(&layout->obj.base);
+}
+
+static void desc_layout_init_iter(const struct intel_desc_layout *sublayout,
+                                  uint32_t index,
+                                  struct intel_desc_layout_iter *iter)
+{
+    const struct intel_desc_layout_range *range;
+
+    assert(index >= sublayout->begin && index < sublayout->end);
+
+    /* find the range the index is in */
+    for (range = sublayout->ranges;; range++) {
+        assert(range < sublayout->ranges + sublayout->range_count);
+        if (index < range->end)
+            break;
+    }
+
+    /* current position */
+    iter->sublayout = sublayout;
+    iter->range = range;
+    iter->index = index;
+
+    iter->type = iter->range->type;
+    intel_desc_offset_mad(&iter->offset_begin, &range->increment,
+            &range->offset, iter->index - range->begin);
+    intel_desc_offset_add(&iter->offset_end, &iter->offset_begin,
+            &range->increment);
+}
+
+bool intel_desc_layout_find_bind_point(const struct intel_desc_layout *layout,
+                                       XGL_PIPELINE_SHADER_STAGE stage,
+                                       uint32_t set, uint32_t binding,
+                                       struct intel_desc_layout_iter *iter)
+{
+    /* find the layout at the bind point */
+    switch (stage) {
+#define CASE(stage, s)                                              \
+    case XGL_SHADER_STAGE_ ##stage:                                 \
+        while (layout) {                                            \
+            if ((layout->stage_flags &                              \
+                        XGL_SHADER_STAGE_FLAGS_ ##stage## _BIT) &&  \
+                layout->bind_point_ ##s == set)                     \
+                break;                                              \
+            layout = layout->prior_layout;                          \
+        }                                                           \
+        break
+    CASE(VERTEX, vs);
+    CASE(TESS_CONTROL, tcs);
+    CASE(TESS_EVALUATION, tes);
+    CASE(GEOMETRY, gs);
+    CASE(FRAGMENT, fs);
+    CASE(COMPUTE, cs);
+#undef CASE
+    default:
+        assert(!"unknown shader stage");
+        layout = NULL;
+        break;
+    }
+
+    if (!layout || layout->begin + binding >= layout->end) {
+        memset(iter, 0, sizeof(*iter));
+        return false;
+    }
+
+    desc_layout_init_iter(layout, layout->begin + binding, iter);
+
+    return true;
+}
+
+bool intel_desc_layout_find_index(const struct intel_desc_layout *layout,
+                                  uint32_t index,
+                                  struct intel_desc_layout_iter *iter)
+{
+    if (index >= layout->begin) {
+        /* out of bound */
+        if (index >= layout->end)
+            layout = NULL;
+    } else {
+        while (true) {
+            layout = layout->prior_layout;
+            if (index >= layout->begin) {
+                assert(index < layout->end);
+                break;
+            }
+        }
+    }
+
+    if (!layout) {
+        memset(iter, 0, sizeof(*iter));
+        return false;
+    }
+
+    desc_layout_init_iter(layout, index, iter);
+
+    return true;
+}
+
+bool intel_desc_layout_advance_iter(const struct intel_desc_layout *layout,
+                                    struct intel_desc_layout_iter *iter)
+{
+    /* all descriptors traversed */
+    if (!iter->sublayout)
+        return false;
+
+    iter->index++;
+    if (iter->index >= iter->range->end) {
+        /* move to the next range */
+        iter->range++;
+
+        if (iter->range >= iter->sublayout->ranges +
+                           iter->sublayout->range_count) {
+            /* find again as the chain is not doubly-linked */
+            const bool ret = intel_desc_layout_find_index(layout,
+                    iter->index, iter);
+            if (!ret) {
+                iter->sublayout = NULL;
+                iter->range = NULL;
+            }
+
+            return ret;
+        }
+
+        iter->type = iter->range->type;
+    }
+
+    iter->offset_begin = iter->offset_end;
+    intel_desc_offset_add(&iter->offset_end, &iter->offset_end,
+            &iter->range->increment);
+
+    return true;
+}
+
+XGL_RESULT XGLAPI xglCreateDescriptorSetLayout(
+    XGL_DEVICE                                   device,
+    XGL_FLAGS                                    stageFlags,
+    const XGL_UINT*                              pSetBindPoints,
+    XGL_DESCRIPTOR_SET_LAYOUT                    priorSetLayout,
+    const XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO* pSetLayoutInfoList,
+    XGL_DESCRIPTOR_SET_LAYOUT*                   pSetLayout)
+{
+    struct intel_dev *dev = intel_dev(device);
+    struct intel_desc_layout *prior_layout = intel_desc_layout(priorSetLayout);
+
+    return intel_desc_layout_create(dev, stageFlags, pSetBindPoints,
+            prior_layout, pSetLayoutInfoList,
+            (struct intel_desc_layout **) pSetLayout);
+}
+
+XGL_RESULT XGLAPI xglBeginDescriptorRegionUpdate(
+    XGL_DEVICE                                   device,
+    XGL_DESCRIPTOR_UPDATE_MODE                   updateMode)
+{
+    struct intel_dev *dev = intel_dev(device);
+    struct intel_desc_pool *pool = dev->desc_pool;
+
+    return intel_desc_pool_begin_update(pool, updateMode);
+}
+
+XGL_RESULT XGLAPI xglEndDescriptorRegionUpdate(
+    XGL_DEVICE                                   device,
+    XGL_CMD_BUFFER                               cmd_)
+{
+    struct intel_dev *dev = intel_dev(device);
+    struct intel_desc_pool *pool = dev->desc_pool;
+    struct intel_cmd *cmd = intel_cmd(cmd_);
+
+    return intel_desc_pool_end_update(pool, cmd);
+}
+
+XGL_RESULT XGLAPI xglCreateDescriptorRegion(
+    XGL_DEVICE                                   device,
+    XGL_DESCRIPTOR_REGION_USAGE                  regionUsage,
+    XGL_UINT                                     maxSets,
+    const XGL_DESCRIPTOR_REGION_CREATE_INFO*     pCreateInfo,
+    XGL_DESCRIPTOR_REGION*                       pDescriptorRegion)
+{
+    struct intel_dev *dev = intel_dev(device);
+
+    return intel_desc_region_create(dev, regionUsage, maxSets, pCreateInfo,
+            (struct intel_desc_region **) pDescriptorRegion);
+}
+
+XGL_RESULT XGLAPI xglClearDescriptorRegion(
+    XGL_DESCRIPTOR_REGION                        descriptorRegion)
+{
+    struct intel_desc_region *region = intel_desc_region(descriptorRegion);
+
+    intel_desc_region_free_all(region);
+
+    return XGL_SUCCESS;
+}
+
+XGL_RESULT XGLAPI xglAllocDescriptorSets(
+    XGL_DESCRIPTOR_REGION                        descriptorRegion,
+    XGL_DESCRIPTOR_SET_USAGE                     setUsage,
+    XGL_UINT                                     count,
+    const XGL_DESCRIPTOR_SET_LAYOUT*             pSetLayouts,
+    XGL_DESCRIPTOR_SET*                          pDescriptorSets,
+    XGL_UINT*                                    pCount)
+{
+    struct intel_desc_region *region = intel_desc_region(descriptorRegion);
+    struct intel_dev *dev = region->dev;
+    XGL_RESULT ret = XGL_SUCCESS;
+    uint32_t i;
+
+    for (i = 0; i < count; i++) {
+        const struct intel_desc_layout *layout =
+            intel_desc_layout((XGL_DESCRIPTOR_SET_LAYOUT) pSetLayouts[i]);
+
+        ret = intel_desc_set_create(dev, region, setUsage, layout,
+                (struct intel_desc_set **) &pDescriptorSets[i]);
+        if (ret != XGL_SUCCESS)
+            break;
+    }
+
+    if (pCount)
+        *pCount = i;
+
+    return ret;
+}
+
+XGL_VOID XGLAPI xglClearDescriptorSets(
+    XGL_DESCRIPTOR_REGION                        descriptorRegion,
+    XGL_UINT                                     count,
+    const XGL_DESCRIPTOR_SET*                    pDescriptorSets)
+{
+    uint32_t i;
+
+    for (i = 0; i < count; i++) {
+        struct intel_desc_set *set =
+            intel_desc_set((XGL_DESCRIPTOR_SET) pDescriptorSets[i]);
+
+        intel_desc_pool_clear(set->pool, &set->pool_begin, &set->pool_end);
+    }
+}
+
+XGL_VOID XGLAPI xglUpdateDescriptors(
+    XGL_DESCRIPTOR_SET                           descriptorSet,
+    const XGL_VOID*                              pUpdateChain)
+{
+    struct intel_desc_set *set = intel_desc_set(descriptorSet);
+    const union {
+        struct {
+            XGL_STRUCTURE_TYPE                      sType;
+            const XGL_VOID*                         pNext;
+        } common;
+
+        XGL_UPDATE_SAMPLERS samplers;
+        XGL_UPDATE_SAMPLER_TEXTURES sampler_textures;
+        XGL_UPDATE_IMAGES images;
+        XGL_UPDATE_BUFFERS buffers;
+        XGL_UPDATE_AS_COPY as_copy;
+    } *u = pUpdateChain;
+
+    while (u) {
+        switch (u->common.sType) {
+        case XGL_STRUCTURE_TYPE_UPDATE_SAMPLERS:
+            intel_desc_set_update_samplers(set, &u->samplers);
+            break;
+        case XGL_STRUCTURE_TYPE_UPDATE_SAMPLER_TEXTURES:
+            intel_desc_set_update_sampler_textures(set, &u->sampler_textures);
+            break;
+        case XGL_STRUCTURE_TYPE_UPDATE_IMAGES:
+            intel_desc_set_update_images(set, &u->images);
+            break;
+        case XGL_STRUCTURE_TYPE_UPDATE_BUFFERS:
+            intel_desc_set_update_buffers(set, &u->buffers);
+            break;
+        case XGL_STRUCTURE_TYPE_UPDATE_AS_COPY:
+            intel_desc_set_update_as_copy(set, &u->as_copy);
+            break;
+        default:
+            assert(!"unknown descriptor update");
+            break;
+        }
+
+        u = u->common.pNext;
+    }
+}
diff --git a/icd/intel/desc.h b/icd/intel/desc.h
new file mode 100644 (file)
index 0000000..94cf2fe
--- /dev/null
@@ -0,0 +1,308 @@
+/*
+ * XGL
+ *
+ * Copyright (C) 2015 LunarG, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ * Authors:
+ *   Chia-I Wu <olv@lunarg.com>
+ */
+
+#ifndef DESC_H
+#define DESC_H
+
+#include "intel.h"
+#include "obj.h"
+
+struct intel_cmd;
+struct intel_dev;
+
+/**
+ * Opaque descriptors.
+ */
+struct intel_desc_surface;
+struct intel_desc_sampler;
+
+/**
+ * Descriptor pool offset (or size) in bytes.
+ */
+struct intel_desc_offset {
+    uint32_t surface;
+    uint32_t sampler;
+};
+
+/**
+ * Per-device descriptor pool.
+ */
+struct intel_desc_pool {
+    /* this is not an intel_obj */
+
+    uint32_t surface_desc_size;
+    uint32_t sampler_desc_size;
+
+    /* surface descriptors (in system memory until RS is enabled) */
+    struct intel_desc_surface *surfaces;
+    /* sampler desciptors */
+    struct intel_desc_sampler *samplers;
+
+    struct intel_desc_offset size;
+    struct intel_desc_offset cur;
+};
+
+struct intel_desc_region {
+    struct intel_obj obj;
+
+    struct intel_dev *dev;
+
+    /* point to a continuous area in the device's pool */
+    struct intel_desc_offset pool_begin;
+    struct intel_desc_offset pool_end;
+
+    struct intel_desc_offset cur;
+};
+
+struct intel_desc_layout;
+
+struct intel_desc_set {
+    struct intel_obj obj;
+
+    /* suballocated from a region */
+    struct intel_desc_pool *pool;
+    struct intel_desc_offset pool_begin;
+    struct intel_desc_offset pool_end;
+
+    const struct intel_desc_layout *layout;
+};
+
+struct intel_desc_layout {
+    struct intel_obj obj;
+
+    /* a chain of layouts actually */
+    const struct intel_desc_layout *prior_layout;
+
+    /* where this layout binds to in shader stages */
+    XGL_FLAGS stage_flags;
+    uint32_t bind_point_vs;
+    uint32_t bind_point_tcs;
+    uint32_t bind_point_tes;
+    uint32_t bind_point_gs;
+    uint32_t bind_point_fs;
+    uint32_t bind_point_cs;
+
+    /* the continuous area in the descriptor set this layout is for */
+    uint32_t begin;
+    uint32_t end;
+
+    /* homogeneous ranges in this layout */
+    struct intel_desc_layout_range {
+        XGL_DESCRIPTOR_TYPE type;
+        const struct intel_sampler *immutable_sampler;
+
+        /* to speed up intel_desc_layout_advance() */
+        uint32_t begin;
+        uint32_t end;
+        struct intel_desc_offset offset;
+        struct intel_desc_offset increment;
+    } *ranges;
+    uint32_t range_count;
+
+    /* count of _DYNAMIC descriptors */
+    uint32_t dynamic_desc_count;
+
+    /* the size of the entire layout chain in the pool */
+    struct intel_desc_offset pool_size;
+};
+
+struct intel_desc_layout_iter {
+    /* current position in the chain of layouts */
+    const struct intel_desc_layout *sublayout;
+    const struct intel_desc_layout_range *range;
+    uint32_t index;
+
+    XGL_DESCRIPTOR_TYPE type;
+    struct intel_desc_offset offset_begin;
+    struct intel_desc_offset offset_end;
+};
+
+static inline struct intel_desc_region *intel_desc_region(XGL_DESCRIPTOR_REGION region)
+{
+    return (struct intel_desc_region *) region;
+}
+
+static inline struct intel_desc_region *intel_desc_region_from_obj(struct intel_obj *obj)
+{
+    return (struct intel_desc_region *) obj;
+}
+
+static inline struct intel_desc_set *intel_desc_set(XGL_DESCRIPTOR_SET set)
+{
+    return (struct intel_desc_set *) set;
+}
+
+static inline struct intel_desc_set *intel_desc_set_from_obj(struct intel_obj *obj)
+{
+    return (struct intel_desc_set *) obj;
+}
+
+static inline struct intel_desc_layout *intel_desc_layout(XGL_DESCRIPTOR_SET_LAYOUT layout)
+{
+    return (struct intel_desc_layout *) layout;
+}
+
+static inline struct intel_desc_layout *intel_desc_layout_from_obj(struct intel_obj *obj)
+{
+    return (struct intel_desc_layout *) obj;
+}
+
+static inline void intel_desc_offset_set(struct intel_desc_offset *offset,
+                                         uint32_t surface_offset,
+                                         uint32_t sampler_offset)
+{
+    offset->surface = surface_offset;
+    offset->sampler = sampler_offset;
+}
+
+static inline void intel_desc_offset_add(struct intel_desc_offset *offset,
+                                         const struct intel_desc_offset *lhs,
+                                         const struct intel_desc_offset *rhs)
+{
+    offset->surface = lhs->surface + rhs->surface;
+    offset->sampler = lhs->sampler + rhs->sampler;
+}
+
+static inline void intel_desc_offset_sub(struct intel_desc_offset *offset,
+                                         const struct intel_desc_offset *lhs,
+                                         const struct intel_desc_offset *rhs)
+{
+    offset->surface = lhs->surface - rhs->surface;
+    offset->sampler = lhs->sampler - rhs->sampler;
+}
+
+static inline void intel_desc_offset_mad(struct intel_desc_offset *offset,
+                                         const struct intel_desc_offset *lhs,
+                                         const struct intel_desc_offset *rhs,
+                                         uint32_t lhs_scale)
+{
+    offset->surface = lhs->surface * lhs_scale + rhs->surface;
+    offset->sampler = lhs->sampler * lhs_scale + rhs->sampler;
+}
+
+static inline bool intel_desc_offset_within(const struct intel_desc_offset *offset,
+                                            const struct intel_desc_offset *other)
+{
+    return (offset->surface <= other->surface &&
+            offset->sampler <= other->sampler);
+}
+
+XGL_RESULT intel_desc_pool_create(struct intel_dev *dev,
+                                  struct intel_desc_pool **pool_ret);
+void intel_desc_pool_destroy(struct intel_desc_pool *pool);
+
+XGL_RESULT intel_desc_pool_alloc(struct intel_desc_pool *pool,
+                                 const XGL_DESCRIPTOR_REGION_CREATE_INFO *info,
+                                 struct intel_desc_offset *begin,
+                                 struct intel_desc_offset *end);
+void intel_desc_pool_free(struct intel_desc_pool *pool,
+                          const struct intel_desc_offset *begin,
+                          const struct intel_desc_offset *end);
+
+XGL_RESULT intel_desc_pool_begin_update(struct intel_desc_pool *pool,
+                                        XGL_DESCRIPTOR_UPDATE_MODE mode);
+XGL_RESULT intel_desc_pool_end_update(struct intel_desc_pool *pool,
+                                      struct intel_cmd *cmd);
+
+void intel_desc_pool_clear(struct intel_desc_pool *pool,
+                           const struct intel_desc_offset *begin,
+                           const struct intel_desc_offset *end);
+
+void intel_desc_pool_update(struct intel_desc_pool *pool,
+                            const struct intel_desc_offset *begin,
+                            const struct intel_desc_offset *end,
+                            const struct intel_desc_surface *surfaces,
+                            const struct intel_desc_sampler *samplers);
+
+void intel_desc_pool_copy(struct intel_desc_pool *pool,
+                          const struct intel_desc_offset *begin,
+                          const struct intel_desc_offset *end,
+                          const struct intel_desc_offset *src);
+
+void intel_desc_pool_read_surface(const struct intel_desc_pool *pool,
+                                  const struct intel_desc_offset *offset,
+                                  XGL_PIPELINE_SHADER_STAGE stage,
+                                  const struct intel_mem **mem,
+                                  bool *read_only,
+                                  const uint32_t **cmd,
+                                  uint32_t *cmd_len);
+void intel_desc_pool_read_sampler(const struct intel_desc_pool *pool,
+                                  const struct intel_desc_offset *offset,
+                                  const struct intel_sampler **sampler);
+
+XGL_RESULT intel_desc_region_create(struct intel_dev *dev,
+                                    XGL_DESCRIPTOR_REGION_USAGE usage,
+                                    uint32_t max_sets,
+                                    const XGL_DESCRIPTOR_REGION_CREATE_INFO *info,
+                                    struct intel_desc_region **region_ret);
+void intel_desc_region_destroy(struct intel_desc_region *region);
+
+XGL_RESULT intel_desc_region_alloc(struct intel_desc_region *region,
+                                   const struct intel_desc_layout *layout,
+                                   struct intel_desc_offset *begin,
+                                   struct intel_desc_offset *end);
+void intel_desc_region_free_all(struct intel_desc_region *region);
+
+XGL_RESULT intel_desc_set_create(struct intel_dev *dev,
+                                 struct intel_desc_region *region,
+                                 XGL_DESCRIPTOR_SET_USAGE usage,
+                                 const struct intel_desc_layout *layout,
+                                 struct intel_desc_set **set_ret);
+void intel_desc_set_destroy(struct intel_desc_set *set);
+
+void intel_desc_set_update_samplers(struct intel_desc_set *set,
+                                    const XGL_UPDATE_SAMPLERS *update);
+void intel_desc_set_update_sampler_textures(struct intel_desc_set *set,
+                                            const XGL_UPDATE_SAMPLER_TEXTURES *update);
+void intel_desc_set_update_images(struct intel_desc_set *set,
+                                  const XGL_UPDATE_IMAGES *update);
+void intel_desc_set_update_buffers(struct intel_desc_set *set,
+                                   const XGL_UPDATE_BUFFERS *update);
+void intel_desc_set_update_as_copy(struct intel_desc_set *set,
+                                   const XGL_UPDATE_AS_COPY *update);
+
+XGL_RESULT intel_desc_layout_create(struct intel_dev *dev,
+                                    XGL_FLAGS stage_flags,
+                                    const uint32_t *bind_points,
+                                    const struct intel_desc_layout *prior_layout,
+                                    const XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO *info,
+                                    struct intel_desc_layout **layout_ret);
+void intel_desc_layout_destroy(struct intel_desc_layout *layout);
+
+bool intel_desc_layout_find_bind_point(const struct intel_desc_layout *layout,
+                                       XGL_PIPELINE_SHADER_STAGE stage,
+                                       uint32_t set, uint32_t binding,
+                                       struct intel_desc_layout_iter *iter);
+
+bool intel_desc_layout_find_index(const struct intel_desc_layout *layout,
+                                  uint32_t index,
+                                  struct intel_desc_layout_iter *iter);
+
+bool intel_desc_layout_advance_iter(const struct intel_desc_layout *layout,
+                                    struct intel_desc_layout_iter *iter);
+
+#endif /* DESC_H */
index 5e8afb5..019f892 100644 (file)
@@ -27,6 +27,7 @@
 
 #include <stdarg.h>
 #include "kmd/winsys.h"
+#include "desc.h"
 #include "gpu.h"
 #include "pipeline.h"
 #include "queue.h"
@@ -147,6 +148,12 @@ XGL_RESULT intel_dev_create(struct intel_gpu *gpu,
         return XGL_ERROR_OUT_OF_MEMORY;
     }
 
+    ret = intel_desc_pool_create(dev, &dev->desc_pool);
+    if (ret != XGL_SUCCESS) {
+        intel_dev_destroy(dev);
+        return ret;
+    }
+
     ret = dev_create_queues(dev, info->pRequestedQueues,
             info->queueRecordCount);
     if (ret != XGL_SUCCESS) {
@@ -187,6 +194,9 @@ void intel_dev_destroy(struct intel_dev *dev)
             intel_queue_destroy(dev->queues[i]);
     }
 
+    if (dev->desc_pool)
+        intel_desc_pool_destroy(dev->desc_pool);
+
     dev_destroy_meta_shaders(dev);
 
     if (dev->cmd_scratch_bo)
index 8be9911..d732f7d 100644 (file)
@@ -32,6 +32,7 @@
 #include "gpu.h"
 #include "obj.h"
 
+struct intel_desc_pool;
 struct intel_pipeline_shader;
 struct intel_queue;
 struct intel_winsys;
@@ -164,6 +165,8 @@ struct intel_dev {
     struct intel_bo *cmd_scratch_bo;
     struct intel_pipeline_shader *cmd_meta_shaders[INTEL_DEV_META_SHADER_COUNT];
 
+    struct intel_desc_pool *desc_pool;
+
     struct intel_queue *queues[INTEL_GPU_ENGINE_COUNT];
 };
 
diff --git a/icd/intel/dset.c b/icd/intel/dset.c
deleted file mode 100644 (file)
index a5abb5f..0000000
+++ /dev/null
@@ -1,200 +0,0 @@
-/*
- * XGL
- *
- * Copyright (C) 2014 LunarG, Inc.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included
- * in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- *
- * Authors:
- *   Chia-I Wu <olv@lunarg.com>
- */
-
-#include "dev.h"
-#include "sampler.h"
-#include "dset.h"
-
-static bool dset_img_state_read_only(XGL_IMAGE_LAYOUT layout)
-{
-    switch (layout) {
-    case XGL_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL:
-    case XGL_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL:
-    case XGL_IMAGE_LAYOUT_TRANSFER_SOURCE_OPTIMAL:
-        return true;
-    default:
-        return false;
-    }
-}
-
-static void dset_destroy(struct intel_obj *obj)
-{
-    struct intel_dset *dset = intel_dset_from_obj(obj);
-
-    intel_dset_destroy(dset);
-}
-
-XGL_RESULT intel_dset_create(struct intel_dev *dev,
-                             const XGL_DESCRIPTOR_SET_CREATE_INFO *info,
-                             struct intel_dset **dset_ret)
-{
-    struct intel_dset *dset;
-
-    dset = (struct intel_dset *) intel_base_create(dev, sizeof(*dset),
-            dev->base.dbg, XGL_DBG_OBJECT_DESCRIPTOR_SET, info, 0);
-    if (!dset)
-        return XGL_ERROR_OUT_OF_MEMORY;
-
-    dset->dev = dev;
-    dset->slots = icd_alloc(sizeof(dset->slots[0]) * info->slots,
-            0, XGL_SYSTEM_ALLOC_INTERNAL);
-    if (!dset->slots) {
-        intel_dset_destroy(dset);
-        return XGL_ERROR_OUT_OF_MEMORY;
-    }
-
-    dset->obj.destroy = dset_destroy;
-
-    *dset_ret = dset;
-
-    return XGL_SUCCESS;
-}
-
-void intel_dset_destroy(struct intel_dset *dset)
-{
-    icd_free(dset->slots);
-    intel_base_destroy(&dset->obj.base);
-}
-
-ICD_EXPORT XGL_RESULT XGLAPI xglCreateDescriptorSet(
-    XGL_DEVICE                                  device,
-    const XGL_DESCRIPTOR_SET_CREATE_INFO*       pCreateInfo,
-    XGL_DESCRIPTOR_SET*                         pDescriptorSet)
-{
-    struct intel_dev *dev = intel_dev(device);
-
-    return intel_dset_create(dev, pCreateInfo,
-            (struct intel_dset **) pDescriptorSet);
-}
-
-ICD_EXPORT XGL_VOID XGLAPI xglBeginDescriptorSetUpdate(
-    XGL_DESCRIPTOR_SET                          descriptorSet)
-{
-    /* no-op */
-}
-
-ICD_EXPORT XGL_VOID XGLAPI xglEndDescriptorSetUpdate(
-    XGL_DESCRIPTOR_SET                          descriptorSet)
-{
-    /* no-op */
-}
-
-ICD_EXPORT XGL_VOID XGLAPI xglAttachSamplerDescriptors(
-    XGL_DESCRIPTOR_SET                          descriptorSet,
-    XGL_UINT                                    startSlot,
-    XGL_UINT                                    slotCount,
-    const XGL_SAMPLER*                          pSamplers)
-{
-    struct intel_dset *dset = intel_dset(descriptorSet);
-    XGL_UINT i;
-
-    for (i = 0; i < slotCount; i++) {
-        struct intel_dset_slot *slot = &dset->slots[startSlot + i];
-        struct intel_sampler *sampler = intel_sampler(pSamplers[i]);
-
-        slot->type = INTEL_DSET_SLOT_SAMPLER;
-        slot->read_only = true;
-        slot->u.sampler = sampler;
-    }
-}
-
-ICD_EXPORT XGL_VOID XGLAPI xglAttachImageViewDescriptors(
-    XGL_DESCRIPTOR_SET                          descriptorSet,
-    XGL_UINT                                    startSlot,
-    XGL_UINT                                    slotCount,
-    const XGL_IMAGE_VIEW_ATTACH_INFO*           pImageViews)
-{
-    struct intel_dset *dset = intel_dset(descriptorSet);
-    XGL_UINT i;
-
-    for (i = 0; i < slotCount; i++) {
-        struct intel_dset_slot *slot = &dset->slots[startSlot + i];
-        const XGL_IMAGE_VIEW_ATTACH_INFO *info = &pImageViews[i];
-        struct intel_img_view *view = intel_img_view(info->view);
-
-        slot->type = INTEL_DSET_SLOT_IMG_VIEW;
-        slot->read_only = dset_img_state_read_only(info->layout);
-        slot->u.img_view = view;
-    }
-}
-
-ICD_EXPORT XGL_VOID XGLAPI xglAttachBufferViewDescriptors(
-    XGL_DESCRIPTOR_SET                          descriptorSet,
-    XGL_UINT                                    startSlot,
-    XGL_UINT                                    slotCount,
-    const XGL_BUFFER_VIEW_ATTACH_INFO*          pBufferViews)
-{
-    struct intel_dset *dset = intel_dset(descriptorSet);
-    XGL_UINT i;
-
-    for (i = 0; i < slotCount; i++) {
-        struct intel_dset_slot *slot = &dset->slots[startSlot + i];
-        const XGL_BUFFER_VIEW_ATTACH_INFO *info = &pBufferViews[i];
-
-        slot->type = INTEL_DSET_SLOT_BUF_VIEW;
-        slot->read_only = false;
-        slot->u.buf_view = intel_buf_view(info->view);
-    }
-}
-
-ICD_EXPORT XGL_VOID XGLAPI xglAttachNestedDescriptors(
-    XGL_DESCRIPTOR_SET                          descriptorSet,
-    XGL_UINT                                    startSlot,
-    XGL_UINT                                    slotCount,
-    const XGL_DESCRIPTOR_SET_ATTACH_INFO*       pNestedDescriptorSets)
-{
-    struct intel_dset *dset = intel_dset(descriptorSet);
-    XGL_UINT i;
-
-    for (i = 0; i < slotCount; i++) {
-        struct intel_dset_slot *slot = &dset->slots[startSlot + i];
-        const XGL_DESCRIPTOR_SET_ATTACH_INFO *info = &pNestedDescriptorSets[i];
-        struct intel_dset *nested = intel_dset(info->descriptorSet);
-
-        slot->type = INTEL_DSET_SLOT_NESTED;
-        slot->read_only = true;
-        slot->u.nested.dset = nested;
-        slot->u.nested.slot_offset = info->slotOffset;
-    }
-}
-
-ICD_EXPORT XGL_VOID XGLAPI xglClearDescriptorSetSlots(
-    XGL_DESCRIPTOR_SET                          descriptorSet,
-    XGL_UINT                                    startSlot,
-    XGL_UINT                                    slotCount)
-{
-    struct intel_dset *dset = intel_dset(descriptorSet);
-    XGL_UINT i;
-
-    for (i = 0; i < slotCount; i++) {
-        struct intel_dset_slot *slot = &dset->slots[startSlot + i];
-
-        slot->type = INTEL_DSET_SLOT_UNUSED;
-        slot->read_only = true;
-        slot->u.unused = NULL;
-    }
-}
diff --git a/icd/intel/dset.h b/icd/intel/dset.h
deleted file mode 100644 (file)
index 425d518..0000000
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * XGL
- *
- * Copyright (C) 2014 LunarG, Inc.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included
- * in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- *
- * Authors:
- *   Chia-I Wu <olv@lunarg.com>
- */
-
-#ifndef DSET_H
-#define DSET_H
-
-#include "intel.h"
-#include "obj.h"
-#include "view.h"
-
-enum intel_dset_slot_type {
-    INTEL_DSET_SLOT_UNUSED,
-    INTEL_DSET_SLOT_SAMPLER,
-    INTEL_DSET_SLOT_IMG_VIEW,
-    INTEL_DSET_SLOT_BUF_VIEW,
-    INTEL_DSET_SLOT_NESTED,
-};
-
-struct intel_dset;
-
-struct intel_dset_slot {
-    enum intel_dset_slot_type type;
-    bool read_only;
-
-    union {
-        const void *unused;
-        const struct intel_sampler *sampler;
-        const struct intel_img_view *img_view;
-
-        struct intel_buf_view *buf_view;
-
-        struct {
-            const struct intel_dset *dset;
-            XGL_UINT slot_offset;
-        } nested;
-
-    } u;
-};
-
-struct intel_dset {
-    struct intel_obj obj;
-
-    struct intel_dev *dev;
-    struct intel_dset_slot *slots;
-};
-
-static inline struct intel_dset *intel_dset(XGL_DESCRIPTOR_SET dset)
-{
-    return (struct intel_dset *) dset;
-}
-
-static inline struct intel_dset *intel_dset_from_obj(struct intel_obj *obj)
-{
-    return (struct intel_dset *) obj;
-}
-
-XGL_RESULT intel_dset_create(struct intel_dev *dev,
-                             const XGL_DESCRIPTOR_SET_CREATE_INFO *info,
-                             struct intel_dset **dset_ret);
-void intel_dset_destroy(struct intel_dset *dset);
-
-#endif /* DSET_H */
index ac2c437..c3493dd 100644 (file)
@@ -131,8 +131,7 @@ static bool base_dbg_copy_create_info(struct intel_base_dbg *dbg,
         shallow_copy = sizeof(XGL_SAMPLER_CREATE_INFO);
         break;
     case XGL_DBG_OBJECT_DESCRIPTOR_SET:
-        assert(info.header->struct_type == XGL_STRUCTURE_TYPE_DESCRIPTOR_SET_CREATE_INFO);
-        shallow_copy = sizeof(XGL_DESCRIPTOR_SET_CREATE_INFO);
+        /* no create info */
         break;
     case XGL_DBG_OBJECT_VIEWPORT_STATE:
         assert(info.header->struct_type == XGL_STRUCTURE_TYPE_DYNAMIC_VP_STATE_CREATE_INFO);
@@ -169,6 +168,15 @@ static bool base_dbg_copy_create_info(struct intel_base_dbg *dbg,
         assert(info.header->struct_type ==  XGL_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO);
         shallow_copy = sizeof(XGL_RENDER_PASS_CREATE_INFO);
         break;
+    case XGL_DBG_OBJECT_DESCRIPTOR_SET_LAYOUT:
+        assert(info.header->struct_type ==  XGL_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO);
+        /* TODO */
+        shallow_copy = sizeof(XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO) * 0;
+        break;
+    case XGL_DBG_OBJECT_DESCRIPTOR_REGION:
+        assert(info.header->struct_type ==  XGL_STRUCTURE_TYPE_DESCRIPTOR_REGION_CREATE_INFO);
+        shallow_copy = sizeof(XGL_DESCRIPTOR_REGION_CREATE_INFO);
+        break;
     default:
         // log debug message regarding invalid struct_type?
         intel_dev_log(dbg->dev, XGL_DBG_MSG_ERROR,
index f4cd5a2..8e5ab4d 100644 (file)
@@ -167,12 +167,14 @@ void intel_pipeline_shader_destroy(struct intel_pipeline_shader *sh)
 }
 
 static XGL_RESULT pipeline_build_shader(struct intel_pipeline *pipeline,
-                                        struct intel_pipeline_shader *sh,
-                                        const XGL_PIPELINE_SHADER *sh_info)
+                                        const struct intel_desc_layout *layout,
+                                        const XGL_PIPELINE_SHADER *sh_info,
+                                        struct intel_pipeline_shader *sh)
 {
     XGL_RESULT ret;
 
-    ret = intel_pipeline_shader_compile(sh, pipeline->dev->gpu, sh_info);
+    ret = intel_pipeline_shader_compile(sh,
+            pipeline->dev->gpu, layout, sh_info);
     if (ret != XGL_SUCCESS)
         return ret;
 
@@ -192,21 +194,36 @@ static XGL_RESULT pipeline_build_shader(struct intel_pipeline *pipeline,
 static XGL_RESULT pipeline_build_shaders(struct intel_pipeline *pipeline,
                                          const struct intel_pipeline_create_info *info)
 {
+    const struct intel_desc_layout *layout =
+        intel_desc_layout(info->graphics.lastSetLayout);
     XGL_RESULT ret = XGL_SUCCESS;
 
-    if (ret == XGL_SUCCESS && info->vs.shader)
-        ret = pipeline_build_shader(pipeline, &pipeline->vs, &info->vs);
-    if (ret == XGL_SUCCESS && info->tcs.shader)
-        ret = pipeline_build_shader(pipeline, &pipeline->tcs, &info->tcs);
-    if (ret == XGL_SUCCESS && info->tes.shader)
-        ret = pipeline_build_shader(pipeline, &pipeline->tes, &info->tes);
-    if (ret == XGL_SUCCESS && info->gs.shader)
-        ret = pipeline_build_shader(pipeline, &pipeline->gs, &info->gs);
-    if (ret == XGL_SUCCESS && info->fs.shader)
-        ret = pipeline_build_shader(pipeline, &pipeline->fs, &info->fs);
-
-    if (ret == XGL_SUCCESS && info->compute.cs.shader)
-        ret = pipeline_build_shader(pipeline, &pipeline->cs, &info->compute.cs);
+    if (ret == XGL_SUCCESS && info->vs.shader) {
+        ret = pipeline_build_shader(pipeline, layout,
+                &info->vs, &pipeline->vs);
+    }
+    if (ret == XGL_SUCCESS && info->tcs.shader) {
+        ret = pipeline_build_shader(pipeline, layout,
+                &info->tcs,&pipeline->tcs);
+    }
+    if (ret == XGL_SUCCESS && info->tes.shader) {
+        ret = pipeline_build_shader(pipeline, layout,
+                &info->tes,&pipeline->tes);
+    }
+    if (ret == XGL_SUCCESS && info->gs.shader) {
+        ret = pipeline_build_shader(pipeline, layout,
+                &info->gs, &pipeline->gs);
+    }
+    if (ret == XGL_SUCCESS && info->fs.shader) {
+        ret = pipeline_build_shader(pipeline, layout,
+                &info->fs, &pipeline->fs);
+    }
+
+    if (ret == XGL_SUCCESS && info->compute.cs.shader) {
+        layout = intel_desc_layout(info->compute.lastSetLayout);
+        ret = pipeline_build_shader(pipeline, layout,
+                &info->compute.cs, &pipeline->cs);
+    }
 
     return ret;
 }
index b14bd3f..3cae425 100644 (file)
@@ -31,6 +31,7 @@
 
 #include "intel.h"
 #include "obj.h"
+#include "desc.h"
 #include "dev.h"
 
 enum intel_pipeline_shader_use {
@@ -50,22 +51,23 @@ enum intel_computed_depth_mode {
     INTEL_COMPUTED_DEPTH_MODE_ON_LE
 };
 
-#define INTEL_PIPELINE_RMAP_SLOT_RT ((XGL_UINT) -1)
-#define INTEL_PIPELINE_RMAP_SLOT_DYN ((XGL_UINT) -2)
+enum intel_pipeline_rmap_slot_type {
+    INTEL_PIPELINE_RMAP_UNUSED,
+    INTEL_PIPELINE_RMAP_RT,
+    INTEL_PIPELINE_RMAP_SURFACE,
+    INTEL_PIPELINE_RMAP_SAMPLER,
+};
+
 struct intel_pipeline_rmap_slot {
-    /*
-     *
-     * When path_len is 0, the slot is unused.
-     * When path_len is 1, the slot uses descriptor "index".
-     * When path_len is INTEL_RMAP_SLOT_RT, the slot uses RT "index".
-     * When path_len is INTEL_RMAP_SLOT_DYN, the slot uses the dynamic view.
-     * Otherwise, the slot uses "path" to find the descriptor.
-     */
-    XGL_UINT path_len;
+    enum intel_pipeline_rmap_slot_type type;
 
     union {
-        XGL_UINT index;
-        XGL_UINT *path;
+        uint32_t rt;
+        struct {
+            struct intel_desc_offset offset;
+            int dynamic_offset_index;
+        } surface;
+        struct intel_desc_offset sampler;
     } u;
 };
 
index 9532a6c..03a0913 100644 (file)
@@ -92,6 +92,8 @@ XGL_DEFINE_SUBCLASS_HANDLE(XGL_PIPELINE, XGL_OBJECT)
 XGL_DEFINE_SUBCLASS_HANDLE(XGL_PIPELINE_DELTA, XGL_OBJECT)
 XGL_DEFINE_SUBCLASS_HANDLE(XGL_SAMPLER, XGL_OBJECT)
 XGL_DEFINE_SUBCLASS_HANDLE(XGL_DESCRIPTOR_SET, XGL_OBJECT)
+XGL_DEFINE_SUBCLASS_HANDLE(XGL_DESCRIPTOR_SET_LAYOUT, XGL_OBJECT)
+XGL_DEFINE_SUBCLASS_HANDLE(XGL_DESCRIPTOR_REGION, XGL_OBJECT)
 XGL_DEFINE_SUBCLASS_HANDLE(XGL_DYNAMIC_STATE_OBJECT, XGL_OBJECT)
 XGL_DEFINE_SUBCLASS_HANDLE(XGL_DYNAMIC_VP_STATE_OBJECT, XGL_DYNAMIC_STATE_OBJECT)
 XGL_DEFINE_SUBCLASS_HANDLE(XGL_DYNAMIC_RS_STATE_OBJECT, XGL_DYNAMIC_STATE_OBJECT)
@@ -276,24 +278,59 @@ typedef enum _XGL_CHANNEL_SWIZZLE
     XGL_MAX_ENUM(_XGL_CHANNEL_SWIZZLE)
 } XGL_CHANNEL_SWIZZLE;
 
-typedef enum _XGL_DESCRIPTOR_SET_SLOT_TYPE
+typedef enum _XGL_DESCRIPTOR_TYPE
 {
-    XGL_SLOT_UNUSED                                         = 0x00000000,
-    XGL_SLOT_SHADER_RESOURCE                                = 0x00000001,
-    XGL_SLOT_SHADER_UAV                                     = 0x00000002,
-    XGL_SLOT_SHADER_SAMPLER                                 = 0x00000003,
-    XGL_SLOT_NEXT_DESCRIPTOR_SET                            = 0x00000004,
+    XGL_DESCRIPTOR_TYPE_SAMPLER                             = 0x00000000,
+    XGL_DESCRIPTOR_TYPE_SAMPLER_TEXTURE                     = 0x00000001,
+    XGL_DESCRIPTOR_TYPE_TEXTURE                             = 0x00000002,
+    XGL_DESCRIPTOR_TYPE_TEXTURE_BUFFER                      = 0x00000003,
+    XGL_DESCRIPTOR_TYPE_IMAGE                               = 0x00000004,
+    XGL_DESCRIPTOR_TYPE_IMAGE_BUFFER                        = 0x00000005,
+    XGL_DESCRIPTOR_TYPE_UNIFORM_BUFFER                      = 0x00000006,
+    XGL_DESCRIPTOR_TYPE_SHADER_STORAGE_BUFFER               = 0x00000007,
+    XGL_DESCRIPTOR_TYPE_RAW_BUFFER                          = 0x00000008,
+    XGL_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC              = 0x00000009,
+    XGL_DESCRIPTOR_TYPE_SHADER_STORAGE_BUFFER_DYNAMIC       = 0x0000000a,
+    XGL_DESCRIPTOR_TYPE_RAW_BUFFER_DYNAMIC                  = 0x0000000b,
 
-    // LUNARG CHANGE BEGIN - differentiate between textures and buffers
-    XGL_SLOT_SHADER_TEXTURE_RESOURCE                        = 0x00000005,
+    XGL_DESCRIPTOR_TYPE_BEGIN_RANGE                         = XGL_DESCRIPTOR_TYPE_SAMPLER,
+    XGL_DESCRIPTOR_TYPE_END_RANGE                           = XGL_DESCRIPTOR_TYPE_RAW_BUFFER_DYNAMIC,
+    XGL_NUM_DESCRIPTOR_TYPE                                 = (XGL_DESCRIPTOR_TYPE_END_RANGE - XGL_DESCRIPTOR_TYPE_BEGIN_RANGE + 1),
+    XGL_MAX_ENUM(_XGL_DESCRIPTOR_TYPE)
+} XGL_DESCRIPTOR_TYPE;
 
-    XGL_DESCRIPTOR_SET_SLOT_TYPE_BEGIN_RANGE                = XGL_SLOT_UNUSED,
-    XGL_DESCRIPTOR_SET_SLOT_TYPE_END_RANGE                  = XGL_SLOT_SHADER_TEXTURE_RESOURCE,
-    // LUNARG CHANGE END
+typedef enum _XGL_DESCRIPTOR_REGION_USAGE
+{
+    XGL_DESCRIPTOR_REGION_USAGE_ONE_SHOT                    = 0x00000000,
+    XGL_DESCRIPTOR_REGION_USAGE_DYNAMIC                     = 0x00000001,
+
+    XGL_DESCRIPTOR_REGION_USAGE_BEGIN_RANGE                 = XGL_DESCRIPTOR_REGION_USAGE_ONE_SHOT,
+    XGL_DESCRIPTOR_REGION_USAGE_END_RANGE                   = XGL_DESCRIPTOR_REGION_USAGE_DYNAMIC,
+    XGL_NUM_DESCRIPTOR_REGION_USAGE                         = (XGL_DESCRIPTOR_REGION_USAGE_END_RANGE - XGL_DESCRIPTOR_REGION_USAGE_BEGIN_RANGE + 1),
+    XGL_MAX_ENUM(_XGL_DESCRIPTOR_REGION_USAGE)
+} XGL_DESCRIPTOR_REGION_USAGE;
+
+typedef enum _XGL_DESCRIPTOR_UPDATE_MODE
+{
+    XGL_DESCRIPTOR_UDPATE_MODE_COPY                         = 0x00000000,
+    XGL_DESCRIPTOR_UPDATE_MODE_FASTEST                      = 0x00000001,
+
+    XGL_DESCRIPTOR_UPDATE_MODE_BEGIN_RANGE                  = XGL_DESCRIPTOR_UDPATE_MODE_COPY,
+    XGL_DESCRIPTOR_UPDATE_MODE_END_RANGE                    = XGL_DESCRIPTOR_UPDATE_MODE_FASTEST,
+    XGL_NUM_DESCRIPTOR_UPDATE_MODE                          = (XGL_DESCRIPTOR_UPDATE_MODE_END_RANGE - XGL_DESCRIPTOR_UPDATE_MODE_BEGIN_RANGE + 1),
+    XGL_MAX_ENUM(_XGL_DESCRIPTOR_UPDATE_MODE)
+} XGL_DESCRIPTOR_UPDATE_MODE;
+
+typedef enum _XGL_DESCRIPTOR_SET_USAGE
+{
+    XGL_DESCRIPTOR_SET_USAGE_ONE_SHOT                       = 0x00000000,
+    XGL_DESCRIPTOR_SET_USAGE_STATIC                         = 0x00000001,
 
-    XGL_NUM_DESCRIPTOR_SET_SLOT_TYPE                        = (XGL_DESCRIPTOR_SET_SLOT_TYPE_END_RANGE - XGL_DESCRIPTOR_SET_SLOT_TYPE_BEGIN_RANGE + 1),
-    XGL_MAX_ENUM(_XGL_DESCRIPTOR_SET_SLOT_TYPE)
-} XGL_DESCRIPTOR_SET_SLOT_TYPE;
+    XGL_DESCRIPTOR_SET_USAGE_BEGIN_RANGE                    = XGL_DESCRIPTOR_SET_USAGE_ONE_SHOT,
+    XGL_DESCRIPTOR_SET_USAGE_END_RANGE                      = XGL_DESCRIPTOR_SET_USAGE_STATIC,
+    XGL_NUM_DESCRIPTOR_SET_USAGE                          = (XGL_DESCRIPTOR_SET_USAGE_END_RANGE - XGL_DESCRIPTOR_SET_USAGE_BEGIN_RANGE + 1),
+    XGL_MAX_ENUM(_XGL_DESCRIPTOR_SET_USAGE)
+} XGL_DESCRIPTOR_SET_USAGE;
 
 typedef enum _XGL_QUERY_TYPE
 {
@@ -854,6 +891,19 @@ typedef enum _XGL_PIPELINE_SHADER_STAGE
     XGL_MAX_ENUM(_XGL_PIPELINE_SHADER_STAGE)
 } XGL_PIPELINE_SHADER_STAGE;
 
+typedef enum _XGL_SHADER_STAGE_FLAGS
+{
+    XGL_SHADER_STAGE_FLAGS_VERTEX_BIT                       = 0x00000001,
+    XGL_SHADER_STAGE_FLAGS_TESS_CONTROL_BIT                 = 0x00000002,
+    XGL_SHADER_STAGE_FLAGS_TESS_EVALUATION_BIT              = 0x00000004,
+    XGL_SHADER_STAGE_FLAGS_GEOMETRY_BIT                     = 0x00000008,
+    XGL_SHADER_STAGE_FLAGS_FRAGMENT_BIT                     = 0x00000010,
+    XGL_SHADER_STAGE_FLAGS_COMPUTE_BIT                      = 0x00000020,
+
+    XGL_SHADER_STAGE_FLAGS_ALL                              = 0x7FFFFFFF,
+    XGL_MAX_ENUM(_XGL_SHADER_STAGE_FLAGS)
+} XGL_SHADER_STAGE_FLAGS;
+
 // Graphics workload submit type. Used for rendering workloads.
 typedef enum _XGL_RENDER_PASS_OPERATION
 {
@@ -882,7 +932,7 @@ typedef enum _XGL_STRUCTURE_TYPE
     XGL_STRUCTURE_TYPE_SHADER_CREATE_INFO                   = 12,
     XGL_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO         = 13,
     XGL_STRUCTURE_TYPE_SAMPLER_CREATE_INFO                  = 14,
-    XGL_STRUCTURE_TYPE_DESCRIPTOR_SET_CREATE_INFO           = 15,
+    XGL_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO    = 15,
     XGL_STRUCTURE_TYPE_DYNAMIC_VP_STATE_CREATE_INFO         = 16,
     XGL_STRUCTURE_TYPE_DYNAMIC_RS_STATE_CREATE_INFO         = 17,
     XGL_STRUCTURE_TYPE_DYNAMIC_CB_STATE_CREATE_INFO         = 18,
@@ -915,6 +965,12 @@ typedef enum _XGL_STRUCTURE_TYPE
     XGL_STRUCTURE_TYPE_MEMORY_BARRIER                       = 45,
     XGL_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER                = 46,
     XGL_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER                 = 47,
+    XGL_STRUCTURE_TYPE_DESCRIPTOR_REGION_CREATE_INFO        = 48,
+    XGL_STRUCTURE_TYPE_UPDATE_SAMPLERS                      = 49,
+    XGL_STRUCTURE_TYPE_UPDATE_SAMPLER_TEXTURES              = 50,
+    XGL_STRUCTURE_TYPE_UPDATE_IMAGES                        = 51,
+    XGL_STRUCTURE_TYPE_UPDATE_BUFFERS                       = 52,
+    XGL_STRUCTURE_TYPE_UPDATE_AS_COPY                       = 53,
     XGL_MAX_ENUM(_XGL_STRUCTURE_TYPE)
 } XGL_STRUCTURE_TYPE;
 
@@ -1299,6 +1355,60 @@ typedef struct _XGL_IMAGE_VIEW_ATTACH_INFO
     XGL_IMAGE_LAYOUT                        layout;
 } XGL_IMAGE_VIEW_ATTACH_INFO;
 
+typedef struct _XGL_UPDATE_SAMPLERS
+{
+    XGL_STRUCTURE_TYPE                      sType;
+    XGL_VOID*                               pNext;
+    XGL_UINT                                index;
+    XGL_UINT                                count;
+    const XGL_SAMPLER*                      pSamplers;
+} XGL_UPDATE_SAMPLERS;
+
+typedef struct _XGL_SAMPLER_IMAGE_VIEW_INFO
+{
+    XGL_SAMPLER                             pSampler;
+    const XGL_IMAGE_VIEW_ATTACH_INFO*       pImageView;
+} XGL_SAMPLER_IMAGE_VIEW_INFO;
+
+typedef struct _XGL_UPDATE_SAMPLER_TEXTURES
+{
+    XGL_STRUCTURE_TYPE                       sType;
+    XGL_VOID*                                pNext;
+    XGL_UINT                                 index;
+    XGL_UINT                                 count;
+    const XGL_SAMPLER_IMAGE_VIEW_INFO*       pSamplerImageViews;
+} XGL_UPDATE_SAMPLER_TEXTURES;
+
+typedef struct _XGL_UPDATE_IMAGES
+{
+    XGL_STRUCTURE_TYPE                       sType;
+    XGL_VOID*                                pNext;
+    XGL_DESCRIPTOR_TYPE                      descriptorType;
+    XGL_UINT                                 index;
+    XGL_UINT                                 count;
+    const XGL_IMAGE_VIEW_ATTACH_INFO* const* pImageViews;
+} XGL_UPDATE_IMAGES;
+
+typedef struct _XGL_UPDATE_BUFFERS
+{
+    XGL_STRUCTURE_TYPE                        sType;
+    XGL_VOID*                                 pNext;
+    XGL_DESCRIPTOR_TYPE                       descriptorType;
+    XGL_UINT                                  index;
+    XGL_UINT                                  count;
+    const XGL_BUFFER_VIEW_ATTACH_INFO* const* pBufferViews;
+} XGL_UPDATE_BUFFERS;
+
+typedef struct _XGL_UPDATE_AS_COPY
+{
+    XGL_STRUCTURE_TYPE                      sType;
+    const XGL_VOID*                         pNext;
+    XGL_DESCRIPTOR_TYPE                     descriptorType;
+    XGL_DESCRIPTOR_SET                      descriptorSet;
+    XGL_UINT                                descriptorIndex;
+    XGL_UINT                                count;
+} XGL_UPDATE_AS_COPY;
+
 typedef struct _XGL_BUFFER_CREATE_INFO
 {
     XGL_STRUCTURE_TYPE                      sType;                      // Must be XGL_STRUCTURE_TYPE_BUFFER_CREATE_INFO
@@ -1531,23 +1641,29 @@ typedef struct _XGL_SHADER_CREATE_INFO
     XGL_FLAGS                               flags;              // Reserved
 } XGL_SHADER_CREATE_INFO;
 
-struct _XGL_DESCRIPTOR_SET_MAPPING;
+typedef struct _XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO
+{
+    XGL_STRUCTURE_TYPE                      sType;
+    const XGL_VOID*                         pNext;
+    XGL_DESCRIPTOR_TYPE                     descriptorType;
+    XGL_UINT                                count;
+    XGL_FLAGS                               stageFlags;         // XGL_SHADER_STAGE_FLAGS
+    XGL_SAMPLER                             immutableSampler;
+} XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
 
-typedef struct _XGL_DESCRIPTOR_SLOT_INFO
+typedef struct _XGL_DESCRIPTOR_TYPE_COUNT
 {
-    XGL_DESCRIPTOR_SET_SLOT_TYPE slotObjectType;
-    union
-    {
-        XGL_UINT                                  shaderEntityIndex;// Shader IL slot index for given entity type
-        const struct _XGL_DESCRIPTOR_SET_MAPPING* pNextLevelSet;    // Pointer to next descriptor set level
-    };
-} XGL_DESCRIPTOR_SLOT_INFO;
+    XGL_DESCRIPTOR_TYPE                     type;
+    XGL_UINT                                count;
+} XGL_DESCRIPTOR_TYPE_COUNT;
 
-typedef struct _XGL_DESCRIPTOR_SET_MAPPING
+typedef struct _XGL_DESCRIPTOR_REGION_CREATE_INFO
 {
-    XGL_UINT                                    descriptorCount;
-    const XGL_DESCRIPTOR_SLOT_INFO*             pDescriptorInfo;
-} XGL_DESCRIPTOR_SET_MAPPING;
+    XGL_STRUCTURE_TYPE                      sType;
+    const XGL_VOID*                         pNext;
+    XGL_UINT                                count;
+    const XGL_DESCRIPTOR_TYPE_COUNT*        pTypeCount;
+} XGL_DESCRIPTOR_REGION_CREATE_INFO;
 
 typedef struct _XGL_LINK_CONST_BUFFER
 {
@@ -1556,21 +1672,12 @@ typedef struct _XGL_LINK_CONST_BUFFER
     const XGL_VOID*                             pBufferData;
 } XGL_LINK_CONST_BUFFER;
 
-typedef struct _XGL_DYNAMIC_BUFFER_VIEW_SLOT_INFO
-{
-    XGL_DESCRIPTOR_SET_SLOT_TYPE            slotObjectType;
-    XGL_UINT                                shaderEntityIndex;
-} XGL_DYNAMIC_BUFFER_VIEW_SLOT_INFO;
-
 typedef struct _XGL_PIPELINE_SHADER
 {
     XGL_PIPELINE_SHADER_STAGE               stage;
     XGL_SHADER                              shader;
-    XGL_UINT                                descriptorSetMappingCount;
-    XGL_DESCRIPTOR_SET_MAPPING*             pDescriptorSetMapping;
     XGL_UINT                                linkConstBufferCount;
     const XGL_LINK_CONST_BUFFER*            pLinkConstBufferInfo;
-    XGL_DYNAMIC_BUFFER_VIEW_SLOT_INFO       dynamicBufferViewMapping;
 } XGL_PIPELINE_SHADER;
 
 typedef struct _XGL_COMPUTE_PIPELINE_CREATE_INFO
@@ -1579,6 +1686,7 @@ typedef struct _XGL_COMPUTE_PIPELINE_CREATE_INFO
     const XGL_VOID*                         pNext;      // Pointer to next structure
     XGL_PIPELINE_SHADER                     cs;
     XGL_FLAGS                               flags;      // XGL_PIPELINE_CREATE_FLAGS
+    XGL_DESCRIPTOR_SET_LAYOUT               lastSetLayout;
 } XGL_COMPUTE_PIPELINE_CREATE_INFO;
 
 typedef struct _XGL_VERTEX_INPUT_BINDING_DESCRIPTION
@@ -1723,6 +1831,7 @@ typedef struct _XGL_GRAPHICS_PIPELINE_CREATE_INFO
     XGL_STRUCTURE_TYPE                      sType;      // Must be XGL_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO
     const XGL_VOID*                         pNext;      // Pointer to next structure
     XGL_FLAGS                               flags;      // XGL_PIPELINE_CREATE_FLAGS
+    XGL_DESCRIPTOR_SET_LAYOUT               lastSetLayout;
 } XGL_GRAPHICS_PIPELINE_CREATE_INFO;
 
 typedef struct _XGL_SAMPLER_CREATE_INFO
@@ -1743,19 +1852,6 @@ typedef struct _XGL_SAMPLER_CREATE_INFO
     XGL_BORDER_COLOR_TYPE                   borderColorType;
 } XGL_SAMPLER_CREATE_INFO;
 
-typedef struct _XGL_DESCRIPTOR_SET_CREATE_INFO
-{
-    XGL_STRUCTURE_TYPE                      sType;      // Must be XGL_STRUCTURE_TYPE_DESCRIPTOR_SET_CREATE_INFO
-    const XGL_VOID*                         pNext;      // Pointer to next structure
-    XGL_UINT                                slots;
-} XGL_DESCRIPTOR_SET_CREATE_INFO;
-
-typedef struct _XGL_DESCRIPTOR_SET_ATTACH_INFO
-{
-    XGL_DESCRIPTOR_SET                      descriptorSet;
-    XGL_UINT                                slotOffset;
-} XGL_DESCRIPTOR_SET_ATTACH_INFO;
-
 typedef struct _XGL_DYNAMIC_VP_STATE_CREATE_INFO
 {
     XGL_STRUCTURE_TYPE                      sType;      // Must be XGL_STRUCTURE_TYPE_DYNAMIC_VP_STATE_CREATE_INFO
@@ -2015,14 +2111,14 @@ typedef XGL_RESULT (XGLAPI *xglStorePipelineType)(XGL_PIPELINE pipeline, XGL_SIZ
 typedef XGL_RESULT (XGLAPI *xglLoadPipelineType)(XGL_DEVICE device, XGL_SIZE dataSize, const XGL_VOID* pData, XGL_PIPELINE* pPipeline);
 typedef XGL_RESULT (XGLAPI *xglCreatePipelineDeltaType)(XGL_DEVICE device, XGL_PIPELINE p1, XGL_PIPELINE p2, XGL_PIPELINE_DELTA* delta);
 typedef XGL_RESULT (XGLAPI *xglCreateSamplerType)(XGL_DEVICE device, const XGL_SAMPLER_CREATE_INFO* pCreateInfo, XGL_SAMPLER* pSampler);
-typedef XGL_RESULT (XGLAPI *xglCreateDescriptorSetType)(XGL_DEVICE device, const XGL_DESCRIPTOR_SET_CREATE_INFO* pCreateInfo, XGL_DESCRIPTOR_SET* pDescriptorSet);
-typedef XGL_VOID (XGLAPI *xglBeginDescriptorSetUpdateType)(XGL_DESCRIPTOR_SET descriptorSet);
-typedef XGL_VOID (XGLAPI *xglEndDescriptorSetUpdateType)(XGL_DESCRIPTOR_SET descriptorSet);
-typedef XGL_VOID (XGLAPI *xglAttachSamplerDescriptorsType)(XGL_DESCRIPTOR_SET descriptorSet, XGL_UINT startSlot, XGL_UINT slotCount, const XGL_SAMPLER* pSamplers);
-typedef XGL_VOID (XGLAPI *xglAttachImageViewDescriptorsType)(XGL_DESCRIPTOR_SET descriptorSet, XGL_UINT startSlot, XGL_UINT slotCount, const XGL_IMAGE_VIEW_ATTACH_INFO* pImageViews);
-typedef XGL_VOID (XGLAPI *xglAttachBufferViewDescriptorsType)(XGL_DESCRIPTOR_SET descriptorSet, XGL_UINT startSlot, XGL_UINT slotCount, const XGL_BUFFER_VIEW_ATTACH_INFO* pBufferViews);
-typedef XGL_VOID (XGLAPI *xglAttachNestedDescriptorsType)(XGL_DESCRIPTOR_SET descriptorSet, XGL_UINT startSlot, XGL_UINT slotCount, const XGL_DESCRIPTOR_SET_ATTACH_INFO* pNestedDescriptorSets);
-typedef XGL_VOID (XGLAPI *xglClearDescriptorSetSlotsType)(XGL_DESCRIPTOR_SET descriptorSet, XGL_UINT startSlot, XGL_UINT slotCount);
+typedef XGL_RESULT (XGLAPI *xglCreateDescriptorSetLayoutType)(XGL_DEVICE device, XGL_FLAGS stageFlags, const XGL_UINT* pSetBindPoints, XGL_DESCRIPTOR_SET_LAYOUT priorSetLayout, const XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO* pSetLayoutInfoList, XGL_DESCRIPTOR_SET_LAYOUT* pSetLayout);
+typedef XGL_RESULT (XGLAPI *xglBeginDescriptorRegionUpdateType)(XGL_DEVICE device, XGL_DESCRIPTOR_UPDATE_MODE updateMode);
+typedef XGL_RESULT (XGLAPI *xglEndDescriptorRegionUpdateType)(XGL_DEVICE device, XGL_CMD_BUFFER cmd);
+typedef XGL_RESULT (XGLAPI *xglCreateDescriptorRegionType)(XGL_DEVICE device, XGL_DESCRIPTOR_REGION_USAGE regionUsage, XGL_UINT maxSets, const XGL_DESCRIPTOR_REGION_CREATE_INFO* pCreateInfo, XGL_DESCRIPTOR_REGION* pDescriptorRegion);
+typedef XGL_RESULT (XGLAPI *xglClearDescriptorRegionType)(XGL_DESCRIPTOR_REGION descriptorRegion);
+typedef XGL_RESULT (XGLAPI *xglAllocDescriptorSetsType)(XGL_DESCRIPTOR_REGION descriptorRegion, XGL_DESCRIPTOR_SET_USAGE setUsage, XGL_UINT count, const XGL_DESCRIPTOR_SET_LAYOUT* pSetLayouts, XGL_DESCRIPTOR_SET* pDescriptorSets, XGL_UINT* pCount);
+typedef XGL_VOID (XGLAPI *xglClearDescriptorSetsType)(XGL_DESCRIPTOR_REGION descriptorRegion, XGL_UINT count, const XGL_DESCRIPTOR_SET* pDescriptorSets);
+typedef XGL_VOID (XGLAPI *xglUpdateDescriptorsType)(XGL_DESCRIPTOR_SET descriptorSet, const XGL_VOID* pUpdateChain);
 typedef XGL_RESULT (XGLAPI *xglCreateDynamicViewportStateType)(XGL_DEVICE device, const XGL_DYNAMIC_VP_STATE_CREATE_INFO* pCreateInfo, XGL_DYNAMIC_VP_STATE_OBJECT* pState);
 typedef XGL_RESULT (XGLAPI *xglCreateDynamicRasterStateType)(XGL_DEVICE device, const XGL_DYNAMIC_RS_STATE_CREATE_INFO* pCreateInfo, XGL_DYNAMIC_RS_STATE_OBJECT* pState);
 typedef XGL_RESULT (XGLAPI *xglCreateDynamicColorBlendStateType)(XGL_DEVICE device, const XGL_DYNAMIC_CB_STATE_CREATE_INFO* pCreateInfo, XGL_DYNAMIC_CB_STATE_OBJECT* pState);
@@ -2034,8 +2130,7 @@ typedef XGL_RESULT (XGLAPI *xglResetCommandBufferType)(XGL_CMD_BUFFER cmdBuffer)
 typedef XGL_VOID (XGLAPI *xglCmdBindPipelineType)(XGL_CMD_BUFFER cmdBuffer, XGL_PIPELINE_BIND_POINT pipelineBindPoint, XGL_PIPELINE pipeline);
 typedef XGL_VOID (XGLAPI *xglCmdBindPipelineDeltaType)(XGL_CMD_BUFFER cmdBuffer, XGL_PIPELINE_BIND_POINT pipelineBindPoint, XGL_PIPELINE_DELTA delta);
 typedef XGL_VOID (XGLAPI *xglCmdBindDynamicStateObjectType)(XGL_CMD_BUFFER cmdBuffer, XGL_STATE_BIND_POINT stateBindPoint, XGL_DYNAMIC_STATE_OBJECT state);
-typedef XGL_VOID (XGLAPI *xglCmdBindDescriptorSetType)(XGL_CMD_BUFFER cmdBuffer, XGL_PIPELINE_BIND_POINT pipelineBindPoint, XGL_UINT index, XGL_DESCRIPTOR_SET descriptorSet, XGL_UINT slotOffset);
-typedef XGL_VOID (XGLAPI *xglCmdBindDynamicBufferViewType)(XGL_CMD_BUFFER cmdBuffer, XGL_PIPELINE_BIND_POINT pipelineBindPoint, const XGL_BUFFER_VIEW_ATTACH_INFO* pBufferView);
+typedef XGL_VOID (XGLAPI *xglCmdBindDescriptorSetType)(XGL_CMD_BUFFER cmdBuffer, XGL_PIPELINE_BIND_POINT pipelineBindPoint, XGL_DESCRIPTOR_SET descriptorSet, const XGL_UINT* pUserData);
 typedef XGL_VOID (XGLAPI *xglCmdBindVertexBufferType)(XGL_CMD_BUFFER cmdBuffer, XGL_BUFFER buffer, XGL_GPU_SIZE offset, XGL_UINT binding);
 typedef XGL_VOID (XGLAPI *xglCmdBindIndexBufferType)(XGL_CMD_BUFFER cmdBuffer, XGL_BUFFER buffer, XGL_GPU_SIZE offset, XGL_INDEX_TYPE indexType);
 typedef XGL_VOID (XGLAPI *xglCmdDrawType)(XGL_CMD_BUFFER cmdBuffer, XGL_UINT firstVertex, XGL_UINT vertexCount, XGL_UINT firstInstance, XGL_UINT instanceCount);
@@ -2400,45 +2495,48 @@ XGL_RESULT XGLAPI xglCreateSampler(
 
 // Descriptor set functions
 
-XGL_RESULT XGLAPI xglCreateDescriptorSet(
-    XGL_DEVICE                                  device,
-    const XGL_DESCRIPTOR_SET_CREATE_INFO*       pCreateInfo,
-    XGL_DESCRIPTOR_SET*                         pDescriptorSet);
-
-XGL_VOID XGLAPI xglBeginDescriptorSetUpdate(
-    XGL_DESCRIPTOR_SET                          descriptorSet);
-
-XGL_VOID XGLAPI xglEndDescriptorSetUpdate(
-    XGL_DESCRIPTOR_SET                          descriptorSet);
-
-XGL_VOID XGLAPI xglAttachSamplerDescriptors(
-    XGL_DESCRIPTOR_SET                          descriptorSet,
-    XGL_UINT                                    startSlot,
-    XGL_UINT                                    slotCount,
-    const XGL_SAMPLER*                          pSamplers);
-
-XGL_VOID XGLAPI xglAttachImageViewDescriptors(
-    XGL_DESCRIPTOR_SET                          descriptorSet,
-    XGL_UINT                                    startSlot,
-    XGL_UINT                                    slotCount,
-    const XGL_IMAGE_VIEW_ATTACH_INFO*           pImageViews);
-
-XGL_VOID XGLAPI xglAttachBufferViewDescriptors(
-    XGL_DESCRIPTOR_SET                          descriptorSet,
-    XGL_UINT                                    startSlot,
-    XGL_UINT                                    slotCount,
-    const XGL_BUFFER_VIEW_ATTACH_INFO*          pBufferViews);
-
-XGL_VOID XGLAPI xglAttachNestedDescriptors(
-    XGL_DESCRIPTOR_SET                          descriptorSet,
-    XGL_UINT                                    startSlot,
-    XGL_UINT                                    slotCount,
-    const XGL_DESCRIPTOR_SET_ATTACH_INFO*       pNestedDescriptorSets);
-
-XGL_VOID XGLAPI xglClearDescriptorSetSlots(
-    XGL_DESCRIPTOR_SET                          descriptorSet,
-    XGL_UINT                                    startSlot,
-    XGL_UINT                                    slotCount);
+XGL_RESULT XGLAPI xglCreateDescriptorSetLayout(
+    XGL_DEVICE                                   device,
+    XGL_FLAGS                                    stageFlags,            // XGL_SHADER_STAGE_FLAGS
+    const XGL_UINT*                              pSetBindPoints,
+    XGL_DESCRIPTOR_SET_LAYOUT                    priorSetLayout,
+    const XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO* pSetLayoutInfoList,
+    XGL_DESCRIPTOR_SET_LAYOUT*                   pSetLayout);
+
+XGL_RESULT XGLAPI xglBeginDescriptorRegionUpdate(
+    XGL_DEVICE                                   device,
+    XGL_DESCRIPTOR_UPDATE_MODE                   updateMode);
+
+XGL_RESULT XGLAPI xglEndDescriptorRegionUpdate(
+    XGL_DEVICE                                   device,
+    XGL_CMD_BUFFER                               cmd);
+
+XGL_RESULT XGLAPI xglCreateDescriptorRegion(
+    XGL_DEVICE                                   device,
+    XGL_DESCRIPTOR_REGION_USAGE                  regionUsage,
+    XGL_UINT                                     maxSets,
+    const XGL_DESCRIPTOR_REGION_CREATE_INFO*     pCreateInfo,
+    XGL_DESCRIPTOR_REGION*                       pDescriptorRegion);
+
+XGL_RESULT XGLAPI xglClearDescriptorRegion(
+    XGL_DESCRIPTOR_REGION                        descriptorRegion);
+
+XGL_RESULT XGLAPI xglAllocDescriptorSets(
+    XGL_DESCRIPTOR_REGION                        descriptorRegion,
+    XGL_DESCRIPTOR_SET_USAGE                     setUsage,
+    XGL_UINT                                     count,
+    const XGL_DESCRIPTOR_SET_LAYOUT*             pSetLayouts,
+    XGL_DESCRIPTOR_SET*                          pDescriptorSets,
+    XGL_UINT*                                    pCount);
+
+XGL_VOID XGLAPI xglClearDescriptorSets(
+    XGL_DESCRIPTOR_REGION                        descriptorRegion,
+    XGL_UINT                                     count,
+    const XGL_DESCRIPTOR_SET*                    pDescriptorSets);
+
+XGL_VOID XGLAPI xglUpdateDescriptors(
+    XGL_DESCRIPTOR_SET                           descriptorSet,
+    const XGL_VOID*                              pUpdateChain);
 
 // State object functions
 
@@ -2499,14 +2597,8 @@ XGL_VOID XGLAPI xglCmdBindDynamicStateObject(
 XGL_VOID XGLAPI xglCmdBindDescriptorSet(
     XGL_CMD_BUFFER                              cmdBuffer,
     XGL_PIPELINE_BIND_POINT                     pipelineBindPoint,
-    XGL_UINT                                    index,
     XGL_DESCRIPTOR_SET                          descriptorSet,
-    XGL_UINT                                    slotOffset);
-
-XGL_VOID XGLAPI xglCmdBindDynamicBufferView(
-    XGL_CMD_BUFFER                              cmdBuffer,
-    XGL_PIPELINE_BIND_POINT                     pipelineBindPoint,
-    const XGL_BUFFER_VIEW_ATTACH_INFO*          pBufferView);
+    const XGL_UINT*                             pUserData);
 
 XGL_VOID XGLAPI xglCmdBindVertexBuffer(
     XGL_CMD_BUFFER                              cmdBuffer,
index 3ea8448..f9c82fc 100644 (file)
@@ -89,6 +89,8 @@ typedef enum _XGL_DBG_OBJECT_TYPE
 
     XGL_DBG_OBJECT_BUFFER,
     XGL_DBG_OBJECT_BUFFER_VIEW,
+    XGL_DBG_OBJECT_DESCRIPTOR_SET_LAYOUT,
+    XGL_DBG_OBJECT_DESCRIPTOR_REGION,
 
     XGL_DBG_OBJECT_TYPE_BEGIN_RANGE = XGL_DBG_OBJECT_UNKNOWN,
     XGL_DBG_OBJECT_TYPE_END_RANGE   = XGL_DBG_OBJECT_RENDER_PASS,
index 494d77d..09537dc 100644 (file)
@@ -82,14 +82,14 @@ typedef struct _XGL_LAYER_DISPATCH_TABLE
     xglLoadPipelineType LoadPipeline;
     xglCreatePipelineDeltaType CreatePipelineDelta;
     xglCreateSamplerType CreateSampler;
-    xglCreateDescriptorSetType CreateDescriptorSet;
-    xglBeginDescriptorSetUpdateType BeginDescriptorSetUpdate;
-    xglEndDescriptorSetUpdateType EndDescriptorSetUpdate;
-    xglAttachSamplerDescriptorsType AttachSamplerDescriptors;
-    xglAttachImageViewDescriptorsType AttachImageViewDescriptors;
-    xglAttachBufferViewDescriptorsType AttachBufferViewDescriptors;
-    xglAttachNestedDescriptorsType AttachNestedDescriptors;
-    xglClearDescriptorSetSlotsType ClearDescriptorSetSlots;
+    xglCreateDescriptorSetLayoutType CreateDescriptorSetLayout;
+    xglBeginDescriptorRegionUpdateType BeginDescriptorRegionUpdate;
+    xglEndDescriptorRegionUpdateType EndDescriptorRegionUpdate;
+    xglCreateDescriptorRegionType CreateDescriptorRegion;
+    xglClearDescriptorRegionType ClearDescriptorRegion;
+    xglAllocDescriptorSetsType AllocDescriptorSets;
+    xglClearDescriptorSetsType ClearDescriptorSets;
+    xglUpdateDescriptorsType UpdateDescriptors;
     xglCreateDynamicViewportStateType CreateDynamicViewportState;
     xglCreateDynamicRasterStateType CreateDynamicRasterState;
     xglCreateDynamicColorBlendStateType CreateDynamicColorBlendState;
@@ -102,7 +102,6 @@ typedef struct _XGL_LAYER_DISPATCH_TABLE
     xglCmdBindPipelineDeltaType CmdBindPipelineDelta;
     xglCmdBindDynamicStateObjectType CmdBindDynamicStateObject;
     xglCmdBindDescriptorSetType CmdBindDescriptorSet;
-    xglCmdBindDynamicBufferViewType CmdBindDynamicBufferView;
     xglCmdBindVertexBufferType CmdBindVertexBuffer;
     xglCmdBindIndexBufferType CmdBindIndexBuffer;
     xglCmdDrawType CmdDraw;
index 9da0abd..ffaaa7b 100644 (file)
@@ -266,9 +266,9 @@ void XglRenderTest::GenericDrawPreparation(XglCommandBufferObj *cmdBuffer, XglPi
     cmdBuffer->BindStateObject(XGL_STATE_BIND_VIEWPORT, m_stateViewport);
     cmdBuffer->BindStateObject(XGL_STATE_BIND_COLOR_BLEND, m_colorBlend);
     cmdBuffer->BindStateObject(XGL_STATE_BIND_DEPTH_STENCIL, m_stateDepthStencil);
+    descriptorSet->CreateXGLDescriptorSet(cmdBuffer);
     pipelineobj->CreateXGLPipeline(descriptorSet);
     cmdBuffer->BindPipeline(pipelineobj->GetPipelineHandle());
-    descriptorSet->CreateXGLDescriptorSet();
     cmdBuffer->BindDescriptorSet(descriptorSet->GetDescriptorSetHandle());
 }
 
@@ -465,14 +465,13 @@ void XglRenderTest::XGLTriangleTest(const char *vertShaderText, const char *frag
 
     XglShaderObj vs(m_device,vertShaderText,XGL_SHADER_STAGE_VERTEX, this);
     XglShaderObj ps(m_device,fragShaderText, XGL_SHADER_STAGE_FRAGMENT, this);
-    vs.BindShaderEntitySlotToBuffer(0, XGL_SLOT_SHADER_RESOURCE, &constantBuffer);
 
     XglPipelineObj pipelineobj(m_device);
     pipelineobj.AddShader(&vs);
     pipelineobj.AddShader(&ps);
 
     XglDescriptorSetObj descriptorSet(m_device);
-    descriptorSet.AttachBufferView(&constantBuffer);
+    descriptorSet.AppendBuffer(XGL_DESCRIPTOR_TYPE_UNIFORM_BUFFER, &constantBuffer);
     m_memoryRefManager.AddMemoryRef(&constantBuffer);
 
     ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
@@ -754,7 +753,7 @@ TEST_F(XglRenderTest, TriangleWithVertexFetch)
     pipelineobj.AddShader(&ps);
 
     XglDescriptorSetObj descriptorSet(m_device);
-    descriptorSet.AttachBufferView(&meshBuffer);
+    descriptorSet.AppendBuffer(XGL_DESCRIPTOR_TYPE_UNIFORM_BUFFER, &meshBuffer);
 
     XGL_VERTEX_INPUT_BINDING_DESCRIPTION vi_binding = {
          sizeof(g_vbData[0]),              // strideInBytes;  Distance between vertices in bytes (0 = no advancement)
@@ -1035,7 +1034,7 @@ TEST_F(XglRenderTest, GreyandRedCirclesonBlue)
     pipelineobj.AddShader(&ps);
 
     XglDescriptorSetObj descriptorSet(m_device);
-    descriptorSet.AttachBufferView(&meshBuffer);
+    descriptorSet.AppendBuffer(XGL_DESCRIPTOR_TYPE_UNIFORM_BUFFER, &meshBuffer);
 
     XGL_VERTEX_INPUT_BINDING_DESCRIPTION vi_binding = {
          sizeof(g_vbData[0]),              // strideInBytes;  Distance between vertices in bytes (0 = no advancement)
@@ -1129,7 +1128,7 @@ TEST_F(XglRenderTest, RedCirclesonBlue)
     pipelineobj.AddShader(&ps);
 
     XglDescriptorSetObj descriptorSet(m_device);
-    descriptorSet.AttachBufferView(&meshBuffer);
+    descriptorSet.AppendBuffer(XGL_DESCRIPTOR_TYPE_UNIFORM_BUFFER, &meshBuffer);
 
     XGL_VERTEX_INPUT_BINDING_DESCRIPTION vi_binding = {
          sizeof(g_vbData[0]),              // strideInBytes;  Distance between vertices in bytes (0 = no advancement)
@@ -1233,7 +1232,7 @@ TEST_F(XglRenderTest, GreyCirclesonBlueFade)
     pipelineobj.AddShader(&ps);
 
     XglDescriptorSetObj descriptorSet(m_device);
-    descriptorSet.AttachBufferView(&meshBuffer);
+    descriptorSet.AppendBuffer(XGL_DESCRIPTOR_TYPE_UNIFORM_BUFFER, &meshBuffer);
 
     XGL_VERTEX_INPUT_BINDING_DESCRIPTION vi_binding = {
          sizeof(g_vbData[0]),              // strideInBytes;  Distance between vertices in bytes (0 = no advancement)
@@ -1327,7 +1326,7 @@ TEST_F(XglRenderTest, GreyCirclesonBlueDiscard)
     pipelineobj.AddShader(&ps);
 
     XglDescriptorSetObj descriptorSet(m_device);
-    descriptorSet.AttachBufferView(&meshBuffer);
+    descriptorSet.AppendBuffer(XGL_DESCRIPTOR_TYPE_UNIFORM_BUFFER, &meshBuffer);
 
     XGL_VERTEX_INPUT_BINDING_DESCRIPTION vi_binding = {
          sizeof(g_vbData[0]),              // strideInBytes;  Distance between vertices in bytes (0 = no advancement)
@@ -1412,15 +1411,13 @@ TEST_F(XglRenderTest, TriangleVSUniform)
     XglShaderObj vs(m_device,vertShaderText,XGL_SHADER_STAGE_VERTEX, this);
     XglShaderObj ps(m_device,fragShaderText, XGL_SHADER_STAGE_FRAGMENT, this);
 
-    vs.BindShaderEntitySlotToBuffer(0, XGL_SLOT_SHADER_RESOURCE, &MVPBuffer);
-
     XglPipelineObj pipelineobj(m_device);
     pipelineobj.AddShader(&vs);
     pipelineobj.AddShader(&ps);
 
     // Create descriptor set and attach the constant buffer to it
     XglDescriptorSetObj descriptorSet(m_device);
-    descriptorSet.AttachBufferView(&MVPBuffer);
+    descriptorSet.AppendBuffer(XGL_DESCRIPTOR_TYPE_UNIFORM_BUFFER, &MVPBuffer);
 
     m_memoryRefManager.AddMemoryRef(&MVPBuffer);
 
@@ -1567,7 +1564,7 @@ TEST_F(XglRenderTest, TriVertFetchAndVertID)
     pipelineobj.AddShader(&ps);
 
     XglDescriptorSetObj descriptorSet(m_device);
-    descriptorSet.AttachBufferView(&meshBuffer);
+    descriptorSet.AppendBuffer(XGL_DESCRIPTOR_TYPE_UNIFORM_BUFFER, &meshBuffer);
 
     XGL_VERTEX_INPUT_BINDING_DESCRIPTION vi_binding = {
          sizeof(g_vbData[0]),              // strideInBytes;  Distance between vertices in bytes (0 = no advancement)
@@ -1660,7 +1657,7 @@ TEST_F(XglRenderTest, TriVertFetchDeadAttr)
     pipelineobj.AddShader(&ps);
 
     XglDescriptorSetObj descriptorSet(m_device);
-    descriptorSet.AttachBufferView(&meshBuffer);
+    descriptorSet.AppendBuffer(XGL_DESCRIPTOR_TYPE_UNIFORM_BUFFER, &meshBuffer);
 
     XGL_VERTEX_INPUT_BINDING_DESCRIPTION vi_binding = {
          sizeof(g_vbData[0]),              // strideInBytes;  Distance between vertices in bytes (0 = no advancement)
@@ -1751,8 +1748,6 @@ TEST_F(XglRenderTest, CubeWithVertexFetchAndMVP)
     XglShaderObj vs(m_device,vertShaderText,XGL_SHADER_STAGE_VERTEX, this);
     XglShaderObj ps(m_device,fragShaderText, XGL_SHADER_STAGE_FRAGMENT, this);
 
-    vs.BindShaderEntitySlotToBuffer(0, XGL_SLOT_SHADER_RESOURCE, &MVPBuffer);
-
     XglPipelineObj pipelineobj(m_device);
     pipelineobj.AddShader(&vs);
     pipelineobj.AddShader(&ps);
@@ -1773,7 +1768,7 @@ TEST_F(XglRenderTest, CubeWithVertexFetchAndMVP)
     pipelineobj.SetDepthStencil(&ds_state);
 
     XglDescriptorSetObj descriptorSet(m_device);
-    descriptorSet.AttachBufferView(&MVPBuffer);
+    descriptorSet.AppendBuffer(XGL_DESCRIPTOR_TYPE_UNIFORM_BUFFER, &MVPBuffer);
 
     m_memoryRefManager.AddMemoryRef(&meshBuffer);
     m_memoryRefManager.AddMemoryRef(&MVPBuffer);
@@ -1858,16 +1853,12 @@ TEST_F(XglRenderTest, VSTexture)
     XglSamplerObj sampler(m_device);
     XglTextureObj texture(m_device);
 
-    vs.BindShaderEntitySlotToImage(0, XGL_SLOT_SHADER_TEXTURE_RESOURCE, &texture);
-    vs.BindShaderEntitySlotToSampler(0, &sampler);
-
     XglPipelineObj pipelineobj(m_device);
     pipelineobj.AddShader(&vs);
     pipelineobj.AddShader(&ps);
 
     XglDescriptorSetObj descriptorSet(m_device);
-    descriptorSet.AttachImageView(&texture);
-    descriptorSet.AttachSampler(&sampler);
+    descriptorSet.AppendSamplerTexture(&sampler, &texture);
 
     m_memoryRefManager.AddMemoryRef(&texture);
 
@@ -1934,16 +1925,12 @@ TEST_F(XglRenderTest, TexturedTriangle)
     XglSamplerObj sampler(m_device);
     XglTextureObj texture(m_device);
 
-    ps.BindShaderEntitySlotToImage(0, XGL_SLOT_SHADER_TEXTURE_RESOURCE, &texture);
-    ps.BindShaderEntitySlotToSampler(0, &sampler);
-
     XglPipelineObj pipelineobj(m_device);
     pipelineobj.AddShader(&vs);
     pipelineobj.AddShader(&ps);
 
     XglDescriptorSetObj descriptorSet(m_device);
-    descriptorSet.AttachImageView(&texture);
-    descriptorSet.AttachSampler(&sampler);
+    descriptorSet.AppendSamplerTexture(&sampler, &texture);
 
     m_memoryRefManager.AddMemoryRef(&texture);
 
@@ -2021,16 +2008,12 @@ TEST_F(XglRenderTest, TexturedTriangleClip)
     XglSamplerObj sampler(m_device);
     XglTextureObj texture(m_device);
 
-    ps.BindShaderEntitySlotToImage(0, XGL_SLOT_SHADER_TEXTURE_RESOURCE, &texture);
-    ps.BindShaderEntitySlotToSampler(0, &sampler);
-
     XglPipelineObj pipelineobj(m_device);
     pipelineobj.AddShader(&vs);
     pipelineobj.AddShader(&ps);
 
     XglDescriptorSetObj descriptorSet(m_device);
-    descriptorSet.AttachImageView(&texture);
-    descriptorSet.AttachSampler(&sampler);
+    descriptorSet.AppendSamplerTexture(&sampler, &texture);
 
     m_memoryRefManager.AddMemoryRef(&texture);
 
@@ -2097,16 +2080,12 @@ TEST_F(XglRenderTest, FSTriangle)
     XglSamplerObj sampler(m_device);
     XglTextureObj texture(m_device);
 
-    ps.BindShaderEntitySlotToImage(0, XGL_SLOT_SHADER_TEXTURE_RESOURCE, &texture);
-    ps.BindShaderEntitySlotToSampler(0, &sampler);
-
     XglPipelineObj pipelineobj(m_device);
     pipelineobj.AddShader(&vs);
     pipelineobj.AddShader(&ps);
 
     XglDescriptorSetObj descriptorSet(m_device);
-    descriptorSet.AttachImageView(&texture);
-    descriptorSet.AttachSampler(&sampler);
+    descriptorSet.AppendSamplerTexture(&sampler, &texture);
 
     m_memoryRefManager.AddMemoryRef(&texture);
 
@@ -2188,26 +2167,16 @@ TEST_F(XglRenderTest, SamplerBindingsTriangle)
     XglTextureObj texture3(m_device); // Blue
     texture3.ChangeColors(0xff0000ff,0xff0000ff);
 
-    ps.BindShaderEntitySlotToImage(0, XGL_SLOT_SHADER_TEXTURE_RESOURCE, &texture1);
-    ps.BindShaderEntitySlotToSampler(0, &sampler1);
-
-    ps.BindShaderEntitySlotToImage(1, XGL_SLOT_SHADER_TEXTURE_RESOURCE, &texture2);
-    ps.BindShaderEntitySlotToSampler(1, &sampler2);
-
-    ps.BindShaderEntitySlotToImage(12, XGL_SLOT_SHADER_TEXTURE_RESOURCE, &texture3);
-    ps.BindShaderEntitySlotToSampler(12, &sampler3);
-
     XglPipelineObj pipelineobj(m_device);
     pipelineobj.AddShader(&vs);
     pipelineobj.AddShader(&ps);
 
     XglDescriptorSetObj descriptorSet(m_device);
-    descriptorSet.AttachImageView(&texture1);
-    descriptorSet.AttachSampler(&sampler1);
-    descriptorSet.AttachImageView(&texture2);
-    descriptorSet.AttachSampler(&sampler2);
-    descriptorSet.AttachImageView(&texture3);
-    descriptorSet.AttachSampler(&sampler3);
+    descriptorSet.AppendSamplerTexture(&sampler1, &texture1);
+    descriptorSet.AppendSamplerTexture(&sampler2, &texture2);
+    for (int i = 0; i < 10; i++)
+        descriptorSet.AppendDummy();
+    descriptorSet.AppendSamplerTexture(&sampler3, &texture3);
 
     m_memoryRefManager.AddMemoryRef(&texture1);
     m_memoryRefManager.AddMemoryRef(&texture2);
@@ -2288,14 +2257,13 @@ TEST_F(XglRenderTest, TriangleVSUniformBlock)
                                          1.0, 1.0, 1.0, 1.0 };
 
     XglConstantBufferObj colorBuffer(m_device, valCount, sizeof(bufferVals[0]), (const void*) bufferVals);
-    vs.BindShaderEntitySlotToBuffer(0, XGL_SLOT_SHADER_RESOURCE, &colorBuffer);
 
     XglPipelineObj pipelineobj(m_device);
     pipelineobj.AddShader(&vs);
     pipelineobj.AddShader(&ps);
 
     XglDescriptorSetObj descriptorSet(m_device);
-    descriptorSet.AttachBufferView(&colorBuffer);
+    descriptorSet.AppendBuffer(XGL_DESCRIPTOR_TYPE_UNIFORM_BUFFER, &colorBuffer);
 
     ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
     XglCommandBufferObj cmdBuffer(m_device);
@@ -2350,7 +2318,7 @@ TEST_F(XglRenderTest, TriangleFSUniformBlockBinding)
             "layout (std140, binding = 0) uniform redVal   { vec4 color; } myRedVal\n;"
             "layout (std140, binding = 1) uniform greenVal { vec4 color; } myGreenVal\n;"
             "layout (std140, binding = 2) uniform blueVal  { vec4 color; } myBlueVal\n;"
-            "layout (std140, binding = 18) uniform whiteVal { vec4 color; } myWhiteVal\n;"
+            "layout (std140, binding = 3) uniform whiteVal { vec4 color; } myWhiteVal\n;"
             "void main() {\n"
             "   gl_FragColor = myBlueVal.color;\n"
             "   gl_FragColor += myRedVal.color;\n"
@@ -2369,7 +2337,7 @@ TEST_F(XglRenderTest, TriangleFSUniformBlockBinding)
     //    layout (std140, binding = 0) uniform bufferVals { vec4 red;   } myRedVal;
     //    layout (std140, binding = 1) uniform bufferVals { vec4 green; } myGreenVal;
     //    layout (std140, binding = 2) uniform bufferVals { vec4 blue;  } myBlueVal;
-    //    layout (std140, binding = 18) uniform bufferVals { vec4 white; } myWhiteVal;
+    //    layout (std140, binding = 3) uniform bufferVals { vec4 white; } myWhiteVal;
 
     const float redVals[4]   = { 1.0, 0.0, 0.0, 1.0 };
     const float greenVals[4] = { 0.0, 1.0, 0.0, 1.0 };
@@ -2382,26 +2350,22 @@ TEST_F(XglRenderTest, TriangleFSUniformBlockBinding)
     const int whiteCount = sizeof(whiteVals) / sizeof(float);
 
     XglConstantBufferObj redBuffer(m_device, redCount, sizeof(redVals[0]), (const void*) redVals);
-    ps.BindShaderEntitySlotToBuffer(0, XGL_SLOT_SHADER_RESOURCE, &redBuffer);
 
     XglConstantBufferObj greenBuffer(m_device, greenCount, sizeof(greenVals[0]), (const void*) greenVals);
-    ps.BindShaderEntitySlotToBuffer(1, XGL_SLOT_SHADER_RESOURCE, &greenBuffer);
 
     XglConstantBufferObj blueBuffer(m_device, blueCount, sizeof(blueVals[0]), (const void*) blueVals);
-    ps.BindShaderEntitySlotToBuffer(2, XGL_SLOT_SHADER_RESOURCE, &blueBuffer);
 
     XglConstantBufferObj whiteBuffer(m_device, whiteCount, sizeof(whiteVals[0]), (const void*) whiteVals);
-    ps.BindShaderEntitySlotToBuffer(18, XGL_SLOT_SHADER_RESOURCE, &whiteBuffer);
 
     XglPipelineObj pipelineobj(m_device);
     pipelineobj.AddShader(&vs);
     pipelineobj.AddShader(&ps);
 
     XglDescriptorSetObj descriptorSet(m_device);
-    descriptorSet.AttachBufferView(&redBuffer);
-    descriptorSet.AttachBufferView(&greenBuffer);
-    descriptorSet.AttachBufferView(&blueBuffer);
-    descriptorSet.AttachBufferView(&whiteBuffer);
+    descriptorSet.AppendBuffer(XGL_DESCRIPTOR_TYPE_UNIFORM_BUFFER, &redBuffer);
+    descriptorSet.AppendBuffer(XGL_DESCRIPTOR_TYPE_UNIFORM_BUFFER, &greenBuffer);
+    descriptorSet.AppendBuffer(XGL_DESCRIPTOR_TYPE_UNIFORM_BUFFER, &blueBuffer);
+    descriptorSet.AppendBuffer(XGL_DESCRIPTOR_TYPE_UNIFORM_BUFFER, &whiteBuffer);
 
     ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
     XglCommandBufferObj cmdBuffer(m_device);
@@ -2451,7 +2415,7 @@ TEST_F(XglRenderTest, TriangleFSAnonymousUniformBlockBinding)
             "layout (std140, binding = 0) uniform redVal   { vec4 red; };"
             "layout (std140, binding = 1) uniform greenVal { vec4 green; };"
             "layout (std140, binding = 2) uniform blueVal  { vec4 blue; };"
-            "layout (std140, binding = 18) uniform whiteVal { vec4 white; };"
+            "layout (std140, binding = 3) uniform whiteVal { vec4 white; };"
             "layout (location = 0) out vec4 outColor;\n"
             "void main() {\n"
             "   outColor = blue;\n"
@@ -2483,26 +2447,22 @@ TEST_F(XglRenderTest, TriangleFSAnonymousUniformBlockBinding)
     const int whiteCount = sizeof(whiteVals) / sizeof(float);
 
     XglConstantBufferObj redBuffer(m_device, redCount, sizeof(redVals[0]), (const void*) redVals);
-    ps.BindShaderEntitySlotToBuffer(0, XGL_SLOT_SHADER_RESOURCE, &redBuffer);
 
     XglConstantBufferObj greenBuffer(m_device, greenCount, sizeof(greenVals[0]), (const void*) greenVals);
-    ps.BindShaderEntitySlotToBuffer(1, XGL_SLOT_SHADER_RESOURCE, &greenBuffer);
 
     XglConstantBufferObj blueBuffer(m_device, blueCount, sizeof(blueVals[0]), (const void*) blueVals);
-    ps.BindShaderEntitySlotToBuffer(2, XGL_SLOT_SHADER_RESOURCE, &blueBuffer);
 
     XglConstantBufferObj whiteBuffer(m_device, whiteCount, sizeof(whiteVals[0]), (const void*) whiteVals);
-    ps.BindShaderEntitySlotToBuffer(18, XGL_SLOT_SHADER_RESOURCE, &whiteBuffer);
 
     XglPipelineObj pipelineobj(m_device);
     pipelineobj.AddShader(&vs);
     pipelineobj.AddShader(&ps);
 
     XglDescriptorSetObj descriptorSet(m_device);
-    descriptorSet.AttachBufferView(&redBuffer);
-    descriptorSet.AttachBufferView(&greenBuffer);
-    descriptorSet.AttachBufferView(&blueBuffer);
-    descriptorSet.AttachBufferView(&whiteBuffer);
+    descriptorSet.AppendBuffer(XGL_DESCRIPTOR_TYPE_UNIFORM_BUFFER, &redBuffer);
+    descriptorSet.AppendBuffer(XGL_DESCRIPTOR_TYPE_UNIFORM_BUFFER, &greenBuffer);
+    descriptorSet.AppendBuffer(XGL_DESCRIPTOR_TYPE_UNIFORM_BUFFER, &blueBuffer);
+    descriptorSet.AppendBuffer(XGL_DESCRIPTOR_TYPE_UNIFORM_BUFFER, &whiteBuffer);
 
     ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
     XglCommandBufferObj cmdBuffer(m_device);
@@ -2552,7 +2512,7 @@ TEST_F(XglRenderTest, CubeWithVertexFetchAndMVPAndTexture)
             "#version 140\n"
             "#extension GL_ARB_separate_shader_objects : enable\n"
             "#extension GL_ARB_shading_language_420pack : enable\n"
-            "layout (binding=0) uniform sampler2D surface;\n"
+            "layout (binding=1) uniform sampler2D surface;\n"
             "layout (location=0) out vec4 outColor;\n"
             "layout (location=0) in vec2 UV;\n"
             "void main() {\n"
@@ -2587,20 +2547,13 @@ TEST_F(XglRenderTest, CubeWithVertexFetchAndMVPAndTexture)
     XglSamplerObj sampler(m_device);
     XglTextureObj texture(m_device);
 
-    // vs.BindShaderEntitySlotToBuffer(0, XGL_SLOT_VERTEX_INPUT, (XGL_OBJECT) &meshBuffer.m_constantBufferView);
-    vs.BindShaderEntitySlotToBuffer(0, XGL_SLOT_SHADER_RESOURCE, &mvpBuffer);
-    ps.BindShaderEntitySlotToImage(0, XGL_SLOT_SHADER_TEXTURE_RESOURCE, &texture);
-    ps.BindShaderEntitySlotToSampler(0, &sampler);
-
     XglPipelineObj pipelineobj(m_device);
     pipelineobj.AddShader(&vs);
     pipelineobj.AddShader(&ps);
 
     XglDescriptorSetObj descriptorSet(m_device);
-
-    descriptorSet.AttachBufferView(&mvpBuffer);
-    descriptorSet.AttachImageView(&texture);
-    descriptorSet.AttachSampler(&sampler);
+    descriptorSet.AppendBuffer(XGL_DESCRIPTOR_TYPE_UNIFORM_BUFFER, &mvpBuffer);
+    descriptorSet.AppendSamplerTexture(&sampler, &texture);
 
     m_memoryRefManager.AddMemoryRef(&meshBuffer);
     m_memoryRefManager.AddMemoryRef(&mvpBuffer);
@@ -2689,15 +2642,15 @@ TEST_F(XglRenderTest, TriangleMixedSamplerUniformBlockBinding)
             "#extension GL_ARB_separate_shader_objects : enable\n"
             "#extension GL_ARB_shading_language_420pack : enable\n"
             "layout (binding = 0) uniform sampler2D surface0;\n"
-            "layout (binding = 9) uniform sampler2D surface1;\n"
-            "layout (binding = 2) uniform sampler2D surface2;\n"
-            "layout (binding = 4) uniform sampler2D surface3;\n"
+            "layout (binding = 3) uniform sampler2D surface1;\n"
+            "layout (binding = 1) uniform sampler2D surface2;\n"
+            "layout (binding = 2) uniform sampler2D surface3;\n"
 
 
-            "layout (std140, binding = 10) uniform redVal   { vec4 red; };"
-            "layout (std140, binding = 15) uniform greenVal { vec4 green; };"
-            "layout (std140, binding = 13) uniform blueVal  { vec4 blue; };"
-            "layout (std140, binding = 17) uniform whiteVal { vec4 white; };"
+            "layout (std140, binding = 4) uniform redVal   { vec4 red; };"
+            "layout (std140, binding = 6) uniform greenVal { vec4 green; };"
+            "layout (std140, binding = 5) uniform blueVal  { vec4 blue; };"
+            "layout (std140, binding = 7) uniform whiteVal { vec4 white; };"
             "layout (location = 0) out vec4 outColor;\n"
             "void main() {\n"
             "   outColor = red * vec4(0.00001);\n"
@@ -2722,59 +2675,40 @@ TEST_F(XglRenderTest, TriangleMixedSamplerUniformBlockBinding)
     const int whiteCount = sizeof(whiteVals) / sizeof(float);
 
     XglConstantBufferObj redBuffer(m_device, redCount, sizeof(redVals[0]), (const void*) redVals);
-    ps.BindShaderEntitySlotToBuffer(10, XGL_SLOT_SHADER_RESOURCE, &redBuffer);
-
     XglConstantBufferObj greenBuffer(m_device, greenCount, sizeof(greenVals[0]), (const void*) greenVals);
-    ps.BindShaderEntitySlotToBuffer(15, XGL_SLOT_SHADER_RESOURCE, &greenBuffer);
-
     XglConstantBufferObj blueBuffer(m_device, blueCount, sizeof(blueVals[0]), (const void*) blueVals);
-    ps.BindShaderEntitySlotToBuffer(13, XGL_SLOT_SHADER_RESOURCE, &blueBuffer);
-
     XglConstantBufferObj whiteBuffer(m_device, whiteCount, sizeof(whiteVals[0]), (const void*) whiteVals);
-    ps.BindShaderEntitySlotToBuffer(17, XGL_SLOT_SHADER_RESOURCE, &whiteBuffer);
 
     XglSamplerObj sampler0(m_device);
     XglTextureObj texture0(m_device); // Light Red
     texture0.ChangeColors(0xff800000,0xff800000);
-    ps.BindShaderEntitySlotToImage(0, XGL_SLOT_SHADER_TEXTURE_RESOURCE, &texture0);
-    ps.BindShaderEntitySlotToSampler(0, &sampler0);
     XglSamplerObj sampler2(m_device);
     XglTextureObj texture2(m_device); // Light Blue
     texture2.ChangeColors(0xff000080,0xff000080);
-    ps.BindShaderEntitySlotToImage(2, XGL_SLOT_SHADER_TEXTURE_RESOURCE, &texture2);
-    ps.BindShaderEntitySlotToSampler(2, &sampler2);
     XglSamplerObj sampler4(m_device);
     XglTextureObj texture4(m_device); // Light Green
     texture4.ChangeColors(0xff008000,0xff008000);
-    ps.BindShaderEntitySlotToImage(4, XGL_SLOT_SHADER_TEXTURE_RESOURCE, &texture4);
-    ps.BindShaderEntitySlotToSampler(4, &sampler4);
 
     // NOTE:  Bindings 1,3,5,7,8,9,11,12,14,16 work for this sampler, but 6 does not!!!
     // TODO:  Get back here ASAP and understand why.
     XglSamplerObj sampler7(m_device);
     XglTextureObj texture7(m_device); // Red and Blue
     texture7.ChangeColors(0xffff00ff,0xffff00ff);
-    ps.BindShaderEntitySlotToImage(9, XGL_SLOT_SHADER_TEXTURE_RESOURCE, &texture7);
-    ps.BindShaderEntitySlotToSampler(9, &sampler7);
-
 
     XglPipelineObj pipelineobj(m_device);
     pipelineobj.AddShader(&vs);
     pipelineobj.AddShader(&ps);
 
     XglDescriptorSetObj descriptorSet(m_device);
-    descriptorSet.AttachBufferView(&redBuffer);
-    descriptorSet.AttachBufferView(&greenBuffer);
-    descriptorSet.AttachBufferView(&blueBuffer);
-    descriptorSet.AttachBufferView(&whiteBuffer);
-    descriptorSet.AttachImageView(&texture0);
-    descriptorSet.AttachSampler(&sampler0);
-    descriptorSet.AttachImageView(&texture2);
-    descriptorSet.AttachSampler(&sampler2);
-    descriptorSet.AttachImageView(&texture4);
-    descriptorSet.AttachSampler(&sampler4);
-    descriptorSet.AttachImageView(&texture7);
-    descriptorSet.AttachSampler(&sampler7);
+    descriptorSet.AppendSamplerTexture(&sampler0, &texture0);
+    descriptorSet.AppendSamplerTexture(&sampler2, &texture2);
+    descriptorSet.AppendSamplerTexture(&sampler4, &texture4);
+    descriptorSet.AppendSamplerTexture(&sampler7, &texture7);
+    descriptorSet.AppendBuffer(XGL_DESCRIPTOR_TYPE_UNIFORM_BUFFER, &redBuffer);
+    // swap blue and green
+    descriptorSet.AppendBuffer(XGL_DESCRIPTOR_TYPE_UNIFORM_BUFFER, &blueBuffer);
+    descriptorSet.AppendBuffer(XGL_DESCRIPTOR_TYPE_UNIFORM_BUFFER, &greenBuffer);
+    descriptorSet.AppendBuffer(XGL_DESCRIPTOR_TYPE_UNIFORM_BUFFER, &whiteBuffer);
 
     m_memoryRefManager.AddMemoryRef(&texture0);
     m_memoryRefManager.AddMemoryRef(&texture2);
@@ -2832,10 +2766,10 @@ TEST_F(XglRenderTest, TriangleMatchingSamplerUniformBlockBinding)
             "layout (binding = 1) uniform sampler2D surface1;\n"
             "layout (binding = 2) uniform sampler2D surface2;\n"
             "layout (binding = 3) uniform sampler2D surface3;\n"
-            "layout (std140, binding = 0) uniform redVal   { vec4 red; };"
-            "layout (std140, binding = 1) uniform greenVal { vec4 green; };"
-            "layout (std140, binding = 2) uniform blueVal  { vec4 blue; };"
-            "layout (std140, binding = 3) uniform whiteVal { vec4 white; };"
+            "layout (std140, binding = 4) uniform redVal   { vec4 red; };"
+            "layout (std140, binding = 5) uniform greenVal { vec4 green; };"
+            "layout (std140, binding = 6) uniform blueVal  { vec4 blue; };"
+            "layout (std140, binding = 7) uniform whiteVal { vec4 white; };"
             "layout (location = 0) out vec4 outColor;\n"
             "void main() {\n"
             "   outColor = red;// * vec4(0.00001);\n"
@@ -2860,37 +2794,22 @@ TEST_F(XglRenderTest, TriangleMatchingSamplerUniformBlockBinding)
     const int whiteCount = sizeof(whiteVals) / sizeof(float);
 
     XglConstantBufferObj redBuffer(m_device, redCount, sizeof(redVals[0]), (const void*) redVals);
-    ps.BindShaderEntitySlotToBuffer(0, XGL_SLOT_SHADER_RESOURCE, &redBuffer);
-
     XglConstantBufferObj greenBuffer(m_device, greenCount, sizeof(greenVals[0]), (const void*) greenVals);
-    ps.BindShaderEntitySlotToBuffer(1, XGL_SLOT_SHADER_RESOURCE, &greenBuffer);
-
     XglConstantBufferObj blueBuffer(m_device, blueCount, sizeof(blueVals[0]), (const void*) blueVals);
-    ps.BindShaderEntitySlotToBuffer(2, XGL_SLOT_SHADER_RESOURCE, &blueBuffer);
-
     XglConstantBufferObj whiteBuffer(m_device, whiteCount, sizeof(whiteVals[0]), (const void*) whiteVals);
-    ps.BindShaderEntitySlotToBuffer(3, XGL_SLOT_SHADER_RESOURCE, &whiteBuffer);
 
     XglSamplerObj sampler0(m_device);
     XglTextureObj texture0(m_device); // Light Red
     texture0.ChangeColors(0xff800000,0xff800000);
-    ps.BindShaderEntitySlotToImage(0, XGL_SLOT_SHADER_TEXTURE_RESOURCE, &texture0);
-    ps.BindShaderEntitySlotToSampler(0, &sampler0);
     XglSamplerObj sampler2(m_device);
     XglTextureObj texture2(m_device); // Light Blue
     texture2.ChangeColors(0xff000080,0xff000080);
-    ps.BindShaderEntitySlotToImage(1, XGL_SLOT_SHADER_TEXTURE_RESOURCE, &texture2);
-    ps.BindShaderEntitySlotToSampler(1, &sampler2);
     XglSamplerObj sampler4(m_device);
     XglTextureObj texture4(m_device); // Light Green
     texture4.ChangeColors(0xff008000,0xff008000);
-    ps.BindShaderEntitySlotToImage(2, XGL_SLOT_SHADER_TEXTURE_RESOURCE, &texture4);
-    ps.BindShaderEntitySlotToSampler(2, &sampler4);
     XglSamplerObj sampler7(m_device);
     XglTextureObj texture7(m_device); // Red and Blue
     texture7.ChangeColors(0xffff00ff,0xffff00ff);
-    ps.BindShaderEntitySlotToImage(3, XGL_SLOT_SHADER_TEXTURE_RESOURCE, &texture7);
-    ps.BindShaderEntitySlotToSampler(3, &sampler7);
 
 
     XglPipelineObj pipelineobj(m_device);
@@ -2898,18 +2817,14 @@ TEST_F(XglRenderTest, TriangleMatchingSamplerUniformBlockBinding)
     pipelineobj.AddShader(&ps);
 
     XglDescriptorSetObj descriptorSet(m_device);
-    descriptorSet.AttachBufferView(&redBuffer);
-    descriptorSet.AttachBufferView(&greenBuffer);
-    descriptorSet.AttachBufferView(&blueBuffer);
-    descriptorSet.AttachBufferView(&whiteBuffer);
-    descriptorSet.AttachImageView(&texture0);
-    descriptorSet.AttachSampler(&sampler0);
-    descriptorSet.AttachImageView(&texture2);
-    descriptorSet.AttachSampler(&sampler2);
-    descriptorSet.AttachImageView(&texture4);
-    descriptorSet.AttachSampler(&sampler4);
-    descriptorSet.AttachImageView(&texture7);
-    descriptorSet.AttachSampler(&sampler7);
+    descriptorSet.AppendSamplerTexture(&sampler0, &texture0);
+    descriptorSet.AppendSamplerTexture(&sampler2, &texture2);
+    descriptorSet.AppendSamplerTexture(&sampler4, &texture4);
+    descriptorSet.AppendSamplerTexture(&sampler7, &texture7);
+    descriptorSet.AppendBuffer(XGL_DESCRIPTOR_TYPE_UNIFORM_BUFFER, &redBuffer);
+    descriptorSet.AppendBuffer(XGL_DESCRIPTOR_TYPE_UNIFORM_BUFFER, &greenBuffer);
+    descriptorSet.AppendBuffer(XGL_DESCRIPTOR_TYPE_UNIFORM_BUFFER, &blueBuffer);
+    descriptorSet.AppendBuffer(XGL_DESCRIPTOR_TYPE_UNIFORM_BUFFER, &whiteBuffer);
 
     m_memoryRefManager.AddMemoryRef(&texture0);
     m_memoryRefManager.AddMemoryRef(&texture2);
@@ -3160,15 +3075,13 @@ TEST_F(XglRenderTest, TriangleUniformBufferLayout)
     XglShaderObj ps(m_device,fragShaderText, XGL_SHADER_STAGE_FRAGMENT, this);
 
     XglConstantBufferObj mixedBuffer(m_device, constCount, sizeof(mixedVals[0]), (const void*) mixedVals);
-    vs.BindShaderEntitySlotToBuffer(0, XGL_SLOT_SHADER_RESOURCE, &mixedBuffer);
-    ps.BindShaderEntitySlotToBuffer(0, XGL_SLOT_SHADER_RESOURCE, &mixedBuffer);
 
     XglPipelineObj pipelineobj(m_device);
     pipelineobj.AddShader(&vs);
     pipelineobj.AddShader(&ps);
 
     XglDescriptorSetObj descriptorSet(m_device);
-    descriptorSet.AttachBufferView(&mixedBuffer);
+    descriptorSet.AppendBuffer(XGL_DESCRIPTOR_TYPE_UNIFORM_BUFFER, &mixedBuffer);
 
     ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
     XglCommandBufferObj cmdBuffer(m_device);
index 5219e91..77cd9bb 100644 (file)
@@ -211,137 +211,123 @@ XglDescriptorSetObj::XglDescriptorSetObj(XglDevice *device)
 
 }
 
-void XglDescriptorSetObj::AttachBufferView(XglConstantBufferObj *constantBuffer)
+XglDescriptorSetObj::~XglDescriptorSetObj()
 {
-    m_bufferViews.push_back(&constantBuffer->m_bufferViewInfo);
-    m_bufferSlots.push_back(m_nextSlot);
-    m_nextSlot++;
-
+    delete m_set;
 }
 
-void XglDescriptorSetObj::AttachSampler(XglSamplerObj *sampler)
+int XglDescriptorSetObj::AppendDummy()
 {
-    m_samplers.push_back(sampler);
-    m_samplerSlots.push_back(m_nextSlot);
-    m_nextSlot++;
+    /* request a descriptor but do not update it */
+    XGL_DESCRIPTOR_TYPE_COUNT tc = {};
+    tc.type = XGL_DESCRIPTOR_TYPE_RAW_BUFFER;
+    tc.count = 1;
+    m_type_counts.push_back(tc);
 
+    return m_nextSlot++;
 }
 
-void XglDescriptorSetObj::AttachImageView(XglTextureObj *texture)
+int XglDescriptorSetObj::AppendBuffer(XGL_DESCRIPTOR_TYPE type, XglConstantBufferObj *constantBuffer)
 {
-    m_imageViews.push_back(&texture->m_textureViewInfo);
-    m_imageSlots.push_back(m_nextSlot);
-    m_nextSlot++;
+    XGL_DESCRIPTOR_TYPE_COUNT tc = {};
+    tc.type = type;
+    tc.count = 1;
+    m_type_counts.push_back(tc);
 
-}
+    m_bufferInfo.push_back(&constantBuffer->m_bufferViewInfo);
 
-XGL_DESCRIPTOR_SLOT_INFO* XglDescriptorSetObj::GetSlotInfo(vector<int>slots,
-                                                           vector<XGL_DESCRIPTOR_SET_SLOT_TYPE>types,
-                                                           vector<void *>objs )
-{
-    int nSlots = m_bufferSlots.size() + m_imageSlots.size() + m_samplerSlots.size();
-    m_slotInfo = (XGL_DESCRIPTOR_SLOT_INFO*) malloc( nSlots * sizeof(XGL_DESCRIPTOR_SLOT_INFO) );
-    memset(m_slotInfo,0,nSlots*sizeof(XGL_DESCRIPTOR_SLOT_INFO));
-
-    for (int i=0; i<nSlots; i++)
-    {
-        m_slotInfo[i].slotObjectType = XGL_SLOT_UNUSED;
-    }
-
-    for (int i=0; i<slots.size(); i++)
-    {
-        for (int j=0; j<m_bufferSlots.size(); j++)
-        {
-            if ( m_bufferViews[j] == objs[i])
-            {
-                m_slotInfo[m_bufferSlots[j]].shaderEntityIndex = slots[i];
-                m_slotInfo[m_bufferSlots[j]].slotObjectType = types[i];
-            }
-        }
-        for (int j=0; j<m_imageSlots.size(); j++)
-        {
-            if ( m_imageViews[j] == objs[i])
-            {
-                m_slotInfo[m_imageSlots[j]].shaderEntityIndex = slots[i];
-                m_slotInfo[m_imageSlots[j]].slotObjectType = types[i];
-            }
-        }
-        for (int j=0; j<m_samplerSlots.size(); j++)
-        {
-            if ( m_samplers[j] == objs[i])
-            {
-                m_slotInfo[m_samplerSlots[j]].shaderEntityIndex = slots[i];
-                m_slotInfo[m_samplerSlots[j]].slotObjectType = types[i];
-            }
-        }
-    }
-
-    // for (int i=0;i<nSlots;i++)
-    // {
-    //    printf("SlotInfo[%d]:  Index = %d, Type = %d\n",i,m_slotInfo[i].shaderEntityIndex, m_slotInfo[i].slotObjectType);
-    //    fflush(stdout);
-    // }
-
-    return(m_slotInfo);
+    m_updateBuffers.push_back(xgl_testing::DescriptorSet::update(type, m_nextSlot, 1,
+                (const XGL_BUFFER_VIEW_ATTACH_INFO **) NULL));
 
+    return m_nextSlot++;
 }
-void XglDescriptorSetObj::CreateXGLDescriptorSet()
+
+int XglDescriptorSetObj::AppendSamplerTexture( XglSamplerObj* sampler, XglTextureObj* texture)
 {
-    init(*m_device, xgl_testing::DescriptorSet::create_info(m_nextSlot));
+    XGL_DESCRIPTOR_TYPE_COUNT tc = {};
+    tc.type = XGL_DESCRIPTOR_TYPE_SAMPLER_TEXTURE;
+    tc.count = 1;
+    m_type_counts.push_back(tc);
 
-    begin();
-    clear();
+    XGL_SAMPLER_IMAGE_VIEW_INFO tmp = {};
+    tmp.pSampler = sampler->obj();
+    tmp.pImageView = &texture->m_textureViewInfo;
+    m_samplerTextureInfo.push_back(tmp);
 
-    for (int i=0; i<m_bufferViews.size();i++)
-    {
-        attach(m_bufferSlots[i], *m_bufferViews[i]);
-    }
-    for (int i=0; i<m_samplers.size();i++)
-    {
-        attach(m_samplerSlots[i], *m_samplers[i]);
-    }
-    for (int i=0; i<m_imageViews.size();i++)
-    {
-        attach(m_imageSlots[i], *m_imageViews[i]);
-    }
+    m_updateSamplerTextures.push_back(xgl_testing::DescriptorSet::update(m_nextSlot, 1,
+                (const XGL_SAMPLER_IMAGE_VIEW_INFO *) NULL));
 
-    end();
+    return m_nextSlot++;
 }
 
-XGL_DESCRIPTOR_SET XglDescriptorSetObj::GetDescriptorSetHandle()
+XGL_DESCRIPTOR_SET_LAYOUT XglDescriptorSetObj::GetLayout()
 {
-    return obj();
+    return m_layout.obj();
 }
 
-int XglDescriptorSetObj::GetTotalSlots()
+XGL_DESCRIPTOR_SET XglDescriptorSetObj::GetDescriptorSetHandle()
 {
-    return m_nextSlot;
+    return m_set->obj();
 }
 
-void XglDescriptorSetObj::BindCommandBuffer(XGL_CMD_BUFFER commandBuffer)
+void XglDescriptorSetObj::CreateXGLDescriptorSet(XglCommandBufferObj *cmdBuffer)
 {
-    init(*m_device, xgl_testing::DescriptorSet::create_info(m_nextSlot));
+    // create XGL_DESCRIPTOR_REGION
+    XGL_DESCRIPTOR_REGION_CREATE_INFO region = {};
+    region.sType = XGL_STRUCTURE_TYPE_DESCRIPTOR_REGION_CREATE_INFO;
+    region.count = m_type_counts.size();
+    region.pTypeCount = &m_type_counts[0];
+    init(*m_device, XGL_DESCRIPTOR_REGION_USAGE_ONE_SHOT, 1, region);
 
-    begin();
-    clear();
+    // create XGL_DESCRIPTOR_SET_LAYOUT
+    vector<XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO> layout;
+    layout.resize(m_type_counts.size());
+    for (int i = 0; i < m_type_counts.size(); i++) {
+        layout[i].sType = XGL_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
+        layout[i].descriptorType = m_type_counts[i].type;
+        layout[i].count = m_type_counts[i].count;
+        layout[i].stageFlags = XGL_SHADER_STAGE_FLAGS_ALL;
+        layout[i].immutableSampler = XGL_NULL_HANDLE;
 
-    for (int i=0; i<m_bufferViews.size();i++)
-    {
-        attach(m_bufferSlots[i], *m_bufferViews[i]);
+        if (i < m_type_counts.size() - 1)
+            layout[i].pNext = &layout[i + 1];
+        else
+            layout[i].pNext = NULL;
     }
-    for (int i=0; i<m_samplers.size();i++)
-    {
-        attach(m_samplerSlots[i], *m_samplers[i]);
-    }
-    for (int i=0; i<m_imageViews.size();i++)
-    {
-        attach(m_imageSlots[i], *m_imageViews[i]);
+
+    m_layout.init(*m_device, 0, layout[0]);
+
+    // create XGL_DESCRIPTOR_SET
+    m_set = alloc_sets(XGL_DESCRIPTOR_SET_USAGE_STATIC, m_layout);
+
+    // build the update chain
+    for (int i = 0; i < m_updateBuffers.size(); i++) {
+        m_updateBuffers[i].pBufferViews = &m_bufferInfo[i];
+
+        if (i < m_updateBuffers.size() - 1)
+            m_updateBuffers[i].pNext = &m_updateBuffers[i + 1];
+        else if (m_updateSamplerTextures.empty())
+            m_updateBuffers[i].pNext = NULL;
+        else
+            m_updateBuffers[i].pNext = &m_updateSamplerTextures[0];
     }
+    for (int i = 0; i < m_updateSamplerTextures.size(); i++) {
+        m_updateSamplerTextures[i].pSamplerImageViews = &m_samplerTextureInfo[i];
 
-    end();
+        if (i < m_updateSamplerTextures.size() - 1)
+            m_updateSamplerTextures[i].pNext = &m_updateSamplerTextures[i + 1];
+        else
+            m_updateSamplerTextures[i].pNext = NULL;
+    }
+    const void *chain = (!m_updateBuffers.empty()) ? (const void *) &m_updateBuffers[0] :
+                        (!m_updateSamplerTextures.empty()) ? (const void *) &m_updateSamplerTextures[0] :
+                        NULL;
 
-    // bind pipeline, vertex buffer (descriptor set) and WVP (dynamic buffer view)
-    xglCmdBindDescriptorSet(commandBuffer, XGL_PIPELINE_BIND_POINT_GRAPHICS, 0, obj(), 0 );
+    // do the updates
+    m_device->begin_descriptor_region_update(XGL_DESCRIPTOR_UPDATE_MODE_FASTEST);
+    clear_sets(*m_set);
+    m_set->update(chain);
+    m_device->end_descriptor_region_update(*cmdBuffer);
 }
 
 XglImage::XglImage(XglDevice *dev)
@@ -702,81 +688,18 @@ XGL_INDEX_TYPE XglIndexBufferObj::GetIndexType()
     return m_indexType;
 }
 
-XGL_PIPELINE_SHADER_STAGE_CREATE_INFO* XglShaderObj::GetStageCreateInfo(XglDescriptorSetObj *descriptorSet)
+XGL_PIPELINE_SHADER_STAGE_CREATE_INFO* XglShaderObj::GetStageCreateInfo()
 {
-    XGL_DESCRIPTOR_SLOT_INFO *slotInfo;
     XGL_PIPELINE_SHADER_STAGE_CREATE_INFO *stageInfo = (XGL_PIPELINE_SHADER_STAGE_CREATE_INFO*) calloc( 1,sizeof(XGL_PIPELINE_SHADER_STAGE_CREATE_INFO) );
     stageInfo->sType = XGL_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
     stageInfo->shader.stage = m_stage;
     stageInfo->shader.shader = obj();
-    stageInfo->shader.descriptorSetMappingCount = 1;
-    stageInfo->shader.pDescriptorSetMapping = (XGL_DESCRIPTOR_SET_MAPPING *)malloc(sizeof(XGL_DESCRIPTOR_SET_MAPPING));
-    stageInfo->shader.pDescriptorSetMapping->descriptorCount = 0;
     stageInfo->shader.linkConstBufferCount = 0;
     stageInfo->shader.pLinkConstBufferInfo = XGL_NULL_HANDLE;
-    stageInfo->shader.dynamicBufferViewMapping.slotObjectType = XGL_SLOT_UNUSED;
-    stageInfo->shader.dynamicBufferViewMapping.shaderEntityIndex = 0;
 
-    stageInfo->shader.pDescriptorSetMapping->descriptorCount = descriptorSet->GetTotalSlots();
-    if (stageInfo->shader.pDescriptorSetMapping->descriptorCount)
-    {
-        vector<int> allSlots;
-        vector<XGL_DESCRIPTOR_SET_SLOT_TYPE> allTypes;
-        vector<void *> allObjs;
-
-        allSlots.reserve(m_bufferSlots.size() + m_imageSlots.size() + m_samplerSlots.size());
-        allTypes.reserve(m_bufferTypes.size() + m_imageTypes.size() + m_samplerTypes.size());
-        allObjs.reserve(m_bufferObjs.size() + m_imageObjs.size() + m_samplerObjs.size());
-
-        if (m_bufferSlots.size())
-        {
-            allSlots.insert(allSlots.end(), m_bufferSlots.begin(), m_bufferSlots.end());
-            allTypes.insert(allTypes.end(), m_bufferTypes.begin(), m_bufferTypes.end());
-            allObjs.insert(allObjs.end(), m_bufferObjs.begin(), m_bufferObjs.end());
-        }
-        if (m_imageSlots.size())
-        {
-            allSlots.insert(allSlots.end(), m_imageSlots.begin(), m_imageSlots.end());
-            allTypes.insert(allTypes.end(), m_imageTypes.begin(), m_imageTypes.end());
-            allObjs.insert(allObjs.end(), m_imageObjs.begin(), m_imageObjs.end());
-        }
-        if (m_samplerSlots.size())
-        {
-            allSlots.insert(allSlots.end(), m_samplerSlots.begin(), m_samplerSlots.end());
-            allTypes.insert(allTypes.end(), m_samplerTypes.begin(), m_samplerTypes.end());
-            allObjs.insert(allObjs.end(), m_samplerObjs.begin(), m_samplerObjs.end());
-        }
-
-         slotInfo = descriptorSet->GetSlotInfo(allSlots, allTypes, allObjs);
-         stageInfo->shader.pDescriptorSetMapping[0].pDescriptorInfo = (const XGL_DESCRIPTOR_SLOT_INFO*) slotInfo;
-    }
     return stageInfo;
 }
 
-void XglShaderObj::BindShaderEntitySlotToBuffer(int slot, XGL_DESCRIPTOR_SET_SLOT_TYPE type, XglConstantBufferObj *constantBuffer)
-{
-    m_bufferSlots.push_back(slot);
-    m_bufferTypes.push_back(type);
-    m_bufferObjs.push_back(&constantBuffer->m_bufferViewInfo);
-
-}
-
-void XglShaderObj::BindShaderEntitySlotToImage(int slot, XGL_DESCRIPTOR_SET_SLOT_TYPE type, XglTextureObj *texture)
-{
-    m_imageSlots.push_back(slot);
-    m_imageTypes.push_back(type);
-    m_imageObjs.push_back(&texture->m_textureViewInfo);
-
-}
-
-void XglShaderObj::BindShaderEntitySlotToSampler(int slot, XglSamplerObj *sampler)
-{
-    m_samplerSlots.push_back(slot);
-    m_samplerTypes.push_back(XGL_SLOT_SHADER_SAMPLER);
-    m_samplerObjs.push_back(sampler);
-
-}
-
 XglShaderObj::XglShaderObj(XglDevice *device, const char * shader_code, XGL_PIPELINE_SHADER_STAGE stage, XglRenderFramework *framework)
 {
     XGL_RESULT err = XGL_SUCCESS;
@@ -935,7 +858,7 @@ void XglPipelineObj::CreateXGLPipeline(XglDescriptorSetObj *descriptorSet)
 
     for (int i=0; i<m_shaderObjs.size(); i++)
     {
-        shaderCreateInfo = m_shaderObjs[i]->GetStageCreateInfo(descriptorSet);
+        shaderCreateInfo = m_shaderObjs[i]->GetStageCreateInfo();
         shaderCreateInfo->pNext = head_ptr;
         head_ptr = shaderCreateInfo;
     }
@@ -950,6 +873,7 @@ void XglPipelineObj::CreateXGLPipeline(XglDescriptorSetObj *descriptorSet)
     info.sType = XGL_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
     info.pNext = head_ptr;
     info.flags = 0;
+    info.lastSetLayout = descriptorSet->GetLayout();
 
     m_cb_state.attachmentCount = m_colorAttachments.size();
     m_cb_state.pAttachments = &m_colorAttachments[0];
@@ -971,7 +895,7 @@ void XglPipelineObj::BindPipelineCommandBuffer(XGL_CMD_BUFFER m_cmdBuffer, XglDe
 
     for (int i=0; i<m_shaderObjs.size(); i++)
     {
-        shaderCreateInfo = m_shaderObjs[i]->GetStageCreateInfo(descriptorSet);
+        shaderCreateInfo = m_shaderObjs[i]->GetStageCreateInfo();
         shaderCreateInfo->pNext = head_ptr;
         head_ptr = shaderCreateInfo;
     }
@@ -986,6 +910,7 @@ void XglPipelineObj::BindPipelineCommandBuffer(XGL_CMD_BUFFER m_cmdBuffer, XglDe
     info.sType = XGL_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
     info.pNext = head_ptr;
     info.flags = 0;
+    info.lastSetLayout = descriptorSet->GetLayout();
 
     init(*m_device, info);
 
@@ -1249,7 +1174,7 @@ void XglCommandBufferObj::BindPipeline(XGL_PIPELINE pipeline)
 void XglCommandBufferObj::BindDescriptorSet(XGL_DESCRIPTOR_SET descriptorSet)
 {
     // bind pipeline, vertex buffer (descriptor set) and WVP (dynamic buffer view)
-    xglCmdBindDescriptorSet(obj(), XGL_PIPELINE_BIND_POINT_GRAPHICS, 0, descriptorSet, 0 );
+    xglCmdBindDescriptorSet(obj(), XGL_PIPELINE_BIND_POINT_GRAPHICS, descriptorSet, NULL );
 }
 void XglCommandBufferObj::BindIndexBuffer(XglIndexBufferObj *indexBuffer, XGL_UINT offset)
 {
index 140a72b..dca4288 100644 (file)
@@ -106,7 +106,7 @@ protected:
 class XglIndexBufferObj;
 class XglConstantBufferObj;
 
-class XglCommandBufferObj : xgl_testing::CmdBuffer
+class XglCommandBufferObj : public xgl_testing::CmdBuffer
 {
 public:
     XglCommandBufferObj(XglDevice *device);
@@ -264,29 +264,33 @@ protected:
 
 };
 
-class XglDescriptorSetObj : public xgl_testing::DescriptorSet
+class XglDescriptorSetObj : public xgl_testing::DescriptorRegion
 {
 public:
     XglDescriptorSetObj(XglDevice *device);
-    void AttachBufferView(XglConstantBufferObj* constantBuffer);
-    void AttachSampler( XglSamplerObj* sampler);
-    void AttachImageView( XglTextureObj* texture);
-    void BindCommandBuffer(XGL_CMD_BUFFER commandBuffer);
-    void CreateXGLDescriptorSet();
+    ~XglDescriptorSetObj();
+
+    int AppendDummy();
+    int AppendBuffer(XGL_DESCRIPTOR_TYPE type, XglConstantBufferObj* constantBuffer);
+    int AppendSamplerTexture(XglSamplerObj* sampler, XglTextureObj* texture);
+    void CreateXGLDescriptorSet(XglCommandBufferObj *cmdBuffer);
+
     XGL_DESCRIPTOR_SET GetDescriptorSetHandle();
-    int GetTotalSlots();
-    XGL_DESCRIPTOR_SLOT_INFO * GetSlotInfo(vector<int>slots, vector<XGL_DESCRIPTOR_SET_SLOT_TYPE>types, vector<void*>objs );
+    XGL_DESCRIPTOR_SET_LAYOUT GetLayout();
 
 protected:
     XglDevice                           *m_device;
-    XGL_DESCRIPTOR_SLOT_INFO            *m_slotInfo;
+    vector<XGL_DESCRIPTOR_TYPE_COUNT>    m_type_counts;
     int                                  m_nextSlot;
-    vector<int>                          m_bufferSlots;
-    vector<XGL_BUFFER_VIEW_ATTACH_INFO*> m_bufferViews;
-    vector<int>                          m_samplerSlots;
-    vector<XglSamplerObj*>               m_samplers;
-    vector<int>                          m_imageSlots;
-    vector<XGL_IMAGE_VIEW_ATTACH_INFO*>  m_imageViews;
+
+    vector<const XGL_BUFFER_VIEW_ATTACH_INFO *> m_bufferInfo;
+    vector<XGL_UPDATE_BUFFERS>           m_updateBuffers;
+
+    vector<XGL_SAMPLER_IMAGE_VIEW_INFO>  m_samplerTextureInfo;
+    vector<XGL_UPDATE_SAMPLER_TEXTURES>  m_updateSamplerTextures;
+
+    xgl_testing::DescriptorSetLayout     m_layout;
+    xgl_testing::DescriptorSet          *m_set;
 };
 
 
@@ -294,24 +298,12 @@ class XglShaderObj : public xgl_testing::Shader
 {
 public:
     XglShaderObj(XglDevice *device, const char * shaderText, XGL_PIPELINE_SHADER_STAGE stage, XglRenderFramework *framework);
-    XGL_PIPELINE_SHADER_STAGE_CREATE_INFO* GetStageCreateInfo(XglDescriptorSetObj *descriptorSet);
-    void BindShaderEntitySlotToBuffer(int slot, XGL_DESCRIPTOR_SET_SLOT_TYPE type, XglConstantBufferObj *constantBuffer);
-    void BindShaderEntitySlotToImage(int slot, XGL_DESCRIPTOR_SET_SLOT_TYPE type, XglTextureObj *texture);
-    void BindShaderEntitySlotToSampler(int slot, XglSamplerObj *sampler);
+    XGL_PIPELINE_SHADER_STAGE_CREATE_INFO* GetStageCreateInfo();
 
 protected:
     XGL_PIPELINE_SHADER_STAGE_CREATE_INFO stage_info;
     XGL_PIPELINE_SHADER_STAGE m_stage;
     XglDevice *m_device;
-    vector<int>    m_bufferSlots;
-    vector<XGL_DESCRIPTOR_SET_SLOT_TYPE> m_bufferTypes;
-    vector<XGL_BUFFER_VIEW_ATTACH_INFO*> m_bufferObjs;
-    vector<int>    m_samplerSlots;
-    vector<XGL_DESCRIPTOR_SET_SLOT_TYPE> m_samplerTypes;
-    vector<XglSamplerObj*> m_samplerObjs;
-    vector<int>    m_imageSlots;
-    vector<XGL_DESCRIPTOR_SET_SLOT_TYPE> m_imageTypes;
-    vector<XGL_IMAGE_VIEW_ATTACH_INFO*> m_imageObjs;
 
 };
 
index 3c2b386..0bc3c4f 100644 (file)
@@ -471,6 +471,16 @@ XGL_RESULT Device::wait(const std::vector<const Fence *> &fences, bool wait_all,
     return err;
 }
 
+void Device::begin_descriptor_region_update(XGL_DESCRIPTOR_UPDATE_MODE mode)
+{
+    EXPECT(xglBeginDescriptorRegionUpdate(obj(), mode) == XGL_SUCCESS);
+}
+
+void Device::end_descriptor_region_update(CmdBuffer &cmd)
+{
+    EXPECT(xglEndDescriptorRegionUpdate(obj(), cmd.obj()) == XGL_SUCCESS);
+}
+
 void Queue::submit(const std::vector<const CmdBuffer *> &cmds, const std::vector<XGL_MEMORY_REF> &mem_refs, Fence &fence)
 {
     const std::vector<XGL_CMD_BUFFER> cmd_objs = make_objects<XGL_CMD_BUFFER>(cmds);
@@ -764,31 +774,78 @@ void Sampler::init(const Device &dev, const XGL_SAMPLER_CREATE_INFO &info)
     alloc_memory(dev);
 }
 
-void DescriptorSet::init(const Device &dev, const XGL_DESCRIPTOR_SET_CREATE_INFO &info)
+void DescriptorSetLayout::init(const Device &dev, XGL_FLAGS stage_mask,
+                               const std::vector<uint32_t> &bind_points,
+                               const DescriptorSetLayout &prior_layout,
+                               const XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO &info)
+{
+    DERIVED_OBJECT_INIT(xglCreateDescriptorSetLayout, dev.obj(), stage_mask,
+            &bind_points[0], prior_layout.obj(), &info);
+    alloc_memory(dev);
+}
+
+void DescriptorSetLayout::init(const Device &dev, uint32_t bind_point,
+                               const DescriptorSetLayout &prior_layout,
+                               const XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO &info)
+{
+    init(dev, XGL_SHADER_STAGE_FLAGS_ALL, std::vector<uint32_t>(1, bind_point), prior_layout, info);
+}
+
+void DescriptorRegion::init(const Device &dev, XGL_DESCRIPTOR_REGION_USAGE usage,
+                            uint32_t max_sets, const XGL_DESCRIPTOR_REGION_CREATE_INFO &info)
 {
-    DERIVED_OBJECT_INIT(xglCreateDescriptorSet, dev.obj(), &info);
-    info_ = info;
+    DERIVED_OBJECT_INIT(xglCreateDescriptorRegion, dev.obj(), usage, max_sets, &info);
+    alloc_memory(dev);
+}
+
+void DescriptorRegion::clear()
+{
+    EXPECT(xglClearDescriptorRegion(obj()) == XGL_SUCCESS);
+}
+
+std::vector<DescriptorSet *> DescriptorRegion::alloc_sets(XGL_DESCRIPTOR_SET_USAGE usage, const std::vector<const DescriptorSetLayout *> &layouts)
+{
+    const std::vector<XGL_DESCRIPTOR_SET_LAYOUT> layout_objs = make_objects<XGL_DESCRIPTOR_SET_LAYOUT>(layouts);
+
+    std::vector<XGL_DESCRIPTOR_SET> set_objs;
+    set_objs.resize(layout_objs.size());
+
+    uint32_t set_count;
+    XGL_RESULT err = xglAllocDescriptorSets(obj(), usage, layout_objs.size(), &layout_objs[0], &set_objs[0], &set_count);
+    if (err == XGL_SUCCESS)
+        EXPECT(set_count == set_objs.size());
+    set_objs.resize(set_count);
+
+    std::vector<DescriptorSet *> sets;
+    sets.reserve(set_count);
+    for (std::vector<XGL_DESCRIPTOR_SET>::const_iterator it = set_objs.begin(); it != set_objs.end(); it++) {
+        // do descriptor sets need memories bound?
+        sets.push_back(new DescriptorSet(*it));
+    }
+
+    return sets;
 }
 
-void DescriptorSet::attach(uint32_t start_slot, const std::vector<const Sampler *> &samplers)
+std::vector<DescriptorSet *> DescriptorRegion::alloc_sets(XGL_DESCRIPTOR_SET_USAGE usage, const DescriptorSetLayout &layout, uint32_t count)
 {
-    const std::vector<XGL_SAMPLER> sampler_objs = make_objects<XGL_SAMPLER>(samplers);
-    xglAttachSamplerDescriptors(obj(), start_slot, sampler_objs.size(), &sampler_objs[0]);
+    return alloc_sets(usage, std::vector<const DescriptorSetLayout *>(count, &layout));
 }
 
-void DescriptorSet::attach(uint32_t start_slot, const std::vector<XGL_IMAGE_VIEW_ATTACH_INFO> &img_views)
+DescriptorSet *DescriptorRegion::alloc_sets(XGL_DESCRIPTOR_SET_USAGE usage, const DescriptorSetLayout &layout)
 {
-    xglAttachImageViewDescriptors(obj(), start_slot, img_views.size(), &img_views[0]);
+    std::vector<DescriptorSet *> set = alloc_sets(usage, layout, 1);
+    return (set.empty()) ? NULL : set[0];
 }
 
-void DescriptorSet::attach(uint32_t start_slot, const std::vector<XGL_BUFFER_VIEW_ATTACH_INFO> &buf_views)
+void DescriptorRegion::clear_sets(const std::vector<DescriptorSet *> &sets)
 {
-    xglAttachBufferViewDescriptors(obj(), start_slot, buf_views.size(), &buf_views[0]);
+    const std::vector<XGL_DESCRIPTOR_SET> set_objs = make_objects<XGL_DESCRIPTOR_SET>(sets);
+    xglClearDescriptorSets(obj(), set_objs.size(), &set_objs[0]);
 }
 
-void DescriptorSet::attach(uint32_t start_slot, const std::vector<XGL_DESCRIPTOR_SET_ATTACH_INFO> &sets)
+void DescriptorSet::update(const void *update_chain)
 {
-    xglAttachNestedDescriptors(obj(), start_slot, sets.size(), &sets[0]);
+    xglUpdateDescriptors(obj(), update_chain);
 }
 
 void DynamicVpStateObject::init(const Device &dev, const XGL_DYNAMIC_VP_STATE_CREATE_INFO &info)
index 0bb320f..2af86d0 100644 (file)
@@ -53,6 +53,8 @@ class Shader;
 class Pipeline;
 class PipelineDelta;
 class Sampler;
+class DescriptorSetLayout;
+class DescriptorSetRegion;
 class DescriptorSet;
 class DynamicVpStateObject;
 class DynamicRsStateObject;
@@ -226,6 +228,11 @@ public:
     XGL_RESULT wait(const std::vector<const Fence *> &fences, bool wait_all, uint64_t timeout);
     XGL_RESULT wait(const Fence &fence) { return wait(std::vector<const Fence *>(1, &fence), true, (uint64_t) -1); }
 
+    // xglBeginDescriptorRegionUpdate()
+    // xglEndDescriptorRegionUpdate()
+    void begin_descriptor_region_update(XGL_DESCRIPTOR_UPDATE_MODE mode);
+    void end_descriptor_region_update(CmdBuffer &cmd);
+
 private:
     enum QueueIndex {
         GRAPHICS,
@@ -493,58 +500,62 @@ public:
     void init(const Device &dev, const XGL_SAMPLER_CREATE_INFO &info);
 };
 
-class DescriptorSet : public DerivedObject<XGL_DESCRIPTOR_SET, Object> {
+class DescriptorSetLayout : public DerivedObject<XGL_DESCRIPTOR_SET_LAYOUT, Object> {
 public:
-    // xglCreateDescriptorSet()
-    void init(const Device &dev, const XGL_DESCRIPTOR_SET_CREATE_INFO &info);
+    // xglCreateDescriptorSetLayout()
+    void init(const Device &dev, XGL_FLAGS stage_mask,
+              const std::vector<uint32_t> &bind_points,
+              const DescriptorSetLayout &prior_layout,
+              const XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO &info);
+    void init(const Device &dev, uint32_t bind_point,
+              const DescriptorSetLayout &prior_layout,
+              const XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO &info);
+    void init(const Device &dev, uint32_t bind_point,
+              const XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO &info) { init(dev, bind_point, DescriptorSetLayout(), info); }
+};
 
-    // xglBeginDescriptorSetUpdate()
-    // xglEndDescriptorSetUpdate()
-    void begin() { xglBeginDescriptorSetUpdate(obj()); }
-    void end() { xglEndDescriptorSetUpdate(obj()); }
+class DescriptorRegion : public DerivedObject<XGL_DESCRIPTOR_REGION, Object> {
+public:
+    // xglCreateDescriptorRegion()
+    void init(const Device &dev, XGL_DESCRIPTOR_REGION_USAGE usage,
+              uint32_t max_sets, const XGL_DESCRIPTOR_REGION_CREATE_INFO &info);
 
-    // xglAttachSamplerDescriptors()
-    void attach(uint32_t start_slot, const std::vector<const Sampler *> &samplers);
-    void attach(uint32_t start_slot, const Sampler &sampler)
-    {
-        attach(start_slot, std::vector<const Sampler *>(1, &sampler));
-    }
+    // xglClearDescriptorRegion()
+    void clear();
 
-    // xglAttachImageViewDescriptors()
-    void attach(uint32_t start_slot, const std::vector<XGL_IMAGE_VIEW_ATTACH_INFO> &img_views);
-    void attach(uint32_t start_slot, const XGL_IMAGE_VIEW_ATTACH_INFO &view)
-    {
-        attach(start_slot, std::vector<XGL_IMAGE_VIEW_ATTACH_INFO>(1, view));
-    }
+    // xglAllocDescriptorSets()
+    std::vector<DescriptorSet *> alloc_sets(XGL_DESCRIPTOR_SET_USAGE usage, const std::vector<const DescriptorSetLayout *> &layouts);
+    std::vector<DescriptorSet *> alloc_sets(XGL_DESCRIPTOR_SET_USAGE usage, const DescriptorSetLayout &layout, uint32_t count);
+    DescriptorSet *alloc_sets(XGL_DESCRIPTOR_SET_USAGE usage, const DescriptorSetLayout &layout);
 
-    // xglAttachBufferViewDescriptors()
-    void attach(uint32_t start_slot, const std::vector<XGL_BUFFER_VIEW_ATTACH_INFO> &buf_views);
-    void attach(uint32_t start_slot, const XGL_BUFFER_VIEW_ATTACH_INFO &view)
-    {
-        attach(start_slot, std::vector<XGL_BUFFER_VIEW_ATTACH_INFO>(1, view));
-    }
+    // xglClearDescriptorSets()
+    void clear_sets(const std::vector<DescriptorSet *> &sets);
+    void clear_sets(DescriptorSet &set) { clear_sets(std::vector<DescriptorSet *>(1, &set)); }
+};
 
-    // xglAttachNestedDescriptors()
-    void attach(uint32_t start_slot, const std::vector<XGL_DESCRIPTOR_SET_ATTACH_INFO> &sets);
-    void attach(uint32_t start_slot, const XGL_DESCRIPTOR_SET_ATTACH_INFO &set)
-    {
-        attach(start_slot, std::vector<XGL_DESCRIPTOR_SET_ATTACH_INFO>(1, set));
-    }
+class DescriptorSet : public DerivedObject<XGL_DESCRIPTOR_SET, Object> {
+public:
+    explicit DescriptorSet(XGL_DESCRIPTOR_SET set) : DerivedObject(set) {}
 
-    //  xglClearDescriptorSetSlots()
-    void clear(uint32_t start_slot, uint32_t count) { xglClearDescriptorSetSlots(obj(), start_slot, count); }
-    void clear() { clear(0, info_.slots); }
+    // xglUpdateDescriptors()
+    void update(const void *update_chain);
 
-    static XGL_DESCRIPTOR_SET_CREATE_INFO create_info(uint32_t slot_count)
-    {
-        XGL_DESCRIPTOR_SET_CREATE_INFO info = {};
-        info.sType = XGL_STRUCTURE_TYPE_DESCRIPTOR_SET_CREATE_INFO;
-        info.slots = slot_count;
-        return info;
-    }
+    static XGL_UPDATE_SAMPLERS update(uint32_t index, uint32_t count, const XGL_SAMPLER *samplers);
+    static XGL_UPDATE_SAMPLERS update(uint32_t index, const std::vector<XGL_SAMPLER> &samplers);
 
-private:
-    XGL_DESCRIPTOR_SET_CREATE_INFO info_;
+    static XGL_UPDATE_SAMPLER_TEXTURES update(uint32_t index, uint32_t count, const XGL_SAMPLER_IMAGE_VIEW_INFO *textures);
+    static XGL_UPDATE_SAMPLER_TEXTURES update(uint32_t index, const std::vector<XGL_SAMPLER_IMAGE_VIEW_INFO> &textures);
+
+    static XGL_UPDATE_IMAGES update(XGL_DESCRIPTOR_TYPE type, uint32_t index, uint32_t count, const XGL_IMAGE_VIEW_ATTACH_INFO * const *views);
+    static XGL_UPDATE_IMAGES update(XGL_DESCRIPTOR_TYPE type, uint32_t index, const std::vector<const XGL_IMAGE_VIEW_ATTACH_INFO *> &views);
+
+    static XGL_UPDATE_BUFFERS update(XGL_DESCRIPTOR_TYPE type, uint32_t index, uint32_t count, const XGL_BUFFER_VIEW_ATTACH_INFO * const *views);
+    static XGL_UPDATE_BUFFERS update(XGL_DESCRIPTOR_TYPE type, uint32_t index, const std::vector<const XGL_BUFFER_VIEW_ATTACH_INFO *> &views);
+
+    static XGL_UPDATE_AS_COPY update(XGL_DESCRIPTOR_TYPE type, uint32_t index, uint32_t count, const DescriptorSet &set);
+
+    static XGL_BUFFER_VIEW_ATTACH_INFO attach_info(const BufferView &view);
+    static XGL_IMAGE_VIEW_ATTACH_INFO attach_info(const ImageView &view, XGL_IMAGE_LAYOUT layout);
 };
 
 class DynamicVpStateObject : public DerivedObject<XGL_DYNAMIC_VP_STATE_OBJECT, DynamicStateObject> {
@@ -759,6 +770,100 @@ inline XGL_SHADER_CREATE_INFO Shader::create_info(size_t code_size, const void *
     return info;
 }
 
+inline XGL_BUFFER_VIEW_ATTACH_INFO DescriptorSet::attach_info(const BufferView &view)
+{
+    XGL_BUFFER_VIEW_ATTACH_INFO info = {};
+    info.sType = XGL_STRUCTURE_TYPE_BUFFER_VIEW_ATTACH_INFO;
+    info.view = view.obj();
+    return info;
+}
+
+inline XGL_IMAGE_VIEW_ATTACH_INFO DescriptorSet::attach_info(const ImageView &view, XGL_IMAGE_LAYOUT layout)
+{
+    XGL_IMAGE_VIEW_ATTACH_INFO info = {};
+    info.sType = XGL_STRUCTURE_TYPE_IMAGE_VIEW_ATTACH_INFO;
+    info.view = view.obj();
+    info.layout = layout;
+    return info;
+}
+
+inline XGL_UPDATE_SAMPLERS DescriptorSet::update(uint32_t index, uint32_t count, const XGL_SAMPLER *samplers)
+{
+    XGL_UPDATE_SAMPLERS info = {};
+    info.sType = XGL_STRUCTURE_TYPE_UPDATE_SAMPLERS;
+    info.index = index;
+    info.count = count;
+    info.pSamplers = samplers;
+    return info;
+}
+
+inline XGL_UPDATE_SAMPLERS DescriptorSet::update(uint32_t index, const std::vector<XGL_SAMPLER> &samplers)
+{
+    return update(index, samplers.size(), &samplers[0]);
+}
+
+inline XGL_UPDATE_SAMPLER_TEXTURES DescriptorSet::update(uint32_t index, uint32_t count, const XGL_SAMPLER_IMAGE_VIEW_INFO *textures)
+{
+    XGL_UPDATE_SAMPLER_TEXTURES info = {};
+    info.sType = XGL_STRUCTURE_TYPE_UPDATE_SAMPLER_TEXTURES;
+    info.index = index;
+    info.count = count;
+    info.pSamplerImageViews = textures;
+    return info;
+}
+
+inline XGL_UPDATE_SAMPLER_TEXTURES DescriptorSet::update(uint32_t index, const std::vector<XGL_SAMPLER_IMAGE_VIEW_INFO> &textures)
+{
+    return update(index, textures.size(), &textures[0]);
+}
+
+inline XGL_UPDATE_IMAGES DescriptorSet::update(XGL_DESCRIPTOR_TYPE type, uint32_t index, uint32_t count,
+                                               const XGL_IMAGE_VIEW_ATTACH_INFO * const *views)
+{
+    XGL_UPDATE_IMAGES info = {};
+    info.sType = XGL_STRUCTURE_TYPE_UPDATE_IMAGES;
+    info.descriptorType = type;
+    info.index = index;
+    info.count = count;
+    info.pImageViews = views;
+    return info;
+}
+
+inline XGL_UPDATE_IMAGES DescriptorSet::update(XGL_DESCRIPTOR_TYPE type, uint32_t index,
+                                               const std::vector<const XGL_IMAGE_VIEW_ATTACH_INFO *> &views)
+{
+    return update(type, index, views.size(), &views[0]);
+}
+
+inline XGL_UPDATE_BUFFERS DescriptorSet::update(XGL_DESCRIPTOR_TYPE type, uint32_t index, uint32_t count,
+                                                const XGL_BUFFER_VIEW_ATTACH_INFO * const *views)
+{
+    XGL_UPDATE_BUFFERS info = {};
+    info.sType = XGL_STRUCTURE_TYPE_UPDATE_BUFFERS;
+    info.descriptorType = type;
+    info.index = index;
+    info.count = count;
+    info.pBufferViews = views;
+    return info;
+}
+
+inline XGL_UPDATE_BUFFERS DescriptorSet::update(XGL_DESCRIPTOR_TYPE type, uint32_t index,
+                                                const std::vector<const XGL_BUFFER_VIEW_ATTACH_INFO *> &views)
+{
+    return update(type, index, views.size(), &views[0]);
+}
+
+inline XGL_UPDATE_AS_COPY DescriptorSet::update(XGL_DESCRIPTOR_TYPE type, uint32_t index, uint32_t count, const DescriptorSet &set)
+{
+    XGL_UPDATE_AS_COPY info = {};
+    info.sType = XGL_STRUCTURE_TYPE_UPDATE_AS_COPY;
+    info.descriptorType = type;
+    info.descriptorIndex = index; // whose index?
+    info.count = count;
+    info.descriptorSet = set.obj();
+    return info;
+}
+
 inline XGL_CMD_BUFFER_CREATE_INFO CmdBuffer::create_info(XGL_QUEUE_TYPE type)
 {
     XGL_CMD_BUFFER_CREATE_INFO info = {};
index f36f9a4..a0f7992 100755 (executable)
@@ -152,6 +152,17 @@ class LoaderEntrypointsSubcommand(Subcommand):
                          "    return res;\n"
                          "}"
                          % (qual, decl, proto.params[0].name, stmt, obj_write_stmt, proto.params[-1].name))
+            elif proto.name == "AllocDescriptorSets":
+                funcs.append("%s%s\n"
+                         "{\n"
+                         "    const XGL_LAYER_DISPATCH_TABLE **disp =\n"
+                         "        (const XGL_LAYER_DISPATCH_TABLE **) %s;\n"
+                         "    uint32_t i;\n"
+                         "    XGL_RESULT res = %s;\n"
+                         "    for (i = 0; i < *%s; i++)\n"
+                         "        *(const XGL_LAYER_DISPATCH_TABLE **) (%s[i]) = *disp;\n"
+                         "    return res;\n"
+                         "}" % (qual, decl, proto.params[0].name, stmt, proto.params[-1].name, proto.params[-2].name))
             elif proto.name == "GetMultiGpuCompatibility":
                 funcs.append("%s%s\n"
                          "{\n"
diff --git a/xgl.py b/xgl.py
index 0e41056..84b39ee 100644 (file)
--- a/xgl.py
+++ b/xgl.py
@@ -200,6 +200,8 @@ core = Extension(
         "XGL_PIPELINE_DELTA",
         "XGL_SAMPLER",
         "XGL_DESCRIPTOR_SET",
+        "XGL_DESCRIPTOR_SET_LAYOUT",
+        "XGL_DESCRIPTOR_REGION",
         "XGL_DYNAMIC_STATE_OBJECT",
         "XGL_DYNAMIC_VP_STATE_OBJECT",
         "XGL_DYNAMIC_RS_STATE_OBJECT",
@@ -501,45 +503,48 @@ core = Extension(
              Param("const XGL_SAMPLER_CREATE_INFO*", "pCreateInfo"),
              Param("XGL_SAMPLER*", "pSampler")]),
 
-        Proto("XGL_RESULT", "CreateDescriptorSet",
+        Proto("XGL_RESULT", "CreateDescriptorSetLayout",
             [Param("XGL_DEVICE", "device"),
-             Param("const XGL_DESCRIPTOR_SET_CREATE_INFO*", "pCreateInfo"),
-             Param("XGL_DESCRIPTOR_SET*", "pDescriptorSet")]),
+             Param("XGL_FLAGS", "stageFlags"),
+             Param("const XGL_UINT*", "pSetBindPoints"),
+             Param("XGL_DESCRIPTOR_SET_LAYOUT", "priorSetLayout"),
+             Param("const XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO*", "pSetLayoutInfoList"),
+             Param("XGL_DESCRIPTOR_SET_LAYOUT*", "pSetLayout")]),
 
-        Proto("XGL_VOID", "BeginDescriptorSetUpdate",
-            [Param("XGL_DESCRIPTOR_SET", "descriptorSet")]),
+        Proto("XGL_RESULT", "BeginDescriptorRegionUpdate",
+            [Param("XGL_DEVICE", "device"),
+             Param("XGL_DESCRIPTOR_UPDATE_MODE", "updateMode")]),
 
-        Proto("XGL_VOID", "EndDescriptorSetUpdate",
-            [Param("XGL_DESCRIPTOR_SET", "descriptorSet")]),
+        Proto("XGL_RESULT", "EndDescriptorRegionUpdate",
+            [Param("XGL_DEVICE", "device"),
+             Param("XGL_CMD_BUFFER", "cmd")]),
 
-        Proto("XGL_VOID", "AttachSamplerDescriptors",
-            [Param("XGL_DESCRIPTOR_SET", "descriptorSet"),
-             Param("XGL_UINT", "startSlot"),
-             Param("XGL_UINT", "slotCount"),
-             Param("const XGL_SAMPLER*", "pSamplers")]),
+        Proto("XGL_RESULT", "CreateDescriptorRegion",
+            [Param("XGL_DEVICE", "device"),
+             Param("XGL_DESCRIPTOR_REGION_USAGE", "regionUsage"),
+             Param("XGL_UINT", "maxSets"),
+             Param("const XGL_DESCRIPTOR_REGION_CREATE_INFO*", "pCreateInfo"),
+             Param("XGL_DESCRIPTOR_REGION*", "pDescriptorRegion")]),
 
-        Proto("XGL_VOID", "AttachImageViewDescriptors",
-            [Param("XGL_DESCRIPTOR_SET", "descriptorSet"),
-             Param("XGL_UINT", "startSlot"),
-             Param("XGL_UINT", "slotCount"),
-             Param("const XGL_IMAGE_VIEW_ATTACH_INFO*", "pImageViews")]),
+        Proto("XGL_RESULT", "ClearDescriptorRegion",
+            [Param("XGL_DESCRIPTOR_REGION", "descriptorRegion")]),
 
-        Proto("XGL_VOID", "AttachBufferViewDescriptors",
-            [Param("XGL_DESCRIPTOR_SET", "descriptorSet"),
-             Param("XGL_UINT", "startSlot"),
-             Param("XGL_UINT", "slotCount"),
-             Param("const XGL_BUFFER_VIEW_ATTACH_INFO*", "pBufferViews")]),
+        Proto("XGL_RESULT", "AllocDescriptorSets",
+            [Param("XGL_DESCRIPTOR_REGION", "descriptorRegion"),
+             Param("XGL_DESCRIPTOR_SET_USAGE", "setUsage"),
+             Param("XGL_UINT", "count"),
+             Param("const XGL_DESCRIPTOR_SET_LAYOUT*", "pSetLayouts"),
+             Param("XGL_DESCRIPTOR_SET*", "pDescriptorSets"),
+             Param("XGL_UINT*", "pCount")]),
 
-        Proto("XGL_VOID", "AttachNestedDescriptors",
-            [Param("XGL_DESCRIPTOR_SET", "descriptorSet"),
-             Param("XGL_UINT", "startSlot"),
-             Param("XGL_UINT", "slotCount"),
-             Param("const XGL_DESCRIPTOR_SET_ATTACH_INFO*", "pNestedDescriptorSets")]),
+        Proto("XGL_VOID", "ClearDescriptorSets",
+            [Param("XGL_DESCRIPTOR_REGION", "descriptorRegion"),
+             Param("XGL_UINT", "count"),
+             Param("const XGL_DESCRIPTOR_SET*", "pDescriptorSets")]),
 
-        Proto("XGL_VOID", "ClearDescriptorSetSlots",
+        Proto("XGL_VOID", "UpdateDescriptors",
             [Param("XGL_DESCRIPTOR_SET", "descriptorSet"),
-             Param("XGL_UINT", "startSlot"),
-             Param("XGL_UINT", "slotCount")]),
+             Param("const XGL_VOID*", "pUpdateChain")]),
 
         Proto("XGL_RESULT", "CreateDynamicViewportState",
             [Param("XGL_DEVICE", "device"),
@@ -594,14 +599,8 @@ core = Extension(
         Proto("XGL_VOID", "CmdBindDescriptorSet",
             [Param("XGL_CMD_BUFFER", "cmdBuffer"),
              Param("XGL_PIPELINE_BIND_POINT", "pipelineBindPoint"),
-             Param("XGL_UINT", "index"),
              Param("XGL_DESCRIPTOR_SET", "descriptorSet"),
-             Param("XGL_UINT", "slotOffset")]),
-
-        Proto("XGL_VOID", "CmdBindDynamicBufferView",
-            [Param("XGL_CMD_BUFFER", "cmdBuffer"),
-             Param("XGL_PIPELINE_BIND_POINT", "pipelineBindPoint"),
-             Param("const XGL_BUFFER_VIEW_ATTACH_INFO*", "pBufferView")]),
+             Param("const XGL_UINT*", "pUserData")]),
 
         Proto("XGL_VOID", "CmdBindVertexBuffer",
             [Param("XGL_CMD_BUFFER", "cmdBuffer"),