aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJon Ashburn <jon@lunarg.com>2015-01-19 15:00:26 -0700
committerCourtney Goeltzenleuchter <courtney@LunarG.com>2015-02-04 17:58:09 -0700
commitae7c21c324727798ff100b17f3ac6a6bee20a506 (patch)
tree6a8d17691d30f9086c370a40a7854f401c750c2a
parentb2a66658c7416df2a580fb2562fcec20809ddf34 (diff)
downloadusermoji-ae7c21c324727798ff100b17f3ac6a6bee20a506.tar.xz
memory alloc: Add IMAGE and BUFFER alloc info structures
For images have the tests fill in the IMAGE_ALLOC structures. For buffers this is not yet done. Conflicts: demos/cube.c demos/tri.c include/xgl.h tests/init.cpp tests/xgltestbinding.cpp
-rw-r--r--demos/cube.c121
-rw-r--r--demos/tri.c134
-rw-r--r--icd/common/icd-format.c66
-rw-r--r--icd/common/icd-format.h2
-rw-r--r--include/xgl.h96
5 files changed, 335 insertions, 84 deletions
diff --git a/demos/cube.c b/demos/cube.c
index c0ce5fed..d7deecb3 100644
--- a/demos/cube.c
+++ b/demos/cube.c
@@ -229,7 +229,8 @@ struct demo {
struct {
XGL_BUFFER buf;
- XGL_GPU_MEMORY mem;
+ XGL_UINT num_mem;
+ XGL_GPU_MEMORY *mem;
XGL_BUFFER_VIEW view;
XGL_BUFFER_VIEW_ATTACH_INFO attach;
} uniform_data;
@@ -365,12 +366,13 @@ void demo_update_data_buffer(struct demo *demo)
mat4x4_rotate(demo->model_matrix, Model, 0.0f, 1.0f, 0.0f, degreesToRadians(demo->spin_angle));
mat4x4_mul(MVP, VP, demo->model_matrix);
- err = xglMapMemory(demo->uniform_data.mem, 0, (XGL_VOID **) &pData);
+ assert(demo->uniform_data.num_mem == 1);
+ err = xglMapMemory(demo->uniform_data.mem[0], 0, (XGL_VOID **) &pData);
assert(!err);
memcpy(pData, (const void*) &MVP[0][0], matrixSize);
- err = xglUnmapMemory(demo->uniform_data.mem);
+ err = xglUnmapMemory(demo->uniform_data.mem[0]);
assert(!err);
}
@@ -461,9 +463,13 @@ static void demo_prepare_depth(struct demo *demo)
.usage = XGL_IMAGE_USAGE_DEPTH_STENCIL_BIT,
.flags = 0,
};
+ XGL_MEMORY_ALLOC_IMAGE_INFO img_alloc = {
+ .sType = XGL_STRUCTURE_TYPE_MEMORY_ALLOC_IMAGE_INFO,
+ .pNext = NULL,
+ };
XGL_MEMORY_ALLOC_INFO mem_alloc = {
.sType = XGL_STRUCTURE_TYPE_MEMORY_ALLOC_INFO,
- .pNext = NULL,
+ .pNext = &img_alloc,
.allocationSize = 0,
.alignment = 0,
.flags = 0,
@@ -481,6 +487,8 @@ static void demo_prepare_depth(struct demo *demo)
};
XGL_MEMORY_REQUIREMENTS *mem_reqs;
XGL_SIZE mem_reqs_size = sizeof(XGL_MEMORY_REQUIREMENTS);
+ XGL_IMAGE_MEMORY_REQUIREMENTS img_reqs;
+ XGL_SIZE img_reqs_size = sizeof(XGL_IMAGE_MEMORY_REQUIREMENTS);
XGL_RESULT err;
XGL_UINT num_allocations = 0;
XGL_SIZE num_alloc_size = sizeof(num_allocations);
@@ -502,7 +510,13 @@ static void demo_prepare_depth(struct demo *demo)
XGL_INFO_TYPE_MEMORY_REQUIREMENTS,
&mem_reqs_size, mem_reqs);
assert(!err && mem_reqs_size == num_allocations * sizeof(XGL_MEMORY_REQUIREMENTS));
-
+ err = xglGetObjectInfo(demo->depth.image,
+ XGL_INFO_TYPE_IMAGE_MEMORY_REQUIREMENTS,
+ &img_reqs_size, &img_reqs);
+ assert(!err && img_reqs_size == sizeof(XGL_IMAGE_MEMORY_REQUIREMENTS));
+ img_alloc.usage = img_reqs.usage;
+ img_alloc.formatClass = img_reqs.formatClass;
+ img_alloc.samples = img_reqs.samples;
for (XGL_UINT i = 0; i < num_allocations; i ++) {
mem_alloc.allocationSize = mem_reqs[i].size;
mem_alloc.alignment = mem_reqs[i].alignment;
@@ -719,9 +733,13 @@ static void demo_prepare_textures(struct demo *demo)
.usage = XGL_IMAGE_USAGE_SHADER_ACCESS_READ_BIT,
.flags = 0,
};
+ XGL_MEMORY_ALLOC_IMAGE_INFO img_alloc = {
+ .sType = XGL_STRUCTURE_TYPE_MEMORY_ALLOC_IMAGE_INFO,
+ .pNext = NULL,
+ };
XGL_MEMORY_ALLOC_INFO mem_alloc = {
.sType = XGL_STRUCTURE_TYPE_MEMORY_ALLOC_INFO,
- .pNext = NULL,
+ .pNext = &img_alloc,
.allocationSize = 0,
.alignment = 0,
.flags = 0,
@@ -745,6 +763,8 @@ static void demo_prepare_textures(struct demo *demo)
XGL_MEMORY_REQUIREMENTS *mem_reqs;
XGL_SIZE mem_reqs_size = sizeof(XGL_MEMORY_REQUIREMENTS);
+ XGL_IMAGE_MEMORY_REQUIREMENTS img_reqs;
+ XGL_SIZE img_reqs_size = sizeof(XGL_IMAGE_MEMORY_REQUIREMENTS);
XGL_UINT num_allocations = 0;
XGL_SIZE num_alloc_size = sizeof(num_allocations);
@@ -769,7 +789,13 @@ static void demo_prepare_textures(struct demo *demo)
XGL_INFO_TYPE_MEMORY_REQUIREMENTS,
&mem_reqs_size, mem_reqs);
assert(!err && mem_reqs_size == num_allocations * sizeof(XGL_MEMORY_REQUIREMENTS));
-
+ err = xglGetObjectInfo(demo->textures[i].image,
+ XGL_INFO_TYPE_IMAGE_MEMORY_REQUIREMENTS,
+ &img_reqs_size, &img_reqs);
+ assert(!err && img_reqs_size == sizeof(XGL_IMAGE_MEMORY_REQUIREMENTS));
+ img_alloc.usage = img_reqs.usage;
+ img_alloc.formatClass = img_reqs.formatClass;
+ img_alloc.samples = img_reqs.samples;
for (XGL_UINT j = 0; j < num_allocations; j ++) {
mem_alloc.allocationSize = mem_reqs[j].size;
mem_alloc.alignment = mem_reqs[j].alignment;
@@ -826,9 +852,25 @@ void demo_prepare_cube_data_buffer(struct demo *demo)
{
XGL_BUFFER_CREATE_INFO buf_info;
XGL_BUFFER_VIEW_CREATE_INFO view_info;
- XGL_MEMORY_ALLOC_INFO alloc_info;
- XGL_MEMORY_REQUIREMENTS mem_reqs;
+ XGL_MEMORY_ALLOC_BUFFER_INFO buf_alloc = {
+ .sType = XGL_STRUCTURE_TYPE_MEMORY_ALLOC_BUFFER_INFO,
+ .pNext = NULL,
+ };
+ XGL_MEMORY_ALLOC_INFO alloc_info = {
+ .sType = XGL_STRUCTURE_TYPE_MEMORY_ALLOC_INFO,
+ .pNext = &buf_alloc,
+ .allocationSize = 0,
+ .alignment = 0,
+ .flags = 0,
+ .heapCount = 0,
+ .memPriority = XGL_MEMORY_PRIORITY_NORMAL,
+ };
+ XGL_MEMORY_REQUIREMENTS *mem_reqs;
XGL_SIZE mem_reqs_size = sizeof(XGL_MEMORY_REQUIREMENTS);
+ XGL_BUFFER_MEMORY_REQUIREMENTS buf_reqs;
+ XGL_SIZE buf_reqs_size = sizeof(XGL_BUFFER_MEMORY_REQUIREMENTS);
+ XGL_UINT num_allocations = 0;
+ XGL_SIZE num_alloc_size = sizeof(num_allocations);
XGL_UINT8 *pData;
int i;
mat4x4 MVP, VP;
@@ -859,35 +901,45 @@ void demo_prepare_cube_data_buffer(struct demo *demo)
assert(!err);
err = xglGetObjectInfo(demo->uniform_data.buf,
+ XGL_INFO_TYPE_MEMORY_ALLOCATION_COUNT,
+ &num_alloc_size, &num_allocations);
+ assert(!err && num_alloc_size == sizeof(num_allocations));
+ mem_reqs = malloc(num_allocations * sizeof(XGL_MEMORY_REQUIREMENTS));
+ demo->uniform_data.mem = malloc(num_allocations * sizeof(XGL_GPU_MEMORY));
+ demo->uniform_data.num_mem = num_allocations;
+ err = xglGetObjectInfo(demo->uniform_data.buf,
XGL_INFO_TYPE_MEMORY_REQUIREMENTS,
- &mem_reqs_size, &mem_reqs);
- assert(!err && mem_reqs_size == sizeof(mem_reqs));
-
- memset(&alloc_info, 0, sizeof(alloc_info));
- alloc_info.sType = XGL_STRUCTURE_TYPE_MEMORY_ALLOC_INFO;
- alloc_info.allocationSize = mem_reqs.size;
- alloc_info.alignment = mem_reqs.alignment;
- alloc_info.heapCount = mem_reqs.heapCount;
- XGL_UINT heapInfo[mem_reqs.heapCount];
- alloc_info.pHeaps = (const XGL_UINT *)heapInfo;
- memcpy(heapInfo, mem_reqs.pHeaps,
- sizeof(mem_reqs.pHeaps[0]) * mem_reqs.heapCount);
- alloc_info.memPriority = XGL_MEMORY_PRIORITY_NORMAL;
-
- err = xglAllocMemory(demo->device, &alloc_info, &demo->uniform_data.mem);
- assert(!err);
+ &mem_reqs_size, mem_reqs);
+ assert(!err && mem_reqs_size == num_allocations * sizeof(*mem_reqs));
+ err = xglGetObjectInfo(demo->uniform_data.buf,
+ XGL_INFO_TYPE_BUFFER_MEMORY_REQUIREMENTS,
+ &buf_reqs_size, &buf_reqs);
+ assert(!err && buf_reqs_size == sizeof(XGL_BUFFER_MEMORY_REQUIREMENTS));
+ buf_alloc.usage = buf_reqs.usage;
+ for (XGL_UINT i = 0; i < num_allocations; i ++) {
+ alloc_info.allocationSize = mem_reqs[i].size;
+ alloc_info.alignment = mem_reqs[i].alignment;
+ alloc_info.heapCount = mem_reqs[i].heapCount;
+ XGL_UINT heapInfo[mem_reqs[i].heapCount];
+ alloc_info.pHeaps = (const XGL_UINT *)heapInfo;
+ memcpy(heapInfo, mem_reqs[i].pHeaps,
+ sizeof(mem_reqs[i].pHeaps[0]) * mem_reqs[i].heapCount);
- err = xglMapMemory(demo->uniform_data.mem, 0, (XGL_VOID **) &pData);
- assert(!err);
+ err = xglAllocMemory(demo->device, &alloc_info, &(demo->uniform_data.mem[i]));
+ assert(!err);
- memcpy(pData, &data, alloc_info.allocationSize);
+ err = xglMapMemory(demo->uniform_data.mem[i], 0, (XGL_VOID **) &pData);
+ assert(!err);
- err = xglUnmapMemory(demo->uniform_data.mem);
- assert(!err);
+ memcpy(pData, &data, alloc_info.allocationSize);
- err = xglBindObjectMemory(demo->uniform_data.buf, 0,
- demo->uniform_data.mem, 0);
- assert(!err);
+ err = xglUnmapMemory(demo->uniform_data.mem[i]);
+ assert(!err);
+
+ err = xglBindObjectMemory(demo->uniform_data.buf, i,
+ demo->uniform_data.mem[i], 0);
+ assert(!err);
+ }
memset(&view_info, 0, sizeof(view_info));
view_info.sType = XGL_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
@@ -1537,6 +1589,9 @@ static void demo_cleanup(struct demo *demo)
xglDestroyObject(demo->depth.image);
for (j = 0; j < demo->depth.num_mem; j++)
xglFreeMemory(demo->depth.mem[j]);
+ xglDestroyObject(demo->uniform_data.buf);
+ for (j = 0; j < demo->uniform_data.num_mem; j++)
+ xglFreeMemory(demo->uniform_data.mem[j]);
for (i = 0; i < DEMO_BUFFER_COUNT; i++) {
xglDestroyObject(demo->buffers[i].fence);
diff --git a/demos/tri.c b/demos/tri.c
index d2a780bb..96c22194 100644
--- a/demos/tri.c
+++ b/demos/tri.c
@@ -59,7 +59,8 @@ struct demo {
struct {
XGL_BUFFER buf;
- XGL_GPU_MEMORY mem;
+ XGL_UINT num_mem;
+ XGL_GPU_MEMORY *mem;
XGL_PIPELINE_VERTEX_INPUT_CREATE_INFO vi;
XGL_VERTEX_INPUT_BINDING_DESCRIPTION vi_bindings[1];
@@ -189,20 +190,28 @@ static void demo_draw(struct demo *demo)
err = xglWaitForFences(demo->device, 1, &fence, XGL_TRUE, ~((XGL_UINT64) 0));
assert(err == XGL_SUCCESS || err == XGL_ERROR_UNAVAILABLE);
- static const uint32_t NUM_MEM_REFS = 5;
- XGL_MEMORY_REF memRefs[NUM_MEM_REFS];
- memRefs[0].mem = demo->depth.mem;
- memRefs[0].flags = 0;
- memRefs[1].mem = demo->textures[0].mem;
- memRefs[1].flags = 0;
- memRefs[2].mem = demo->buffers[0].mem;
- memRefs[2].flags = 0;
- memRefs[3].mem = demo->buffers[1].mem;
- memRefs[3].flags = 0;
- memRefs[4].mem = demo->vertices.mem;
- memRefs[4].flags = 0;
+ XGL_UINT i, idx = 0;
+ XGL_MEMORY_REF *memRefs;
+ memRefs = malloc(sizeof(XGL_MEMORY_REF) * (2 + demo->depth.num_mem +
+ demo->textures[0].num_mem + demo->vertices.num_mem));
+ for (i = 0; i < demo->depth.num_mem; i++, idx++) {
+ memRefs[idx].mem = demo->depth.mem[i];
+ memRefs[idx].flags = 0;
+ }
+ for (i = 0; i < demo->textures[0].num_mem; i++, idx++) {
+ memRefs[idx].mem = demo->textures[0].mem[i];
+ memRefs[idx].flags = 0;
+ }
+ memRefs[idx].mem = demo->buffers[0].mem;
+ memRefs[idx++].flags = 0;
+ memRefs[idx].mem = demo->buffers[1].mem;
+ memRefs[idx++].flags = 0;
+ for (i = 0; i < demo->vertices.num_mem; i++, idx++) {
+ memRefs[idx].mem = demo->vertices.mem[i];
+ memRefs[idx].flags = 0;
+ }
err = xglQueueSubmit(demo->queue, 1, &demo->cmd,
- NUM_MEM_REFS, memRefs, XGL_NULL_HANDLE);
+ idx, memRefs, XGL_NULL_HANDLE);
assert(!err);
err = xglWsiX11QueuePresent(demo->queue, &present, fence);
@@ -272,9 +281,13 @@ static void demo_prepare_depth(struct demo *demo)
.usage = XGL_IMAGE_USAGE_DEPTH_STENCIL_BIT,
.flags = 0,
};
+ XGL_MEMORY_ALLOC_IMAGE_INFO img_alloc = {
+ .sType = XGL_STRUCTURE_TYPE_MEMORY_ALLOC_IMAGE_INFO,
+ .pNext = NULL,
+ };
XGL_MEMORY_ALLOC_INFO mem_alloc = {
.sType = XGL_STRUCTURE_TYPE_MEMORY_ALLOC_INFO,
- .pNext = NULL,
+ .pNext = &img_alloc,
.allocationSize = 0,
.alignment = 0,
.flags = 0,
@@ -293,6 +306,8 @@ static void demo_prepare_depth(struct demo *demo)
XGL_MEMORY_REQUIREMENTS *mem_reqs;
XGL_SIZE mem_reqs_size = sizeof(XGL_MEMORY_REQUIREMENTS);
+ XGL_IMAGE_MEMORY_REQUIREMENTS img_reqs;
+ XGL_SIZE img_reqs_size = sizeof(XGL_IMAGE_MEMORY_REQUIREMENTS);
XGL_RESULT err;
XGL_UINT num_allocations = 0;
XGL_SIZE num_alloc_size = sizeof(num_allocations);
@@ -314,7 +329,13 @@ static void demo_prepare_depth(struct demo *demo)
XGL_INFO_TYPE_MEMORY_REQUIREMENTS,
&mem_reqs_size, mem_reqs);
assert(!err && mem_reqs_size == num_allocations * sizeof(XGL_MEMORY_REQUIREMENTS));
-
+ err = xglGetObjectInfo(demo->depth.image,
+ XGL_INFO_TYPE_IMAGE_MEMORY_REQUIREMENTS,
+ &img_reqs_size, &img_reqs);
+ assert(!err && img_reqs_size == sizeof(XGL_IMAGE_MEMORY_REQUIREMENTS));
+ img_alloc.usage = img_reqs.usage;
+ img_alloc.formatClass = img_reqs.formatClass;
+ img_alloc.samples = img_reqs.samples;
for (XGL_UINT i = 0; i < num_allocations; i ++) {
mem_alloc.allocationSize = mem_reqs[i].size;
mem_alloc.alignment = mem_reqs[i].alignment;
@@ -383,9 +404,13 @@ static void demo_prepare_textures(struct demo *demo)
.usage = XGL_IMAGE_USAGE_SHADER_ACCESS_READ_BIT,
.flags = 0,
};
+ XGL_MEMORY_ALLOC_IMAGE_INFO img_alloc = {
+ .sType = XGL_STRUCTURE_TYPE_MEMORY_ALLOC_IMAGE_INFO,
+ .pNext = NULL,
+ };
XGL_MEMORY_ALLOC_INFO mem_alloc = {
.sType = XGL_STRUCTURE_TYPE_MEMORY_ALLOC_INFO,
- .pNext = NULL,
+ .pNext = &img_alloc,
.allocationSize = 0,
.alignment = 0,
.flags = 0,
@@ -408,6 +433,8 @@ static void demo_prepare_textures(struct demo *demo)
XGL_MEMORY_REQUIREMENTS *mem_reqs;
XGL_SIZE mem_reqs_size = sizeof(XGL_MEMORY_REQUIREMENTS);
+ XGL_IMAGE_MEMORY_REQUIREMENTS img_reqs;
+ XGL_SIZE img_reqs_size = sizeof(XGL_IMAGE_MEMORY_REQUIREMENTS);
XGL_UINT num_allocations = 0;
XGL_SIZE num_alloc_size = sizeof(num_allocations);
@@ -432,7 +459,13 @@ static void demo_prepare_textures(struct demo *demo)
XGL_INFO_TYPE_MEMORY_REQUIREMENTS,
&mem_reqs_size, mem_reqs);
assert(!err && mem_reqs_size == num_allocations * sizeof(XGL_MEMORY_REQUIREMENTS));
-
+ err = xglGetObjectInfo(demo->textures[i].image,
+ XGL_INFO_TYPE_IMAGE_MEMORY_REQUIREMENTS,
+ &img_reqs_size, &img_reqs);
+ assert(!err && img_reqs_size == sizeof(XGL_IMAGE_MEMORY_REQUIREMENTS));
+ img_alloc.usage = img_reqs.usage;
+ img_alloc.formatClass = img_reqs.formatClass;
+ img_alloc.samples = img_reqs.samples;
for (XGL_UINT j = 0; j < num_allocations; j ++) {
mem_alloc.allocationSize = mem_reqs[j].size;
mem_alloc.alignment = mem_reqs[j].alignment;
@@ -505,9 +538,13 @@ static void demo_prepare_vertices(struct demo *demo)
.usage = XGL_BUFFER_USAGE_VERTEX_FETCH_BIT,
.flags = 0,
};
+ XGL_MEMORY_ALLOC_BUFFER_INFO buf_alloc = {
+ .sType = XGL_STRUCTURE_TYPE_MEMORY_ALLOC_BUFFER_INFO,
+ .pNext = NULL,
+ };
XGL_MEMORY_ALLOC_INFO mem_alloc = {
.sType = XGL_STRUCTURE_TYPE_MEMORY_ALLOC_INFO,
- .pNext = NULL,
+ .pNext = &buf_alloc,
.allocationSize = 0,
.alignment = 0,
.flags = 0,
@@ -515,8 +552,12 @@ static void demo_prepare_vertices(struct demo *demo)
.pHeaps = 0,
.memPriority = XGL_MEMORY_PRIORITY_NORMAL,
};
- XGL_MEMORY_REQUIREMENTS mem_reqs;
+ XGL_MEMORY_REQUIREMENTS *mem_reqs;
XGL_SIZE mem_reqs_size = sizeof(XGL_MEMORY_REQUIREMENTS);
+ XGL_BUFFER_MEMORY_REQUIREMENTS buf_reqs;
+ XGL_SIZE buf_reqs_size = sizeof(XGL_BUFFER_MEMORY_REQUIREMENTS);
+ XGL_UINT num_allocations = 0;
+ XGL_SIZE num_alloc_size = sizeof(num_allocations);
XGL_RESULT err;
void *data;
@@ -526,29 +567,43 @@ static void demo_prepare_vertices(struct demo *demo)
assert(!err);
err = xglGetObjectInfo(demo->vertices.buf,
+ XGL_INFO_TYPE_MEMORY_ALLOCATION_COUNT,
+ &num_alloc_size, &num_allocations);
+ assert(!err && num_alloc_size == sizeof(num_allocations));
+ mem_reqs = malloc(num_allocations * sizeof(XGL_MEMORY_REQUIREMENTS));
+ demo->vertices.mem = malloc(num_allocations * sizeof(XGL_GPU_MEMORY));
+ demo->vertices.num_mem = num_allocations;
+ err = xglGetObjectInfo(demo->vertices.buf,
XGL_INFO_TYPE_MEMORY_REQUIREMENTS,
- &mem_reqs_size, &mem_reqs);
- assert(!err && mem_reqs_size == sizeof(mem_reqs));
- mem_alloc.allocationSize = mem_reqs.size;
- mem_alloc.alignment = mem_reqs.alignment;
- mem_alloc.heapCount = mem_reqs.heapCount;
- mem_alloc.pHeaps = mem_reqs.pHeaps;
- memcpy((XGL_UINT *)mem_alloc.pHeaps, mem_reqs.pHeaps,
- sizeof(mem_reqs.pHeaps[0]) * mem_reqs.heapCount);
-
- err = xglAllocMemory(demo->device, &mem_alloc, &demo->vertices.mem);
- assert(!err);
+ &mem_reqs_size, mem_reqs);
+ assert(!err && mem_reqs_size == sizeof(*mem_reqs));
+ err = xglGetObjectInfo(demo->vertices.buf,
+ XGL_INFO_TYPE_BUFFER_MEMORY_REQUIREMENTS,
+ &buf_reqs_size, &buf_reqs);
+ assert(!err && buf_reqs_size == sizeof(XGL_BUFFER_MEMORY_REQUIREMENTS));
+ buf_alloc.usage = buf_reqs.usage;
+ for (XGL_UINT i = 0; i < num_allocations; i ++) {
+ mem_alloc.allocationSize = mem_reqs[i].size;
+ mem_alloc.alignment = mem_reqs[i].alignment;
+ mem_alloc.heapCount = mem_reqs[i].heapCount;
+ mem_alloc.pHeaps = mem_reqs[i].pHeaps;
+ memcpy(mem_alloc.pHeaps, mem_reqs[i].pHeaps,
+ sizeof(mem_reqs[i].pHeaps[0]) * mem_reqs[i].heapCount);
- err = xglMapMemory(demo->vertices.mem, 0, &data);
- assert(!err);
+ err = xglAllocMemory(demo->device, &mem_alloc, &demo->vertices.mem[i]);
+ assert(!err);
- memcpy(data, vb, sizeof(vb));
+ err = xglMapMemory(demo->vertices.mem[i], 0, &data);
+ assert(!err);
- err = xglUnmapMemory(demo->vertices.mem);
- assert(!err);
+ memcpy(data, vb, sizeof(vb));
- err = xglBindObjectMemory(demo->vertices.buf, 0, demo->vertices.mem, 0);
- assert(!err);
+ err = xglUnmapMemory(demo->vertices.mem[i]);
+ assert(!err);
+
+ err = xglBindObjectMemory(demo->vertices.buf, i, demo->vertices.mem[i], 0);
+ assert(!err);
+ }
demo->vertices.vi.sType = XGL_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_CREATE_INFO;
demo->vertices.vi.pNext = NULL;
@@ -1065,7 +1120,8 @@ static void demo_cleanup(struct demo *demo)
xglBindObjectMemory(demo->vertices.buf, 0, XGL_NULL_HANDLE, 0);
xglDestroyObject(demo->vertices.buf);
- xglFreeMemory(demo->vertices.mem);
+ for (j = 0; j < demo->vertices.num_mem; j++)
+ xglFreeMemory(demo->vertices.mem[j]);
for (i = 0; i < DEMO_TEXTURE_COUNT; i++) {
xglDestroyObject(demo->textures[i].view);
diff --git a/icd/common/icd-format.c b/icd/common/icd-format.c
index d53d4248..688ab4fc 100644
--- a/icd/common/icd-format.c
+++ b/icd/common/icd-format.c
@@ -78,6 +78,72 @@ size_t icd_format_get_size(XGL_FORMAT format)
return icd_format_table[format.channelFormat].size;
}
+XGL_IMAGE_FORMAT_CLASS icd_format_get_class(XGL_FORMAT format)
+{
+ if (icd_format_is_undef(format))
+ assert(!"undefined format");
+ if (icd_format_is_compressed(format)) {
+ switch (icd_format_get_size(format)) {
+ case 8:
+ return XGL_IMAGE_FORMAT_CLASS_64_BIT_BLOCK;
+ case 16:
+ return XGL_IMAGE_FORMAT_CLASS_128_BIT_BLOCK;
+ default:
+ assert(!"illegal compressed format");
+ }
+ } else if (icd_format_is_ds(format)) {
+ switch (icd_format_get_size(format)) {
+ case 1:
+ return XGL_IMAGE_FORMAT_CLASS_S8;
+ case 2:
+ return XGL_IMAGE_FORMAT_CLASS_D16;
+ case 3:
+ switch (icd_format_get_channel_count(format)) {
+ case 1:
+ return XGL_IMAGE_FORMAT_CLASS_D24;
+ case 2:
+ return XGL_IMAGE_FORMAT_CLASS_D16S8;
+ default:
+ assert(!"illegal depth stencil format channels");
+ }
+ case 4:
+ switch (icd_format_get_channel_count(format)) {
+ case 1:
+ return XGL_IMAGE_FORMAT_CLASS_D32;
+ case 2:
+ return XGL_IMAGE_FORMAT_CLASS_D24S8;
+ default:
+ assert(!"illegal depth stencil format channels");
+ }
+ case 5:
+ return XGL_IMAGE_FORMAT_CLASS_D32S8;
+ default:
+ assert(!"illegal depth stencil format");
+ }
+ } else { /* uncompressed color format */
+ switch (icd_format_get_size(format)) {
+ case 1:
+ return XGL_IMAGE_FORMAT_CLASS_8_BITS;
+ case 2:
+ return XGL_IMAGE_FORMAT_CLASS_16_BITS;
+ case 3:
+ return XGL_IMAGE_FORMAT_CLASS_24_BITS;
+ case 4:
+ return XGL_IMAGE_FORMAT_CLASS_32_BITS;
+ case 6:
+ return XGL_IMAGE_FORMAT_CLASS_48_BITS;
+ case 8:
+ return XGL_IMAGE_FORMAT_CLASS_64_BITS;
+ case 12:
+ return XGL_IMAGE_FORMAT_CLASS_96_BITS;
+ case 16:
+ return XGL_IMAGE_FORMAT_CLASS_128_BITS;
+ default:
+ assert(!"illegal uncompressed color format");
+ }
+ }
+}
+
unsigned int icd_format_get_channel_count(XGL_FORMAT format)
{
return icd_format_table[format.channelFormat].channel_count;
diff --git a/icd/common/icd-format.h b/icd/common/icd-format.h
index e628b1b0..9c417001 100644
--- a/icd/common/icd-format.h
+++ b/icd/common/icd-format.h
@@ -105,6 +105,8 @@ static inline int icd_format_get_block_width(XGL_FORMAT format)
size_t icd_format_get_size(XGL_FORMAT format);
+XGL_IMAGE_FORMAT_CLASS icd_format_get_class(XGL_FORMAT format);
+
unsigned int icd_format_get_channel_count(XGL_FORMAT format);
void icd_format_get_raw_value(XGL_FORMAT format,
diff --git a/include/xgl.h b/include/xgl.h
index 80f0a64e..45c69d4a 100644
--- a/include/xgl.h
+++ b/include/xgl.h
@@ -952,6 +952,8 @@ typedef enum _XGL_STRUCTURE_TYPE
XGL_STRUCTURE_TYPE_UPDATE_IMAGES = 51,
XGL_STRUCTURE_TYPE_UPDATE_BUFFERS = 52,
XGL_STRUCTURE_TYPE_UPDATE_AS_COPY = 53,
+ XGL_STRUCTURE_TYPE_MEMORY_ALLOC_BUFFER_INFO = 54,
+ XGL_STRUCTURE_TYPE_MEMORY_ALLOC_IMAGE_INFO = 55,
XGL_MAX_ENUM(_XGL_STRUCTURE_TYPE)
} XGL_STRUCTURE_TYPE;
@@ -991,16 +993,24 @@ typedef enum _XGL_MEMORY_ALLOC_FLAGS
XGL_MEMORY_ALLOC_SHAREABLE_BIT = 0x00000001,
} XGL_MEMORY_ALLOC_FLAGS;
-// Buffer usage flags
+// Buffer and buffer allocation usage flags
typedef enum _XGL_BUFFER_USAGE_FLAGS
{
- XGL_BUFFER_USAGE_SHADER_ACCESS_READ_BIT = 0x00000001, // Shader read (e.g. TBO, image buffer, UBO, SBBO)
+ XGL_BUFFER_USAGE_GENERAL = 0x00000000, // no special usage
+ XGL_BUFFER_USAGE_SHADER_ACCESS_READ_BIT = 0x00000001, // Shader read (e.g. TBO, image buffer, UBO, SSBO)
XGL_BUFFER_USAGE_SHADER_ACCESS_WRITE_BIT = 0x00000002, // Shader write (e.g. image buffer, SSBO)
XGL_BUFFER_USAGE_SHADER_ACCESS_ATOMIC_BIT = 0x00000004, // Shader atomic operations (e.g. image buffer, SSBO)
- XGL_BUFFER_USAGE_UNIFORM_READ_BIT = 0x00000008, // Uniform read (UBO)
- XGL_BUFFER_USAGE_INDEX_FETCH_BIT = 0x00000010, // Fixed function index fetch (index buffer)
- XGL_BUFFER_USAGE_VERTEX_FETCH_BIT = 0x00000020, // Fixed function vertex fetch (VBO)
- XGL_BUFFER_USAGE_INDIRECT_PARAMETER_FETCH_BIT = 0x00000040, // Can be the source of indirect parameters (e.g. indirect buffer, parameter buffer)
+ XGL_BUFFER_USAGE_TRANSFER_SOURCE_BIT = 0x00000008, // used as a source for copies
+ XGL_BUFFER_USAGE_TRANSFER_DESTINATION_BIT = 0x00000010, // used as a destination for copies
+ XGL_BUFFER_USAGE_UNIFORM_READ_BIT = 0x00000020, // Uniform read (UBO)
+ XGL_BUFFER_USAGE_INDEX_FETCH_BIT = 0x00000040, // Fixed function index fetch (index buffer)
+ XGL_BUFFER_USAGE_VERTEX_FETCH_BIT = 0x00000080, // Fixed function vertex fetch (VBO)
+ XGL_BUFFER_USAGE_SHADER_STORAGE_BIT = 0x00000100, // Shader storage buffer (SSBO)
+ XGL_BUFFER_USAGE_RAW_BUFFER_BIT = 0x00000200, // used as a raw buffer
+ XGL_BUFFER_USAGE_INDIRECT_PARAMETER_FETCH_BIT = 0x00000400, // Can be the source of indirect parameters (e.g. indirect buffer, parameter buffer)
+ XGL_BUFFER_USAGE_TEXTURE_BUFFER_BIT = 0x00000800, // texture buffer (TBO)
+ XGL_BUFFER_USAGE_IMAGE_BUFFER_BIT = 0x00001000, // image buffer (load/store)
+ XGL_MAX_ENUM(_XGL_BUFFER_USAGE_FLAGS)
} XGL_BUFFER_USAGE_FLAGS;
// Buffer flags
@@ -1022,14 +1032,44 @@ typedef enum _XGL_BUFFER_VIEW_TYPE
XGL_MAX_ENUM(_XGL_BUFFER_VIEW_TYPE)
} XGL_BUFFER_VIEW_TYPE;
-// Image usage flags
+// Images memory allocations can be used for resources of a given format class.
+typedef enum _XGL_IMAGE_FORMAT_CLASS
+{
+ XGL_IMAGE_FORMAT_CLASS_128_BITS = 1, // color formats
+ XGL_IMAGE_FORMAT_CLASS_96_BITS = 2,
+ XGL_IMAGE_FORMAT_CLASS_64_BITS = 3,
+ XGL_IMAGE_FORMAT_CLASS_48_BITS = 4,
+ XGL_IMAGE_FORMAT_CLASS_32_BITS = 5,
+ XGL_IMAGE_FORMAT_CLASS_24_BITS = 6,
+ XGL_IMAGE_FORMAT_CLASS_16_BITS = 7,
+ XGL_IMAGE_FORMAT_CLASS_8_BITS = 8,
+ XGL_IMAGE_FORMAT_CLASS_128_BIT_BLOCK = 9, // 128-bit block compressed formats
+ XGL_IMAGE_FORMAT_CLASS_64_BIT_BLOCK = 10, // 64-bit block compressed formats
+ XGL_IMAGE_FORMAT_CLASS_D32 = 11, // D32_SFLOAT
+ XGL_IMAGE_FORMAT_CLASS_D24 = 12, // D24_UNORM
+ XGL_IMAGE_FORMAT_CLASS_D16 = 13, // D16_UNORM
+ XGL_IMAGE_FORMAT_CLASS_S8 = 14, // S8_UINT
+ XGL_IMAGE_FORMAT_CLASS_D32S8 = 15, // D32_SFLOAT_S8_UINT
+ XGL_IMAGE_FORMAT_CLASS_D24S8 = 16, // D24_UNORM_S8_UINT
+ XGL_IMAGE_FORMAT_CLASS_D16S8 = 17, // D16_UNORM_S8_UINT
+ XGL_IMAGE_FORMAT_CLASS_LINEAR = 18, // used for pitch-linear (transparent) textures
+ XGL_MAX_ENUM(_XGL_IMAGE_FORMAT_CLASS)
+} XGL_IMAGE_FORMAT_CLASS;
+
+// Image and image allocation usage flags
typedef enum _XGL_IMAGE_USAGE_FLAGS
{
- XGL_IMAGE_USAGE_SHADER_ACCESS_READ_BIT = 0x00000001,
- XGL_IMAGE_USAGE_SHADER_ACCESS_WRITE_BIT = 0x00000002,
- XGL_IMAGE_USAGE_SHADER_ACCESS_ATOMIC_BIT = 0x00000004,
- XGL_IMAGE_USAGE_COLOR_ATTACHMENT_BIT = 0x00000008,
- XGL_IMAGE_USAGE_DEPTH_STENCIL_BIT = 0x00000010,
+ XGL_IMAGE_USAGE_GENERAL = 0x00000000, // no special usage
+ XGL_IMAGE_USAGE_SHADER_ACCESS_READ_BIT = 0x00000001, // shader read (e.g. texture, image)
+ XGL_IMAGE_USAGE_SHADER_ACCESS_WRITE_BIT = 0x00000002, // shader write (e.g. image)
+ XGL_IMAGE_USAGE_SHADER_ACCESS_ATOMIC_BIT = 0x00000004, // shader atomic operations (e.g. image)
+ XGL_IMAGE_USAGE_TRANSFER_SOURCE_BIT = 0x00000008, // used as a source for copies
+ XGL_IMAGE_USAGE_TRANSFER_DESTINATION_BIT = 0x00000010, // used as a destination for copies
+ XGL_IMAGE_USAGE_TEXTURE_BIT = 0x00000020, // opaque texture (2d, 3d, etc.)
+ XGL_IMAGE_USAGE_IMAGE_BIT = 0x00000040, // opaque image (2d, 3d, etc.)
+ XGL_IMAGE_USAGE_COLOR_ATTACHMENT_BIT = 0x00000080, // framebuffer color attachment
+ XGL_IMAGE_USAGE_DEPTH_STENCIL_BIT = 0x00000100, // framebuffer depth/stencil
+ XGL_MAX_ENUM(_XGL_IMAGE_USAGE_FLAGS)
} XGL_IMAGE_USAGE_FLAGS;
// Image flags
@@ -1279,6 +1319,26 @@ typedef struct _XGL_MEMORY_ALLOC_INFO
XGL_MEMORY_PRIORITY memPriority;
} XGL_MEMORY_ALLOC_INFO;
+// This structure is included in the XGL_MEMORY_ALLOC_INFO chain
+// for memory regions allocated for buffer usage.
+typedef struct _XGL_MEMORY_ALLOC_BUFFER_INFO
+{
+ XGL_STRUCTURE_TYPE sType; // Must be XGL_STRUCTURE_TYPE_MEMORY_ALLOC_BUFFER_INFO
+ XGL_VOID* pNext; // Pointer to next structure
+ XGL_FLAGS usage; // XGL_BUFFER_USAGE_FLAGS
+} XGL_MEMORY_ALLOC_BUFFER_INFO;
+
+// This structure is included in the XGL_MEMORY_ALLOC_INFO chain
+// for memory regions allocated for buffer usage.
+typedef struct _XGL_MEMORY_ALLOC_IMAGE_INFO
+{
+ XGL_STRUCTURE_TYPE sType; // Must be XGL_STRUCTURE_TYPE_MEMORY_ALLOC_IMAGE_INFO
+ XGL_VOID* pNext; // Pointer to next structure
+ XGL_FLAGS usage; // XGL_IMAGE_USAGE_FLAGS
+ XGL_IMAGE_FORMAT_CLASS formatClass;
+ XGL_UINT samples;
+} XGL_MEMORY_ALLOC_IMAGE_INFO;
+
typedef struct _XGL_MEMORY_OPEN_INFO
{
XGL_STRUCTURE_TYPE sType; // Must be XGL_STRUCTURE_TYPE_MEMORY_OPEN_INFO
@@ -1302,6 +1362,18 @@ typedef struct _XGL_MEMORY_REQUIREMENTS
XGL_UINT* pHeaps;
} XGL_MEMORY_REQUIREMENTS;
+typedef struct _XGL_BUFFER_MEMORY_REQUIREMENTS
+{
+ XGL_FLAGS usage; // XGL_BUFFER_USAGE_FLAGS
+} XGL_BUFFER_MEMORY_REQUIREMENTS;
+
+typedef struct _XGL_IMAGE_MEMORY_REQUIREMENTS
+{
+ XGL_FLAGS usage; // XGL_IMAGE_USAGE_FLAGS
+ XGL_IMAGE_FORMAT_CLASS formatClass;
+ XGL_UINT samples;
+} XGL_IMAGE_MEMORY_REQUIREMENTS;
+
typedef struct _XGL_FORMAT_PROPERTIES
{
XGL_FLAGS linearTilingFeatures; // XGL_FORMAT_FEATURE_FLAGS