xgl:  Add framebuffer-no-attachment support

Add default values if no attachments are present, correctly handle
override values when attachments are present.  Bug# 13212, header
revision #36.
diff --git a/demos/cube.c b/demos/cube.c
index b02e443..4ae8c01 100644
--- a/demos/cube.c
+++ b/demos/cube.c
@@ -299,6 +299,9 @@
          .pColorAttachments = (XGL_COLOR_ATTACHMENT_BIND_INFO*) &color_attachment,
          .pDepthStencilAttachment = (XGL_DEPTH_STENCIL_BIND_INFO*) &depth_stencil,
          .sampleCount = 1,
+         .width  = demo->width,
+         .height = demo->height,
+         .layers = 1,
     };
     XGL_RENDER_PASS_CREATE_INFO rp_info;
 
diff --git a/demos/tri.c b/demos/tri.c
index 19a591b..bb5814f 100644
--- a/demos/tri.c
+++ b/demos/tri.c
@@ -121,6 +121,9 @@
          .pColorAttachments = (XGL_COLOR_ATTACHMENT_BIND_INFO*) &color_attachment,
          .pDepthStencilAttachment = (XGL_DEPTH_STENCIL_BIND_INFO*) &depth_stencil,
          .sampleCount = 1,
+         .width  = demo->width,
+         .height = demo->height,
+         .layers = 1,
     };
     XGL_RENDER_PASS_CREATE_INFO rp_info;
 
diff --git a/icd/intel/cmd_pipeline.c b/icd/intel/cmd_pipeline.c
index 5b69174..23fcae9 100644
--- a/icd/intel/cmd_pipeline.c
+++ b/icd/intel/cmd_pipeline.c
@@ -535,6 +535,11 @@
           0x7ff << GEN6_CLIP_DW3_MAX_POINT_WIDTH__SHIFT |
           (viewport->viewport_count - 1);
 
+    /* TODO: framebuffer requests layer_count > 1 */
+    if (cmd->bind.render_pass->fb->layer_count == 1) {
+        dw3 |= GEN6_CLIP_DW3_RTAINDEX_FORCED_ZERO;
+    }
+
     cmd_batch_pointer(cmd, cmd_len, &dw);
     dw[0] = dw0;
     dw[1] = dw1;
diff --git a/icd/intel/fb.c b/icd/intel/fb.c
index 6ccc3ee..2b4925b 100644
--- a/icd/intel/fb.c
+++ b/icd/intel/fb.c
@@ -47,7 +47,9 @@
     if (!fb)
         return XGL_ERROR_OUT_OF_MEMORY;
 
-    XGL_UINT width = 0, height = 0;
+    XGL_UINT width  = info->width;
+    XGL_UINT height = info->height;
+    XGL_UINT layers = info->layers;
     XGL_UINT i;
 
     for (i = 0; i < info->colorAttachmentCount; i++) {
@@ -55,38 +57,55 @@
         const struct intel_rt_view *rt = intel_rt_view(att->view);
         const struct intel_layout *layout = &rt->img->layout;
 
-        if (i == 0) {
+        if (width > layout->width0)
             width = layout->width0;
+        if (height > layout->height0)
             height = layout->height0;
-        } else {
-            if (width > layout->width0)
-                width = layout->width0;
-            if (height > layout->height0)
-                height = layout->height0;
-        }
+        if (layers > rt->array_size)
+            layers = rt->array_size;
 
+        if (rt->img->samples != info->sampleCount) {
+            intel_fb_destroy(fb);
+            return XGL_ERROR_INVALID_VALUE;
+        }
         fb->rt[i] = rt;
     }
+
     fb->rt_count = info->colorAttachmentCount;
 
     if (info->pDepthStencilAttachment) {
         const struct intel_layout *layout;
 
         fb->ds = intel_ds_view(info->pDepthStencilAttachment->view);
+
         layout = &fb->ds->img->layout;
 
         if (width > layout->width0)
             width = layout->width0;
         if (height > layout->height0)
             height = layout->height0;
+        if (layers > fb->ds->array_size)
+            layers = fb->ds->array_size;
+
+        if (fb->ds->img->samples != info->sampleCount) {
+            intel_fb_destroy(fb);
+            return XGL_ERROR_INVALID_VALUE;
+        }
+
     } else {
         fb->ds = NULL;
     }
 
