tests: Convert render_test to use XglImage class
diff --git a/tests/render_tests.cpp b/tests/render_tests.cpp
index 6eadb24..573c621 100644
--- a/tests/render_tests.cpp
+++ b/tests/render_tests.cpp
@@ -65,6 +65,7 @@
 #include "gtest-1.7.0/include/gtest/gtest.h"
 
 #include "xgldevice.h"
+#include "xglimage.h"
 #include "icd-bil.h"
 
 #include "displayengine.h"
@@ -194,32 +195,21 @@
 
 class XglRenderTest : public ::testing::Test {
 public:
-    void CreateImage(XGL_UINT w, XGL_UINT h, XGL_IMAGE *pImage,
-                     XGL_GPU_MEMORY *pMem);
-    void DestroyImage();
-
     void CreateQueryPool(XGL_QUERY_TYPE type, XGL_UINT slots,
                          XGL_QUERY_POOL *pPool, XGL_GPU_MEMORY *pMem);
     void DestroyQueryPool(XGL_QUERY_POOL pool, XGL_GPU_MEMORY mem);
 
-    void CreateImageView(XGL_IMAGE_VIEW_CREATE_INFO* pCreateInfo,
-                         XGL_IMAGE_VIEW* pView);
-    void DestroyImageView(XGL_IMAGE_VIEW imageView);
     XGL_DEVICE device() {return m_device->device();}
     void CreateShader(XGL_PIPELINE_SHADER_STAGE stage, XGL_SHADER *pshader);
     void InitPipeline();
     void InitMesh( XGL_UINT32 numVertices, XGL_GPU_SIZE vbStride, const void* vertices );
     void DrawTriangleTest();
-    void WritePPM( const char *filename, int width, int height );
     DisplayEngine m_screen;
 
 protected:
     XGL_APPLICATION_INFO app_info;
     XGL_PHYSICAL_GPU objs[MAX_GPUS];
     XGL_UINT gpu_count;
-    XGL_IMAGE           m_image;
-    XGL_IMAGE_STATE     m_image_state;
-    XGL_GPU_MEMORY      m_image_mem;
     XGL_GPU_MEMORY      m_descriptor_set_mem;
     XGL_GPU_MEMORY      m_pipe_mem;
     XglDevice *m_device;
@@ -264,130 +254,6 @@
     }
 };
 
