memory alloc: Add MEMORY_ALLOCATION_COUNT support and usage in tests.
Driver always does one allocation but tests support drivers with N allocations.
Conflicts:
demos/cube.c
demos/tri.c
tests/image_tests.cpp
tests/render_tests.cpp
diff --git a/tests/image_tests.cpp b/tests/image_tests.cpp
index 2694e92..57213c1 100644
--- a/tests/image_tests.cpp
+++ b/tests/image_tests.cpp
@@ -79,7 +79,8 @@
XGL_PHYSICAL_GPU objs[XGL_MAX_PHYSICAL_GPUS];
XGL_UINT gpu_count;
XGL_IMAGE m_image;
- XGL_GPU_MEMORY m_image_mem;
+ XGL_GPU_MEMORY *m_image_mem;
+ XGL_UINT m_num_mem;
virtual void SetUp() {
XGL_RESULT err;
@@ -188,43 +189,60 @@
err = xglCreateImage(device(), &imageCreateInfo, &m_image);
ASSERT_XGL_SUCCESS(err);
- XGL_MEMORY_REQUIREMENTS mem_req;
- size_t data_size = sizeof(mem_req);
- err = xglGetObjectInfo(m_image, XGL_INFO_TYPE_MEMORY_REQUIREMENTS,
- &data_size, &mem_req);
- ASSERT_XGL_SUCCESS(err);
- ASSERT_EQ(data_size, sizeof(mem_req));
- ASSERT_NE(0, mem_req.size) << "xglGetObjectInfo (Event): Failed - expect images to require memory";
-
- // XGL_RESULT XGLAPI xglAllocMemory(
- // XGL_DEVICE device,
- // const XGL_MEMORY_ALLOC_INFO* pAllocInfo,
- // XGL_GPU_MEMORY* pMem);
+ XGL_MEMORY_REQUIREMENTS *mem_req;
+ XGL_SIZE mem_reqs_size = sizeof(XGL_MEMORY_REQUIREMENTS);
+ XGL_UINT num_allocations = 0;
+ XGL_SIZE num_alloc_size = sizeof(num_allocations);
XGL_MEMORY_ALLOC_INFO mem_info;
- XGL_UINT heapInfo[mem_req.heapCount];
- memset(&mem_info, 0, sizeof(mem_info));
- mem_info.sType = XGL_STRUCTURE_TYPE_MEMORY_ALLOC_INFO;
- mem_info.allocationSize = mem_req.size;
- mem_info.alignment = mem_req.alignment;
- mem_info.heapCount = mem_req.heapCount;
- mem_info.pHeaps = heapInfo;
- memcpy(heapInfo, mem_req.pHeaps, sizeof(XGL_UINT)*mem_info.heapCount);
- mem_info.memPriority = XGL_MEMORY_PRIORITY_NORMAL;
- mem_info.flags = XGL_MEMORY_ALLOC_SHAREABLE_BIT;
- err = xglAllocMemory(device(), &mem_info, &m_image_mem);
+ err = xglGetObjectInfo(m_image, XGL_INFO_TYPE_MEMORY_ALLOCATION_COUNT,
+ &num_alloc_size, &num_allocations);
ASSERT_XGL_SUCCESS(err);
+ ASSERT_EQ(num_alloc_size,sizeof(num_allocations));
+ mem_req = (XGL_MEMORY_REQUIREMENTS *) malloc(num_allocations * sizeof(XGL_MEMORY_REQUIREMENTS));
+ m_image_mem = (XGL_GPU_MEMORY *) malloc(num_allocations * sizeof(XGL_GPU_MEMORY));
+ m_num_mem = num_allocations;
+ err = xglGetObjectInfo(m_image,
+ XGL_INFO_TYPE_MEMORY_REQUIREMENTS,
+ &mem_reqs_size, mem_req);
+ ASSERT_XGL_SUCCESS(err);
+ ASSERT_EQ(mem_reqs_size, num_allocations * sizeof(XGL_MEMORY_REQUIREMENTS));
- err = xglBindObjectMemory(m_image, 0, m_image_mem, 0);
- ASSERT_XGL_SUCCESS(err);
+
+ for (XGL_UINT i = 0; i < num_allocations; i ++) {
+ ASSERT_NE(0, mem_req[i].size) << "xglGetObjectInfo (Image): Failed - expect images to require memory";
+ memset(&mem_info, 0, sizeof(mem_info));
+ mem_info.sType = XGL_STRUCTURE_TYPE_MEMORY_ALLOC_INFO;
+ mem_info.allocationSize = mem_req[i].size;
+ mem_info.alignment = mem_req[i].alignment;
+ mem_info.heapCount = mem_req[i].heapCount;
+ XGL_UINT heapInfo[mem_req[i].heapCount];
+ mem_info.pHeaps = heapInfo;
+ memcpy(heapInfo, mem_req[i].pHeaps, sizeof(XGL_UINT)*mem_info.heapCount);
+ mem_info.memPriority = XGL_MEMORY_PRIORITY_NORMAL;
+ mem_info.flags = XGL_MEMORY_ALLOC_SHAREABLE_BIT;
+
+ /* allocate memory */
+ err = xglAllocMemory(device(), &mem_info, &m_image_mem[i]);
+ ASSERT_XGL_SUCCESS(err);
+
+ /* bind memory */
+ err = xglBindObjectMemory(m_image, i, m_image_mem[i], 0);
+ ASSERT_XGL_SUCCESS(err);
+ }
}
void XglImageTest::DestroyImage()
{
+ XGL_RESULT err;
// All done with image memory, clean up
ASSERT_XGL_SUCCESS(xglBindObjectMemory(m_image, 0, XGL_NULL_HANDLE, 0));
- ASSERT_XGL_SUCCESS(xglFreeMemory(m_image_mem));
+ for (XGL_UINT i = 0 ; i < m_num_mem; i++) {
+ err = xglFreeMemory(m_image_mem[i]);
+ ASSERT_XGL_SUCCESS(err);
+ }
+
ASSERT_XGL_SUCCESS(xglDestroyObject(m_image));
}