tests: Get tests running and compiling on Windows
diff --git a/tests/vkrenderframework.cpp b/tests/vkrenderframework.cpp
index 5a1da2b..ae0eceb 100644
--- a/tests/vkrenderframework.cpp
+++ b/tests/vkrenderframework.cpp
@@ -215,15 +215,36 @@
 
     for (i = 0; i < targets; i++) {
         VkImageObj *img = new VkImageObj(m_device);
-        img->init(m_width, m_height, m_render_target_fmt,
-                VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT);
+ 
+        VkFormatProperties props;
+        size_t size = sizeof(props);
+        VkResult err;
+
+        err = vkGetFormatInfo(m_device->obj(), m_render_target_fmt,
+            VK_FORMAT_INFO_TYPE_PROPERTIES,
+            &size, &props);
+        ASSERT_VK_SUCCESS(err);
+
+        if (props.linearTilingFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT) {
+            img->init(m_width, m_height, m_render_target_fmt,
+            VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_LINEAR);
+        }
+        else if (props.optimalTilingFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT) {
+            img->init(m_width, m_height, m_render_target_fmt,
+            VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL);
+        }
+        else {
+            FAIL() << "Neither Linear nor Optimal allowed for render target";
+        }
+        
+        m_renderTargets.push_back(img);
         m_colorBindings[i].view  = img->targetView();
         m_colorBindings[i].layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
-        m_renderTargets.push_back(img);
         load_ops.push_back(VK_ATTACHMENT_LOAD_OP_LOAD);
         store_ops.push_back(VK_ATTACHMENT_STORE_OP_STORE);
         clear_colors.push_back(m_clear_color);
     }
+
       // Create Framebuffer and RenderPass with color attachments and any depth/stencil attachment
     VkFramebufferCreateInfo fb_info = {};
     fb_info.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
@@ -493,6 +514,11 @@
                            VkImageLayout image_layout)
 {
     VkResult U_ASSERT_ONLY err;
+
+    if (image_layout == m_descriptorInfo.imageLayout) {
+        return;
+    }
+
     VkCommandBufferObj cmd_buf(m_device);
 
     /* Build command buffer to set image layout in the driver */
diff --git a/tests/vktestbinding.cpp b/tests/vktestbinding.cpp
index 8579b7e..78aaef1 100644
--- a/tests/vktestbinding.cpp
+++ b/tests/vktestbinding.cpp
@@ -412,7 +412,7 @@
     queue_node_count = data_size / sizeof(VkPhysicalDeviceQueueProperties);
     EXPECT(queue_node_count >= 1);
 
-    VkPhysicalDeviceQueueProperties queue_props[queue_node_count];
+    VkPhysicalDeviceQueueProperties* queue_props = new VkPhysicalDeviceQueueProperties[queue_node_count];
 
     err = vkGetPhysicalDeviceInfo(gpu_.obj(), VK_PHYSICAL_DEVICE_INFO_TYPE_QUEUE_PROPERTIES,
                         &data_size, queue_props);
@@ -440,6 +440,8 @@
         }
     }
 
+    delete queue_props;
+
     EXPECT(!queues_[GRAPHICS].empty() || !queues_[COMPUTE].empty());
 }
 
diff --git a/tests/vktestframework.cpp b/tests/vktestframework.cpp
index 9b1e7ad..ab8b881 100644
--- a/tests/vktestframework.cpp
+++ b/tests/vktestframework.cpp
@@ -22,8 +22,6 @@
 
 #include "vktestframework.h"
 #include "vkrenderframework.h"
-#include "GL/freeglut_std.h"
-//#include "ShaderLang.h"
 #include "GlslangToSpv.h"
 #include <limits.h>
 #include <math.h>
@@ -31,6 +29,10 @@
 #include <xcb/xcb.h>
 #include <vk_wsi_lunarg.h>
 