-void XglRenderTest::CreateImage(XGL_UINT w, XGL_UINT h, XGL_IMAGE *pImage,
-                                XGL_GPU_MEMORY *pMem)
-{
-    XGL_RESULT err;
-    XGL_UINT mipCount;
-    XGL_SIZE size;
-    XGL_FORMAT fmt;
-    XGL_FORMAT_PROPERTIES image_fmt;
-
-    mipCount = 0;
-
-    m_screen.Init(true, w, h);
-
-    XGL_UINT _w = w;
-    XGL_UINT _h = h;
-    while( ( _w > 0 ) || ( _h > 0 ) )
-    {
-        _w >>= 1;
-        _h >>= 1;
-        mipCount++;
-    }
-
-    fmt.channelFormat = XGL_CH_FMT_R8G8B8A8;
-    fmt.numericFormat = XGL_NUM_FMT_UNORM;
-    // TODO: Pick known good format rather than just expect common format
-    /*
-     * XXX: What should happen if given NULL HANDLE for the pData argument?
-     * We're not requesting XGL_INFO_TYPE_MEMORY_REQUIREMENTS so there is
-     * an expectation that pData is a valid pointer.
-     * However, why include a returned size value? That implies that the
-     * amount of data may vary and that doesn't work well for using a
-     * fixed structure.
-     */
-
-    err = xglGetFormatInfo(this->m_device->device(), fmt,
-                           XGL_INFO_TYPE_FORMAT_PROPERTIES,
-                           &size, &image_fmt);
-    ASSERT_XGL_SUCCESS(err);
-
-    //    typedef struct _XGL_IMAGE_CREATE_INFO
-    //    {
-    //        XGL_STRUCTURE_TYPE                      sType;                      // Must be XGL_STRUCTURE_TYPE_IMAGE_CREATE_INFO
-    //        const XGL_VOID*                         pNext;                      // Pointer to next structure.
-    //        XGL_IMAGE_TYPE                          imageType;
-    //        XGL_FORMAT                              format;
-    //        XGL_EXTENT3D                            extent;
-    //        XGL_UINT                                mipLevels;
-    //        XGL_UINT                                arraySize;
-    //        XGL_UINT                                samples;
-    //        XGL_IMAGE_TILING                        tiling;
-    //        XGL_FLAGS                               usage;                      // XGL_IMAGE_USAGE_FLAGS
-    //        XGL_FLAGS                               flags;                      // XGL_IMAGE_CREATE_FLAGS
-    //    } XGL_IMAGE_CREATE_INFO;
-
-
-    XGL_IMAGE_CREATE_INFO imageCreateInfo = {};
-    imageCreateInfo.sType = XGL_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
-    imageCreateInfo.imageType = XGL_IMAGE_2D;
-    imageCreateInfo.format = fmt;
-    imageCreateInfo.arraySize = 1;
-    imageCreateInfo.extent.width = w;
-    imageCreateInfo.extent.height = h;
-    imageCreateInfo.extent.depth = 1;
-    imageCreateInfo.mipLevels = mipCount;
-    imageCreateInfo.samples = 1;
-    imageCreateInfo.tiling = XGL_LINEAR_TILING;
-
-    // Image 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_COLOR_ATTACHMENT_BIT                    = 0x00000004,
-    //        XGL_IMAGE_USAGE_DEPTH_STENCIL_BIT                       = 0x00000008,
-    //    } XGL_IMAGE_USAGE_FLAGS;
-    imageCreateInfo.usage = XGL_IMAGE_USAGE_SHADER_ACCESS_WRITE_BIT | XGL_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
-
-    //    XGL_RESULT XGLAPI xglCreateImage(
-    //        XGL_DEVICE                                  device,
-    //        const XGL_IMAGE_CREATE_INFO*                pCreateInfo,
-    //        XGL_IMAGE*                                  pImage);
-    err = xglCreateImage(device(), &imageCreateInfo, pImage);
-    ASSERT_XGL_SUCCESS(err);
-
-    XGL_MEMORY_REQUIREMENTS mem_req;
-    XGL_UINT data_size;
-    err = xglGetObjectInfo(*pImage, 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";
-
-    m_image_state = XGL_IMAGE_STATE_UNINITIALIZED_TARGET;
-
-    //        XGL_RESULT XGLAPI xglAllocMemory(
-    //            XGL_DEVICE                                  device,
-    //            const XGL_MEMORY_ALLOC_INFO*                pAllocInfo,
-    //            XGL_GPU_MEMORY*                             pMem);
-    XGL_MEMORY_ALLOC_INFO mem_info;
-
-    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;
-    memcpy(mem_info.heaps, mem_req.heaps, sizeof(XGL_UINT)*XGL_MAX_MEMORY_HEAPS);
-    mem_info.memPriority = XGL_MEMORY_PRIORITY_NORMAL;
-    mem_info.flags = XGL_MEMORY_ALLOC_SHAREABLE_BIT;
-    err = xglAllocMemory(device(), &mem_info, pMem);
-    ASSERT_XGL_SUCCESS(err);
-
-    err = xglBindObjectMemory(*pImage, *pMem, 0);
-    ASSERT_XGL_SUCCESS(err);
-}
-
-void XglRenderTest::DestroyImage()
-{
-    // All done with image memory, clean up
-    ASSERT_XGL_SUCCESS(xglBindObjectMemory(m_image, XGL_NULL_HANDLE, 0));
-
-    ASSERT_XGL_SUCCESS(xglFreeMemory(m_image_mem));
-
-    ASSERT_XGL_SUCCESS(xglDestroyObject(m_image));
-}
 
 void XglRenderTest::CreateQueryPool(XGL_QUERY_TYPE type, XGL_UINT slots,
                                     XGL_QUERY_POOL *pPool, XGL_GPU_MEMORY *pMem)
@@ -439,18 +305,6 @@
     ASSERT_XGL_SUCCESS(xglDestroyObject(pool));
 }
 