+    /* Behavior is undefined if width,height are larger
+       than an attachment in some direction, but Intel hardware
+       cannot handle this case */
+    fb->width        = width;
+    fb->height       = height;
+    fb->layer_count  = layers;
+    /* This information must match pipeline state */
     fb->sample_count = info->sampleCount;
-    fb->width = width;
-    fb->height = height;
-    fb->obj.destroy = fb_destroy;
+
+    fb->obj.destroy  = fb_destroy;
 
     *fb_ret = fb;
 
diff --git a/icd/intel/fb.h b/icd/intel/fb.h
index 81a1a33..68ad027 100644
--- a/icd/intel/fb.h
+++ b/icd/intel/fb.h
@@ -33,7 +33,9 @@
     const struct intel_ds_view *ds;
 
     XGL_UINT sample_count;
-    XGL_UINT width, height;
+    XGL_UINT width;
+    XGL_UINT height;
+    XGL_UINT layer_count;
 };
 
 struct intel_render_pass {
diff --git a/icd/intel/view.c b/icd/intel/view.c
index 5f0deea..6991450 100644
--- a/icd/intel/view.c
+++ b/icd/intel/view.c
@@ -1249,6 +1249,8 @@
 
     view->img = img;
 
+    view->array_size = info->arraySize;
+
     if (intel_gpu_gen(dev->gpu) >= INTEL_GEN(7)) {
         surface_state_tex_gen7(dev->gpu, img,
                 img_type_to_view_type(img->type),
@@ -1298,6 +1300,8 @@
 
     view->img = img;
 
+    view->array_size = info->arraySize;
+
     ds_view_init(view, dev->gpu, img, img->layout.format, info->mipLevel,
             info->baseArraySlice, info->arraySize);
 
diff --git a/icd/intel/view.h b/icd/intel/view.h
index 8956123..e36cb43 100644
--- a/icd/intel/view.h
+++ b/icd/intel/view.h
@@ -71,6 +71,8 @@
 
     struct intel_img *img;
 
+    XGL_UINT array_size;
+
     /* SURFACE_STATE */
     uint32_t cmd[8];
     XGL_UINT cmd_len;
@@ -81,6 +83,8 @@
 
     struct intel_img *img;
 
+    XGL_UINT array_size;
+
     /*
      * 3DSTATE_DEPTH_BUFFER
      * 3DSTATE_STENCIL_BUFFER
diff --git a/include/xgl.h b/include/xgl.h
index 9520190..0dd4c5e 100644
--- a/include/xgl.h
+++ b/include/xgl.h
@@ -2212,7 +2212,9 @@
     XGL_COLOR_ATTACHMENT_BIND_INFO*         pColorAttachments;
     XGL_DEPTH_STENCIL_BIND_INFO*            pDepthStencilAttachment;
     XGL_UINT                                sampleCount;
-
+    XGL_UINT                                width;
+    XGL_UINT                                height;
+    XGL_UINT                                layers;
 } XGL_FRAMEBUFFER_CREATE_INFO;
 
 typedef struct _XGL_DRAW_INDIRECT_CMD
diff --git a/tests/xglrenderframework.cpp b/tests/xglrenderframework.cpp
index 68f7baa..3c452c5 100644
--- a/tests/xglrenderframework.cpp
+++ b/tests/xglrenderframework.cpp
@@ -171,6 +171,9 @@
          .pColorAttachments = m_colorBindings,
          .pDepthStencilAttachment = dsBinding,
          .sampleCount = 1,
+         .width = (XGL_UINT)m_width,
+         .height = (XGL_UINT)m_height,
+         .layers = 1,
     };
     XGL_RENDER_PASS_CREATE_INFO rp_info;
     memset(&rp_info, 0 , sizeof(rp_info));