+#if defined(PATH_MAX) && !defined(MAX_PATH)
+#define MAX_PATH PATH_MAX
+#endif
+
 // Command-line options
 enum TOptions {
     EOptionNone               = 0x000,
@@ -59,6 +61,10 @@
     void CreateMyWindow();
     void CreateSwapChain();
     void TearDown();
+#ifdef _WIN32
+    static LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
+#endif
+
 
 protected:
     vk_testing::Device                    &m_device;
@@ -66,10 +72,16 @@
     vk_testing::CmdBuffer                  m_cmdbuf;
 
 private:
+#ifdef _WIN32
+    HINSTANCE                              m_connection;        // hInstance - Windows Instance
+    HWND                                   m_window;          // hWnd - window handle
+
+#else
     xcb_connection_t                       *m_connection;
     xcb_screen_t                           *m_screen;
     xcb_window_t                            m_window;
     xcb_intern_atom_reply_t                *m_atom_wm_delete_window;
+#endif
     std::list<VkTestImageRecord>            m_images;
 
     VkSwapChainWSI                          m_swap_chain;
@@ -115,6 +127,8 @@
 
 #endif
 
+
+
 // Set up environment for GLSL compiler
 // Must be done once per process
 void TestEnvironment::SetUp()
@@ -229,14 +243,14 @@
 
     filename.append(basename);
     filename.append(".ppm");
-
+    
     const VkImageSubresource sr = {
         VK_IMAGE_ASPECT_COLOR, 0, 0
     };
     VkSubresourceLayout sr_layout;
     size_t data_size = sizeof(sr_layout);
-
-    err = vkGetImageSubresourceInfo(image->device()->device(),  image->image(), &sr,
+   
+    err = vkGetImageSubresourceInfo(image->device()->device(), displayImage.image(), &sr,
                                       VK_SUBRESOURCE_INFO_TYPE_LAYOUT,
                                       &data_size, &sr_layout);
     ASSERT_VK_SUCCESS( err );
@@ -245,8 +259,7 @@
     char *ptr;
     ptr = (char *) displayImage.map();
     ptr += sr_layout.offset;
-
-    ofstream file (filename.c_str());
+    ofstream file (filename.c_str(), ios::binary);
     ASSERT_TRUE(file.is_open()) << "Unable to open file: " << filename;
 
     file << "P6\n";
@@ -292,7 +305,7 @@
     MagickWand *magick_wand_2;
     MagickWand *compare_wand;
     MagickBooleanType status;
-    char testimage[256],golden[PATH_MAX+256],golddir[PATH_MAX] = "./golden";
+    char testimage[256],golden[MAX_PATH+256],golddir[MAX_PATH] = "./golden";
     double differenz;
 
     if (getenv("RENDERTEST_GOLDEN_DIR"))
@@ -444,6 +457,7 @@
     present.image = m_display_image->m_presentableImage;
     present.flipInterval = 1;
 
+#ifndef _WIN32
     xcb_change_property (m_connection,
                          XCB_PROP_MODE_REPLACE,
                          m_window,
@@ -452,7 +466,7 @@
                          8,
                          m_display_image->m_title.size(),
                          m_display_image->m_title.c_str());
-
+#endif
     err = vkQueuePresentWSI(m_queue.obj(), &present);
     assert(!err);
 
@@ -460,6 +474,55 @@
 
 }
 
+#ifdef _WIN32
+// MS-Windows event handling function:
+LRESULT CALLBACK TestFrameworkVkPresent::WndProc(HWND hWnd,
+                        UINT uMsg,
+                         WPARAM wParam,
+                         LPARAM lParam)
+{
+	
+    switch(uMsg)
+    {
+       case WM_CLOSE:
+            PostQuitMessage(0);
+            break;
+            
+       case WM_PAINT:
+       {
+           TestFrameworkVkPresent* me = reinterpret_cast<TestFrameworkVkPresent*>(GetWindowLongPtr(hWnd, GWLP_USERDATA));
+           if (me) {
+               me->Display();
+           }
+       }
+       return 0;
+         
+        default:
+          break;
+    }
+    return (DefWindowProc(hWnd, uMsg, wParam, lParam));
+}
+
+void TestFrameworkVkPresent::Run()
+{
+    MSG msg;         // message
+    bool done;
+
+    done = false; //initialize loop condition variable
+    /* main message loop*/
+    while(!done) {
+        PeekMessage(&msg, NULL, 0, 0, PM_REMOVE);
+        if (msg.message == WM_QUIT) {    
+            done = true; //if found, quit app
+        } else {
+            /* Translate and dispatch to event queue*/
+            TranslateMessage(&msg);
+            DispatchMessage(&msg);
+        }
+    }
+}
+
+#else
 void  TestFrameworkVkPresent::HandleEvent(xcb_generic_event_t *event)
 {
     uint8_t event_code = event->response_type & 0x7f;
@@ -525,6 +588,7 @@
         }
     }
 }