-void XglRenderTest::CreateImageView(XGL_IMAGE_VIEW_CREATE_INFO *pCreateInfo,
-                                   XGL_IMAGE_VIEW *pView)
-{
-    pCreateInfo->image = this->m_image;
-    ASSERT_XGL_SUCCESS(xglCreateImageView(device(), pCreateInfo, pView));
-}
-
-void XglRenderTest::DestroyImageView(XGL_IMAGE_VIEW imageView)
-{
-    ASSERT_XGL_SUCCESS(xglDestroyObject(imageView));
-}
-
 void XglRenderTest::CreateShader(XGL_PIPELINE_SHADER_STAGE stage, XGL_SHADER *pshader)
 {
     struct icd_bil_header *pBIL;
@@ -645,7 +499,15 @@
     err = xglCreateCommandBuffer(device(), &cmdInfo, &m_cmdBuffer);
     ASSERT_XGL_SUCCESS(err) << "xglCreateCommandBuffer failed";
 
-    ASSERT_NO_FATAL_FAILURE(CreateImage(width, height, &m_image, &m_image_mem));
+    XglImage *renderTarget;
+    XGL_FORMAT fmt = {
+        XGL_CH_FMT_R8G8B8A8,
+        XGL_NUM_FMT_UNORM
+    };
+    ASSERT_NO_FATAL_FAILURE(m_device->CreateImage(width, height, fmt,
+                                                  XGL_IMAGE_USAGE_SHADER_ACCESS_WRITE_BIT |
+                                                  XGL_IMAGE_USAGE_COLOR_ATTACHMENT_BIT,
+                                                  &renderTarget));
 
 #if 0
     // Create descriptor set for our one resource
@@ -753,30 +615,6 @@
     ASSERT_XGL_SUCCESS(xglDestroyObject(ps));
     ASSERT_XGL_SUCCESS(xglDestroyObject(vs));
 
-//    typedef struct _XGL_COLOR_ATTACHMENT_VIEW_CREATE_INFO
-//    {
-//        XGL_STRUCTURE_TYPE                      sType;                  // Must be XGL_STRUCTURE_TYPE_COLOR_ATTACHMENT_VIEW_CREATE_INFO
-//        XGL_VOID*                               pNext;                  // Pointer to next structure
-//        XGL_IMAGE                               image;
-//        XGL_FORMAT                              format;
-//        XGL_UINT                                mipLevel;
-//        XGL_UINT                                baseArraySlice;
-//        XGL_UINT                                arraySize;
-//    } XGL_COLOR_ATTACHMENT_VIEW_CREATE_INFO;
-    XGL_COLOR_ATTACHMENT_VIEW_CREATE_INFO createView = {
-        XGL_STRUCTURE_TYPE_COLOR_ATTACHMENT_VIEW_CREATE_INFO,
-        XGL_NULL_HANDLE,
-        this->m_image,
-        {XGL_CH_FMT_R8G8B8A8, XGL_NUM_FMT_UNORM},
-        0,
-        0,
-        1
-    };
-    XGL_COLOR_ATTACHMENT_VIEW colorView;
-
-    err = xglCreateColorAttachmentView(device(), &createView, &colorView);
-    ASSERT_XGL_SUCCESS(err);
-
     XGL_QUERY_POOL query;
     XGL_GPU_MEMORY query_mem;
     ASSERT_NO_FATAL_FAILURE(CreateQueryPool(XGL_QUERY_PIPELINE_STATISTICS, 1, &query, &query_mem));
@@ -795,29 +633,29 @@
 
     // prepare the whole back buffer for clear
     XGL_IMAGE_STATE_TRANSITION transitionToClear = {};
-    transitionToClear.image = m_image;
-    transitionToClear.oldState = m_image_state;
+    transitionToClear.image = renderTarget->image();
+    transitionToClear.oldState = renderTarget->state();
     transitionToClear.newState = XGL_IMAGE_STATE_CLEAR;
     transitionToClear.subresourceRange = srRange;
     xglCmdPrepareImages( m_cmdBuffer, 1, &transitionToClear );
-    m_image_state = ( XGL_IMAGE_STATE ) transitionToClear.newState;
+    renderTarget->state(( XGL_IMAGE_STATE ) transitionToClear.newState);
 
     // clear the back buffer to dark grey
     XGL_UINT clearColor[4] = {64, 64, 64, 0};
-    xglCmdClearColorImageRaw( m_cmdBuffer, m_image, clearColor, 1, &srRange );
+    xglCmdClearColorImageRaw( m_cmdBuffer, renderTarget->image(), clearColor, 1, &srRange );
 
     // prepare back buffer for rendering
     XGL_IMAGE_STATE_TRANSITION transitionToRender = {};
-    transitionToRender.image = m_image;
-    transitionToRender.oldState = m_image_state;
+    transitionToRender.image = renderTarget->image();
+    transitionToRender.oldState = renderTarget->state();
     transitionToRender.newState = XGL_IMAGE_STATE_TARGET_RENDER_ACCESS_OPTIMAL;
     transitionToRender.subresourceRange = srRange;
     xglCmdPrepareImages( m_cmdBuffer, 1, &transitionToRender );
-    m_image_state = ( XGL_IMAGE_STATE ) transitionToRender.newState;
+    renderTarget->state(( XGL_IMAGE_STATE ) transitionToClear.newState);
 
     // bind render target
     XGL_COLOR_ATTACHMENT_BIND_INFO colorBind = {};
-    colorBind.view  = colorView;
+    colorBind.view  = renderTarget->targetView();
     colorBind.colorAttachmentState = XGL_IMAGE_STATE_TARGET_RENDER_ACCESS_OPTIMAL;
     xglCmdBindAttachments(m_cmdBuffer, 1, &colorBind, NULL );
 
@@ -881,8 +719,11 @@
 
     DestroyQueryPool(query, query_mem);
 
-    WritePPM( "TriangleTest.ppm", width, height );
-    m_screen.Display(m_image, m_image_mem);
+    const ::testing::TestInfo* const test_info =
+      ::testing::UnitTest::GetInstance()->current_test_info();
+
+    renderTarget->WritePPM(test_info->test_case_name());
+//    m_screen.Display(renderTarget, m_image_mem);
 
     ASSERT_XGL_SUCCESS(xglDestroyObject(pipeline));
     ASSERT_XGL_SUCCESS(xglDestroyObject(m_cmdBuffer));
@@ -890,63 +731,15 @@
     ASSERT_XGL_SUCCESS(xglDestroyObject(m_stateViewport));
     ASSERT_XGL_SUCCESS(xglDestroyObject(m_stateDepthStencil));
     ASSERT_XGL_SUCCESS(xglDestroyObject(m_stateMsaa));
-    DestroyImage();
-    // DestroyImageView();
+    free(renderTarget);
 }
 
-void XglRenderTest::WritePPM( const char *filename, int width, int height )
-{
-    XGL_RESULT err;
-    int x, y;
-
-    const XGL_IMAGE_SUBRESOURCE sr = {
-        XGL_IMAGE_ASPECT_COLOR, 0, 0
-    };
-    XGL_SUBRESOURCE_LAYOUT sr_layout;
-    XGL_UINT data_size;
-
-    err = xglGetImageSubresourceInfo( m_image, &sr, XGL_INFO_TYPE_SUBRESOURCE_LAYOUT, &data_size, &sr_layout);
-    ASSERT_XGL_SUCCESS( err );
-    ASSERT_EQ(data_size, sizeof(sr_layout));
-
-    const char *ptr;
-
-    err = xglMapMemory( m_image_mem, 0, (XGL_VOID **) &ptr );
-    ASSERT_XGL_SUCCESS( err );
-
-    ptr += sr_layout.offset;
-
-    ofstream file (filename);
-    ASSERT_TRUE(file.is_open()) << "Unable to open file: " << filename;
-
-    file << "P6\n";
-    file << width << "\n";
-    file << height << "\n";
-    file << 255 << "\n";
-
-    for (y = 0; y < height; y++) {
-        const char *row = ptr;
-
-        for (x = 0; x < width; x++) {
-            file.write(row, 3);
-            row += 4;
-        }
-
-        ptr += sr_layout.rowPitch;
-    }
-
-    file.close();
-
-    err = xglUnmapMemory( m_image_mem );
-    ASSERT_XGL_SUCCESS( err );
-}
 
 TEST_F(XglRenderTest, TestDrawTriangle) {
     DrawTriangleTest();
 }
 
 int main(int argc, char **argv) {
-//    glutInit(argc, argv);
     ::testing::InitGoogleTest(&argc, argv);
     glutInit(&argc, argv);
     return RUN_ALL_TESTS();