+#endif // _WIN32
 
 void TestFrameworkVkPresent::CreateSwapChain()
 {
@@ -600,6 +664,66 @@
     m_images = imagesIn;
 }
 
+#ifdef _WIN32
+void  TestFrameworkVkPresent::CreateMyWindow()
+{
+   WNDCLASSEX  win_class;
+   // const ::testing::TestInfo* const test_info =
+   // 	::testing::UnitTest::GetInstance()->current_test_info();
+   m_connection = GetModuleHandle(NULL);	
+
+	for (std::list<VkTestImageRecord>::const_iterator it = m_images.begin();
+    	it != m_images.end(); it++) {
+		if (m_width < it->m_width)
+			m_width = it->m_width;
+        if (m_height < it->m_height)
+			m_height = it->m_height;
+	}
+    // Initialize the window class structure:
+   win_class.cbSize = sizeof(WNDCLASSEX);
+   win_class.style = CS_HREDRAW | CS_VREDRAW;
+   win_class.lpfnWndProc = (WNDPROC) &TestFrameworkVkPresent::WndProc;
+   win_class.cbClsExtra = 0;
+   win_class.cbWndExtra = 0;
+   win_class.hInstance = m_connection; // hInstance
+   win_class.hIcon = LoadIcon(NULL, IDI_APPLICATION);
+   win_class.hCursor = LoadCursor(NULL, IDC_ARROW);
+   win_class.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
+   win_class.lpszMenuName = NULL;
+   win_class.lpszClassName = "Test";
+   win_class.hIconSm = LoadIcon(NULL, IDI_WINLOGO);
+   // Register window class:
+    if (!RegisterClassEx(&win_class)) {
+        // It didn't work, so try to give a useful error:
+            printf("Unexpected error trying to start the application!\n");
+        fflush(stdout);
+        exit(1);
+    }
+   // Create window with the registered class:
+    m_window = CreateWindowEx(0,
+                                  "Test",           // class name
+                                  "Test",           // app name
+                                  WS_OVERLAPPEDWINDOW | // window style
+                                  WS_VISIBLE |
+                                  WS_SYSMENU,
+                                  100,100,              // x/y coords
+                                  m_width,          // width
+                                  m_height,         // height
+                                  NULL,                 // handle to parent
+                                  NULL,                 // handle to menu
+                                  m_connection,     // hInstance
+                                  NULL);                // no extra parameters
+
+   if (!m_window) {
+        // It didn't work, so try to give a useful error:
+        DWORD error = GetLastError();
+        char message[120];
+        sprintf(message, "Cannot create a window in which to draw!\n GetLastError = %d", error);
+        MessageBox(NULL, message, "Error", MB_OK);
+        exit(1);
+    }
+}
+#else
 void  TestFrameworkVkPresent::CreateMyWindow()
 {
     const xcb_setup_t *setup;
@@ -655,12 +779,15 @@
 
     xcb_map_window(m_connection, m_window);
 }
+#endif
 
 void TestFrameworkVkPresent::TearDown()
 {
     vkDestroySwapChainWSI(m_swap_chain);
+#ifndef _WIN32
     xcb_destroy_window(m_connection, m_window);
     xcb_disconnect(m_connection);
+#endif
 }
 
 void VkTestFramework::Finish()
diff --git a/tests/vktestframework.h b/tests/vktestframework.h
index 6e15f79..906877c 100644
--- a/tests/vktestframework.h
+++ b/tests/vktestframework.h
@@ -39,6 +39,11 @@
 #include <fstream>
 #include <list>
 
+#ifdef _WIN32
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+#endif
+
 #if defined(NDEBUG) && defined(__GNUC__)
 #define U_ASSERT_ONLY __attribute__((unused))
 #else
@@ -79,6 +84,7 @@
     ~VkTestFramework();
 
     static void InitArgs(int *argc, char *argv[]);
+    static void InitWindow();
     static void Finish();
 
     void WritePPM( const char *basename, VkImageObj *image );