xgl: Proposal to remove XGL_FRAMEBUFFER

bug # 13323
alpha header: r29635

Don't actually remove XGL_FRAMEBUFFER but do change how
RenderPass and Framebuffer are connected. Some comments
from the bug:

- Created a new structure XGL_RENDER_PASS_BEGIN that contains
both the XGL_RENDER_PASS and XGL_FRAMEBUFFER.

- XGL_CMD_BUFFER_GRAPHICS_BEGIN_INFO and xglCmdBeginRenderPass
both use XGL_RENDER_PASS_BEGIN to ensure they stay consistent.

- Renamed the member in XGL_CMD_BUFFER_GRAPHICS_BEGIN_INFO to
renderPassContinue with a comment to clarify that this is
only needed when a render pass is split across two command buffer.

The last has the biggest impact on this patch. The tests now
directly call CmdBeginRenderPass and CmdEndRenderPass in the
command buffer rather than set the BEGIN_INFO to a render pass and
have the driver implicitly do BeginRenderPass and EndRenderPass.
It would probably still work, but didn't seem to match the intent
with this change in the header file.
diff --git a/demos/cube.c b/demos/cube.c
index 6f2d24c..426b712 100644
--- a/demos/cube.c
+++ b/demos/cube.c
@@ -207,6 +207,7 @@
     uint32_t graphics_queue_node_index;
     XGL_PHYSICAL_GPU_QUEUE_PROPERTIES *queue_props;
 
+    XGL_FRAMEBUFFER framebuffer;
     int width, height;
     XGL_FORMAT format;
 
@@ -280,13 +281,9 @@
     };
     const float clear_depth = 1.0f;
     XGL_IMAGE_SUBRESOURCE_RANGE clear_range;
-    XGL_CMD_BUFFER_GRAPHICS_BEGIN_INFO graphics_cmd_buf_info = {
-        .sType = XGL_STRUCTURE_TYPE_CMD_BUFFER_GRAPHICS_BEGIN_INFO,
-        .pNext = NULL,
-    };
     XGL_CMD_BUFFER_BEGIN_INFO cmd_buf_info = {
         .sType = XGL_STRUCTURE_TYPE_CMD_BUFFER_BEGIN_INFO,
-        .pNext = &graphics_cmd_buf_info,
+        .pNext = NULL,
         .flags = XGL_CMD_BUFFER_OPTIMIZE_GPU_SMALL_BATCH_BIT |
             XGL_CMD_BUFFER_OPTIMIZE_ONE_TIME_SUBMIT_BIT,
     };
@@ -305,22 +302,29 @@
          .layers = 1,
     };
     XGL_RENDER_PASS_CREATE_INFO rp_info;
+    XGL_RENDER_PASS_BEGIN rp_begin;
 
     memset(&rp_info, 0 , sizeof(rp_info));
-    err = xglCreateFramebuffer(demo->device, &fb_info, &(rp_info.framebuffer));
+    err = xglCreateFramebuffer(demo->device, &fb_info, &rp_begin.framebuffer);
     assert(!err);
     rp_info.sType = XGL_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
     rp_info.renderArea.extent.width = demo->width;
     rp_info.renderArea.extent.height = demo->height;
-    rp_info.colorAttachmentCount = 1;
-    rp_info.pColorLoadClearValues = &clear_color;
+    rp_info.colorAttachmentCount = fb_info.colorAttachmentCount;
+    rp_info.pColorFormats = &demo->format;
+    rp_info.pColorLayouts = &color_attachment.layout;
     rp_info.pColorLoadOps = &load_op;
     rp_info.pColorStoreOps = &store_op;
+    rp_info.pColorLoadClearValues = &clear_color;
+    rp_info.depthStencilFormat = XGL_FMT_D16_UNORM;
+    rp_info.depthStencilLayout = depth_stencil.layout;
     rp_info.depthLoadOp = XGL_ATTACHMENT_LOAD_OP_DONT_CARE;
+    rp_info.depthLoadClearValue = clear_depth;
     rp_info.depthStoreOp = XGL_ATTACHMENT_STORE_OP_DONT_CARE;
     rp_info.stencilLoadOp = XGL_ATTACHMENT_LOAD_OP_DONT_CARE;
+    rp_info.stencilLoadClearValue = 0;
     rp_info.stencilStoreOp = XGL_ATTACHMENT_STORE_OP_DONT_CARE;
-    err = xglCreateRenderPass(demo->device, &rp_info, &(graphics_cmd_buf_info.renderPass));
+    err = xglCreateRenderPass(demo->device, &rp_info, &rp_begin.renderPass);
     assert(!err);
 
     err = xglBeginCommandBuffer(cmd_buf, &cmd_buf_info);
@@ -338,7 +342,7 @@
     xglCmdBindDynamicStateObject(cmd_buf, XGL_STATE_BIND_DEPTH_STENCIL,
                                      demo->depth_stencil);
 
-    xglCmdBeginRenderPass(cmd_buf, graphics_cmd_buf_info.renderPass);
+    xglCmdBeginRenderPass(cmd_buf, &rp_begin);
     clear_range.aspect = XGL_IMAGE_ASPECT_COLOR;
     clear_range.baseMipLevel = 0;
     clear_range.mipLevels = 1;
@@ -353,13 +357,13 @@
             clear_depth, 0, 1, &clear_range);
 
     xglCmdDraw(cmd_buf, 0, 12 * 3, 0, 1);
-    xglCmdEndRenderPass(cmd_buf, graphics_cmd_buf_info.renderPass);
+    xglCmdEndRenderPass(cmd_buf, rp_begin.renderPass);
 
     err = xglEndCommandBuffer(cmd_buf);
     assert(!err);
 
-    xglDestroyObject(graphics_cmd_buf_info.renderPass);
-    xglDestroyObject(rp_info.framebuffer);
+    xglDestroyObject(rp_begin.renderPass);
+    xglDestroyObject(rp_begin.framebuffer);
 }
 
 
diff --git a/demos/tri.c b/demos/tri.c
index d3a0377..43824b6 100644
--- a/demos/tri.c
+++ b/demos/tri.c
@@ -110,13 +110,9 @@
     };
     const float clear_depth = 0.9f;
     XGL_IMAGE_SUBRESOURCE_RANGE clear_range;
-    XGL_CMD_BUFFER_GRAPHICS_BEGIN_INFO graphics_cmd_buf_info = {
-        .sType = XGL_STRUCTURE_TYPE_CMD_BUFFER_GRAPHICS_BEGIN_INFO,
-        .pNext = NULL,
-    };
     XGL_CMD_BUFFER_BEGIN_INFO cmd_buf_info = {
         .sType = XGL_STRUCTURE_TYPE_CMD_BUFFER_BEGIN_INFO,
-        .pNext = &graphics_cmd_buf_info,
+        .pNext = NULL,
         .flags = XGL_CMD_BUFFER_OPTIMIZE_GPU_SMALL_BATCH_BIT |
             XGL_CMD_BUFFER_OPTIMIZE_ONE_TIME_SUBMIT_BIT,
     };
@@ -135,21 +131,29 @@
          .layers = 1,
     };
     XGL_RENDER_PASS_CREATE_INFO rp_info;
+    XGL_RENDER_PASS_BEGIN rp_begin;
 
     memset(&rp_info, 0 , sizeof(rp_info));
-    err = xglCreateFramebuffer(demo->device, &fb_info, &(rp_info.framebuffer));
+    err = xglCreateFramebuffer(demo->device, &fb_info, &rp_begin.framebuffer);
     assert(!err);
     rp_info.sType = XGL_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
     rp_info.renderArea.extent.width = demo->width;
     rp_info.renderArea.extent.height = demo->height;
     rp_info.colorAttachmentCount = fb_info.colorAttachmentCount;
+    rp_info.pColorFormats = &demo->format;
+    rp_info.pColorLayouts = &color_attachment.layout;
     rp_info.pColorLoadOps = &load_op;
     rp_info.pColorStoreOps = &store_op;
+    rp_info.pColorLoadClearValues = &clear_color;
+    rp_info.depthStencilFormat = XGL_FMT_D16_UNORM;
+    rp_info.depthStencilLayout = depth_stencil.layout;
     rp_info.depthLoadOp = XGL_ATTACHMENT_LOAD_OP_DONT_CARE;
+    rp_info.depthLoadClearValue = clear_depth;
     rp_info.depthStoreOp = XGL_ATTACHMENT_STORE_OP_DONT_CARE;
     rp_info.stencilLoadOp = XGL_ATTACHMENT_LOAD_OP_DONT_CARE;
+    rp_info.stencilLoadClearValue = 0;
     rp_info.stencilStoreOp = XGL_ATTACHMENT_STORE_OP_DONT_CARE;
-    err = xglCreateRenderPass(demo->device, &rp_info, &(graphics_cmd_buf_info.renderPass));
+    err = xglCreateRenderPass(demo->device, &rp_info, &(rp_begin.renderPass));
     assert(!err);
 
     err = xglBeginCommandBuffer(demo->cmd, &cmd_buf_info);
@@ -170,7 +174,7 @@
 
     xglCmdBindVertexBuffer(demo->cmd, demo->vertices.buf, 0, 0);
 
-    xglCmdBeginRenderPass(demo->cmd, graphics_cmd_buf_info.renderPass);
+    xglCmdBeginRenderPass(demo->cmd, &rp_begin);
     clear_range.aspect = XGL_IMAGE_ASPECT_COLOR;
     clear_range.baseMipLevel = 0;
     clear_range.mipLevels = 1;
@@ -185,13 +189,13 @@
             clear_depth, 0, 1, &clear_range);
 
     xglCmdDraw(demo->cmd, 0, 3, 0, 1);
-    xglCmdEndRenderPass(demo->cmd, graphics_cmd_buf_info.renderPass);
+    xglCmdEndRenderPass(demo->cmd, rp_begin.renderPass);
 
     err = xglEndCommandBuffer(demo->cmd);
     assert(!err);
 
-    xglDestroyObject(graphics_cmd_buf_info.renderPass);
-    xglDestroyObject(rp_info.framebuffer);
+    xglDestroyObject(rp_begin.renderPass);
+    xglDestroyObject(rp_begin.framebuffer);
 }
 
 static void demo_draw(struct demo *demo)
diff --git a/icd/intel/cmd.c b/icd/intel/cmd.c
index a5d7b7a..d4f6a7a 100644
--- a/icd/intel/cmd.c
+++ b/icd/intel/cmd.c
@@ -321,7 +321,8 @@
             break;
         case XGL_STRUCTURE_TYPE_CMD_BUFFER_GRAPHICS_BEGIN_INFO:
             ginfo = (const XGL_CMD_BUFFER_GRAPHICS_BEGIN_INFO *) info;
-            cmd_begin_render_pass(cmd, intel_render_pass(ginfo->renderPass));
+            cmd_begin_render_pass(cmd, intel_render_pass(ginfo->renderPassContinue.renderPass),
+                                  intel_fb(ginfo->renderPassContinue.framebuffer));
             break;
         default:
             return XGL_ERROR_INVALID_VALUE;
diff --git a/icd/intel/cmd.h b/icd/intel/cmd.h
index 263fea6..209e7f8 100644
--- a/icd/intel/cmd.h
+++ b/icd/intel/cmd.h
@@ -185,8 +185,9 @@
     } index;
 
 
-    const struct intel_render_pass *render_pass;
     bool render_pass_changed;
+    const struct intel_render_pass *render_pass;
+    const struct intel_fb *fb;
 
     uint32_t draw_count;
     uint32_t wa_flags;
diff --git a/icd/intel/cmd_pipeline.c b/icd/intel/cmd_pipeline.c
index de2adfd..00851e5 100644
--- a/icd/intel/cmd_pipeline.c
+++ b/icd/intel/cmd_pipeline.c
@@ -399,7 +399,7 @@
             format = GEN6_ZFORMAT_D32_FLOAT;
             break;
         default:
-            assert(!cmd->bind.render_pass->fb->ds); // Must have valid format if ds attached
+            assert(!cmd->bind.fb->ds); // Must have valid format if ds attached
             format = 0;
             break;
         }
@@ -526,7 +526,7 @@
           (viewport->viewport_count - 1);
 
     /* TODO: framebuffer requests layer_count > 1 */
-    if (cmd->bind.render_pass->fb->array_size == 1) {
+    if (cmd->bind.fb->array_size == 1) {
         dw3 |= GEN6_CLIP_DW3_RTAINDEX_FORCED_ZERO;
     }
 
@@ -1660,8 +1660,8 @@
         case INTEL_PIPELINE_RMAP_RT:
             {
                 const struct intel_rt_view *view =
-                    (slot->u.rt < cmd->bind.render_pass->fb->rt_count) ?
-                    cmd->bind.render_pass->fb->rt[slot->u.rt] : NULL;
+                    (slot->u.rt < cmd->bind.fb->rt_count) ?
+                    cmd->bind.fb->rt[slot->u.rt] : NULL;
 
                 if (view) {
                     offset = cmd_surface_write(cmd, INTEL_CMD_ITEM_SURFACE,
@@ -1931,7 +1931,7 @@
 
 static void emit_msaa(struct intel_cmd *cmd)
 {
-    const struct intel_fb *fb = cmd->bind.render_pass->fb;
+    const struct intel_fb *fb = cmd->bind.fb;
 
     if (!cmd->bind.render_pass_changed)
         return;
@@ -1945,18 +1945,19 @@
 
 static void emit_rt(struct intel_cmd *cmd)
 {
-    const struct intel_fb *fb = cmd->bind.render_pass->fb;
+    const struct intel_fb *fb = cmd->bind.fb;
 
     if (!cmd->bind.render_pass_changed)
         return;
 
     cmd_wa_gen6_pre_depth_stall_write(cmd);
-    gen6_3DSTATE_DRAWING_RECTANGLE(cmd, fb->width, fb->height);
+    gen6_3DSTATE_DRAWING_RECTANGLE(cmd, fb->width,
+            fb->height);
 }
 
 static void emit_ds(struct intel_cmd *cmd)
 {
-    const struct intel_fb *fb = cmd->bind.render_pass->fb;
+    const struct intel_fb *fb = cmd->bind.fb;
     const struct intel_ds_view *ds = fb->ds;
 
     if (!cmd->bind.render_pass_changed)
@@ -3502,11 +3503,11 @@
 
 ICD_EXPORT void XGLAPI xglCmdBeginRenderPass(
     XGL_CMD_BUFFER                              cmdBuffer,
-    XGL_RENDER_PASS                             renderPass)
+    const XGL_RENDER_PASS_BEGIN*                pRenderPassBegin)
 {
    struct intel_cmd *cmd = intel_cmd(cmdBuffer);
 
-   cmd_begin_render_pass(cmd, (struct intel_render_pass *) renderPass);
+   cmd_begin_render_pass(cmd, (struct intel_render_pass *) pRenderPassBegin->renderPass, pRenderPassBegin->framebuffer);
 }
 
 ICD_EXPORT void XGLAPI xglCmdEndRenderPass(
diff --git a/icd/intel/cmd_priv.h b/icd/intel/cmd_priv.h
index e396d12..ff930a9 100644
--- a/icd/intel/cmd_priv.h
+++ b/icd/intel/cmd_priv.h
@@ -485,10 +485,12 @@
 }
 
 static inline void cmd_begin_render_pass(struct intel_cmd *cmd,
-                                         const struct intel_render_pass *rp)
+                                         const struct intel_render_pass *rp,
+                                         const struct intel_fb *fb)
 {
     cmd->bind.render_pass = rp;
     cmd->bind.render_pass_changed = true;
+    cmd->bind.fb = fb;
 }
 
 static inline void cmd_end_render_pass(struct intel_cmd *cmd,
@@ -496,6 +498,7 @@
 {
     //note what to do if rp != bound rp
     cmd->bind.render_pass = 0;
+    cmd->bind.fb = 0;
 }
 
 void cmd_batch_flush(struct intel_cmd *cmd, uint32_t pipe_control_dw0);
diff --git a/icd/intel/fb.c b/icd/intel/fb.c
index 845ecae..56d2dde 100644
--- a/icd/intel/fb.c
+++ b/icd/intel/fb.c
@@ -152,8 +152,6 @@
 
     rp->obj.destroy = render_pass_destroy;
 
-    rp->fb = intel_fb(info->framebuffer);
-
     /* TODO add any clear color ops */
     for (i = 0; i < info->colorAttachmentCount; i++)
         assert(info->pColorLoadOps[i] != XGL_ATTACHMENT_LOAD_OP_CLEAR);
@@ -167,8 +165,6 @@
 
 void intel_render_pass_destroy(struct intel_render_pass *rp)
 {
-    rp->fb = NULL;
-
     intel_base_destroy(&rp->obj.base);
 }
 
diff --git a/icd/intel/fb.h b/icd/intel/fb.h
index f7c6b1f..873f49d 100644
--- a/icd/intel/fb.h
+++ b/icd/intel/fb.h
@@ -46,8 +46,6 @@
 
 struct intel_render_pass {
     struct intel_obj obj;
-
-    struct intel_fb *fb;
 };
 
 static inline struct intel_fb *intel_fb(XGL_FRAMEBUFFER fb)
diff --git a/icd/nulldrv/nulldrv.c b/icd/nulldrv/nulldrv.c
index f6fa9e0..2db8f64 100644
--- a/icd/nulldrv/nulldrv.c
+++ b/icd/nulldrv/nulldrv.c
@@ -1995,7 +1995,7 @@
 
 ICD_EXPORT void XGLAPI xglCmdBeginRenderPass(
     XGL_CMD_BUFFER                              cmdBuffer,
-    XGL_RENDER_PASS                             renderPass)
+    const XGL_RENDER_PASS_BEGIN*                pRenderPassBegin)
 {
     NULLDRV_LOG_FUNC;
 }
diff --git a/include/xgl.h b/include/xgl.h
index bffc7df..1955f8a 100644
--- a/include/xgl.h
+++ b/include/xgl.h
@@ -33,7 +33,7 @@
 #include "xglPlatform.h"
 
 // XGL API version supported by this file
-#define XGL_API_VERSION XGL_MAKE_VERSION(0, 56, 1)
+#define XGL_API_VERSION XGL_MAKE_VERSION(0, 57, 1)
 
 #ifdef __cplusplus
 extern "C"
@@ -1698,7 +1698,6 @@
 {
     XGL_IMAGE                               originalImage;
 } XGL_PEER_IMAGE_OPEN_INFO;
-
 typedef struct _XGL_SUBRESOURCE_LAYOUT
 {
     XGL_GPU_SIZE                            offset;                 // Specified in bytes
@@ -2087,12 +2086,18 @@
     XGL_FLAGS                               flags;      // XGL_CMD_BUFFER_BUILD_FLAGS
 } XGL_CMD_BUFFER_BEGIN_INFO;
 
+typedef struct _XGL_RENDER_PASS_BEGIN
+{
+    XGL_RENDER_PASS                         renderPass;
+    XGL_FRAMEBUFFER                         framebuffer;
+} XGL_RENDER_PASS_BEGIN;
+
 typedef struct _XGL_CMD_BUFFER_GRAPHICS_BEGIN_INFO
 {
     XGL_STRUCTURE_TYPE                      sType;      // Must be XGL_STRUCTURE_TYPE_CMD_BUFFER_GRAPHICS_BEGIN_INFO
     const void*                             pNext;      // Pointer to next structure
 
-    XGL_RENDER_PASS                         renderPass;
+    XGL_RENDER_PASS_BEGIN                   renderPassContinue;  // Only needed when a render pass is split across two command buffers
 } XGL_CMD_BUFFER_GRAPHICS_BEGIN_INFO;
 
 // Union allowing specification of floating point or raw color data. Actual value selected is based on image being cleared.
@@ -2114,11 +2119,17 @@
     const void*                             pNext;      // Pointer to next structure
 
     XGL_RECT                                renderArea;
-    XGL_FRAMEBUFFER                         framebuffer;
     uint32_t                                colorAttachmentCount;
-    const XGL_ATTACHMENT_LOAD_OP*           pColorLoadOps;               // Array of size equivalent to the number of attachments in the framebuffer
-    const XGL_ATTACHMENT_STORE_OP*          pColorStoreOps;              // Array of size equivalent to the number of attachments in the framebuffer
-    const XGL_CLEAR_COLOR*                  pColorLoadClearValues;       // Array of size equivalent to the number of attachments in the framebuffer
+    XGL_EXTENT2D                            extent;
+    uint32_t                                sampleCount;
+    uint32_t                                layers;
+    const XGL_FORMAT*                       pColorFormats;
+    const XGL_IMAGE_LAYOUT*                 pColorLayouts;
+    const XGL_ATTACHMENT_LOAD_OP*           pColorLoadOps;
+    const XGL_ATTACHMENT_STORE_OP*          pColorStoreOps;
+    const XGL_CLEAR_COLOR*                  pColorLoadClearValues;
+    XGL_FORMAT                              depthStencilFormat;
+    XGL_IMAGE_LAYOUT                        depthStencilLayout;
     XGL_ATTACHMENT_LOAD_OP                  depthLoadOp;
     float                                   depthLoadClearValue;
     XGL_ATTACHMENT_STORE_OP                 depthStoreOp;
@@ -2336,7 +2347,7 @@
 typedef void       (XGLAPI *xglCmdSaveAtomicCountersType)(XGL_CMD_BUFFER cmdBuffer, XGL_PIPELINE_BIND_POINT pipelineBindPoint, uint32_t startCounter, uint32_t counterCount, XGL_BUFFER destBuffer, XGL_GPU_SIZE destOffset);
 typedef XGL_RESULT (XGLAPI *xglCreateFramebufferType)(XGL_DEVICE device, const XGL_FRAMEBUFFER_CREATE_INFO* pCreateInfo, XGL_FRAMEBUFFER* pFramebuffer);
 typedef XGL_RESULT (XGLAPI *xglCreateRenderPassType)(XGL_DEVICE device, const XGL_RENDER_PASS_CREATE_INFO* pCreateInfo, XGL_RENDER_PASS* pRenderPass);
-typedef void       (XGLAPI *xglCmdBeginRenderPassType)(XGL_CMD_BUFFER cmdBuffer, XGL_RENDER_PASS renderPass);
+typedef void       (XGLAPI *xglCmdBeginRenderPassType)(XGL_CMD_BUFFER cmdBuffer, const XGL_RENDER_PASS_BEGIN* pRenderPassBegin);
 typedef void       (XGLAPI *xglCmdEndRenderPassType)(XGL_CMD_BUFFER cmdBuffer, XGL_RENDER_PASS renderPass);
 
 #ifdef XGL_PROTOTYPES
@@ -2980,7 +2991,7 @@
 
 void XGLAPI xglCmdBeginRenderPass(
     XGL_CMD_BUFFER                              cmdBuffer,
-    XGL_RENDER_PASS                             renderPass);
+    const XGL_RENDER_PASS_BEGIN*                pRenderPassBegin);
 
 void XGLAPI xglCmdEndRenderPass(
     XGL_CMD_BUFFER                              cmdBuffer,
diff --git a/layers/draw_state.c b/layers/draw_state.c
index 979b136..9fa0cc2 100644
--- a/layers/draw_state.c
+++ b/layers/draw_state.c
@@ -2625,7 +2625,7 @@
     nextTable.CmdSaveAtomicCounters(cmdBuffer, pipelineBindPoint, startCounter, counterCount, destBuffer, destOffset);
 }
 
-XGL_LAYER_EXPORT void XGLAPI xglCmdBeginRenderPass(XGL_CMD_BUFFER cmdBuffer, XGL_RENDER_PASS renderPass)
+XGL_LAYER_EXPORT void XGLAPI xglCmdBeginRenderPass(XGL_CMD_BUFFER cmdBuffer, const XGL_RENDER_PASS_BEGIN *pRenderPassBegin)
 {
     GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
     if (pCB) {
@@ -2637,7 +2637,7 @@
         sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
         layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
     }
-    nextTable.CmdBeginRenderPass(cmdBuffer, renderPass);
+    nextTable.CmdBeginRenderPass(cmdBuffer, pRenderPassBegin);
 }
 
 XGL_LAYER_EXPORT void XGLAPI xglCmdEndRenderPass(XGL_CMD_BUFFER cmdBuffer, XGL_RENDER_PASS renderPass)
diff --git a/layers/draw_state.cpp b/layers/draw_state.cpp
index 3687c06..c37930c 100644
--- a/layers/draw_state.cpp
+++ b/layers/draw_state.cpp
@@ -509,10 +509,10 @@
         uint32_t psoNumSamples = getNumSamples(pipeline);
         if (pCB->activeRenderPass) {
             XGL_RENDER_PASS_CREATE_INFO* pRPCI = renderPassMap[pCB->activeRenderPass];
-            XGL_FRAMEBUFFER_CREATE_INFO* pFBCI = frameBufferMap[pRPCI->framebuffer];
+            XGL_FRAMEBUFFER_CREATE_INFO* pFBCI = frameBufferMap[pCB->framebuffer];
             if (psoNumSamples != pFBCI->sampleCount) {
                 char str[1024];
-                sprintf(str, "Num samples mismatche! Binding PSO (%p) with %u samples while current RenderPass (%p) uses FB (%p) with %u samples!", (void*)pipeline, psoNumSamples, (void*)pCB->activeRenderPass, (void*)pRPCI->framebuffer, pFBCI->sampleCount);
+                sprintf(str, "Num samples mismatche! Binding PSO (%p) with %u samples while current RenderPass (%p) uses FB (%p) with %u samples!", (void*)pipeline, psoNumSamples, (void*)pCB->activeRenderPass, (void*)pCB->framebuffer, pFBCI->sampleCount);
                 layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, pipeline, 0, DRAWSTATE_NUM_SAMPLES_MISMATCH, "DS", str);
             }
         } else {
@@ -1894,7 +1894,7 @@
             if (pBeginInfo->pNext) {
                 XGL_CMD_BUFFER_GRAPHICS_BEGIN_INFO* pCbGfxBI = (XGL_CMD_BUFFER_GRAPHICS_BEGIN_INFO*)pBeginInfo->pNext;
                 if (XGL_STRUCTURE_TYPE_CMD_BUFFER_GRAPHICS_BEGIN_INFO == pCbGfxBI->sType) {
-                    pCB->activeRenderPass = pCbGfxBI->renderPass;
+                    pCB->activeRenderPass = pCbGfxBI->renderPassContinue.renderPass;
                 }
             }
         }
@@ -2526,21 +2526,21 @@
     return result;
 }
 
-XGL_LAYER_EXPORT void XGLAPI xglCmdBeginRenderPass(XGL_CMD_BUFFER cmdBuffer, XGL_RENDER_PASS renderPass)
+XGL_LAYER_EXPORT void XGLAPI xglCmdBeginRenderPass(XGL_CMD_BUFFER cmdBuffer, const XGL_RENDER_PASS_BEGIN *pRenderPassBegin)
 {
     GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
     if (pCB) {
         updateCBTracking(cmdBuffer);
         addCmd(pCB, CMD_BEGINRENDERPASS);
-        pCB->activeRenderPass = renderPass;
+        pCB->activeRenderPass = pRenderPassBegin->renderPass;
+        pCB->framebuffer = pRenderPassBegin->framebuffer;
         validatePipelineState(pCB, XGL_PIPELINE_BIND_POINT_GRAPHICS, pCB->lastBoundPipeline);
-    }
-    else {
+    } else {
         char str[1024];
         sprintf(str, "Attempt to use CmdBuffer %p that doesn't exist!", (void*)cmdBuffer);
         layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, cmdBuffer, 0, DRAWSTATE_INVALID_CMD_BUFFER, "DS", str);
     }
-    nextTable.CmdBeginRenderPass(cmdBuffer, renderPass);
+    nextTable.CmdBeginRenderPass(cmdBuffer, pRenderPassBegin);
 }
 
 XGL_LAYER_EXPORT void XGLAPI xglCmdEndRenderPass(XGL_CMD_BUFFER cmdBuffer, XGL_RENDER_PASS renderPass)
diff --git a/layers/draw_state.h b/layers/draw_state.h
index cb71b34..0fb771e 100644
--- a/layers/draw_state.h
+++ b/layers/draw_state.h
@@ -237,6 +237,7 @@
     DYNAMIC_STATE_NODE*             lastBoundDynamicState[XGL_NUM_STATE_BIND_POINT];
     XGL_DESCRIPTOR_SET              lastBoundDescriptorSet;
     XGL_RENDER_PASS                 activeRenderPass;
+    XGL_FRAMEBUFFER                 framebuffer;
 } GLOBAL_CB_NODE;
 
 //prototypes for extension functions
diff --git a/layers/glave_snapshot.c b/layers/glave_snapshot.c
index 8cf0621..e4a3b7e 100644
--- a/layers/glave_snapshot.c
+++ b/layers/glave_snapshot.c
@@ -1642,12 +1642,12 @@
     return result;
 }
 
-XGL_LAYER_EXPORT void XGLAPI xglCmdBeginRenderPass(XGL_CMD_BUFFER cmdBuffer, XGL_RENDER_PASS renderPass)
+XGL_LAYER_EXPORT void XGLAPI xglCmdBeginRenderPass(XGL_CMD_BUFFER cmdBuffer, const XGL_RENDER_PASS_BEGIN *pRenderPassBegin)
 {
     loader_platform_thread_lock_mutex(&objLock);
     ll_increment_use_count((void*)cmdBuffer, XGL_OBJECT_TYPE_CMD_BUFFER);
     loader_platform_thread_unlock_mutex(&objLock);
-    nextTable.CmdBeginRenderPass(cmdBuffer, renderPass);
+    nextTable.CmdBeginRenderPass(cmdBuffer, pRenderPassBegin);
 }
 
 XGL_LAYER_EXPORT void XGLAPI xglCmdEndRenderPass(XGL_CMD_BUFFER cmdBuffer, XGL_RENDER_PASS renderPass)
diff --git a/tests/render_tests.cpp b/tests/render_tests.cpp
index d6c940f..5683ea2 100644
--- a/tests/render_tests.cpp
+++ b/tests/render_tests.cpp
@@ -219,6 +219,8 @@
     void InitDepthStencil();
     void XGLTriangleTest(const char *vertShaderText, const char *fragShaderText, const bool rotate);
 
+    XGL_RESULT BeginCommandBuffer(XglCommandBufferObj &cmdBuffer);
+    XGL_RESULT EndCommandBuffer(XglCommandBufferObj &cmdBuffer);
 
 protected:
     XGL_IMAGE m_texture;
@@ -258,6 +260,35 @@
     }
 };
 
+XGL_RESULT XglRenderTest::BeginCommandBuffer(XglCommandBufferObj &cmdBuffer)
+{
+    XGL_RESULT result;
+
+    result = cmdBuffer.BeginCommandBuffer();
+
+    /*
+     * For render test all drawing happens in a single render pass
+     * on a single command buffer.
+     */
+    if (XGL_SUCCESS == result) {
+        cmdBuffer.BeginRenderPass(renderPass(), framebuffer());
+    }
+
+    return result;
+}
+
+XGL_RESULT XglRenderTest::EndCommandBuffer(XglCommandBufferObj &cmdBuffer)
+{
+    XGL_RESULT result;
+
+    cmdBuffer.EndRenderPass(renderPass());
+
+    result = cmdBuffer.EndCommandBuffer();
+
+    return result;
+}
+
+
 void XglRenderTest::GenericDrawPreparation(XglCommandBufferObj *cmdBuffer, XglPipelineObj *pipelineobj, XglDescriptorSetObj *descriptorSet)
 {
     cmdBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color,
@@ -497,18 +528,20 @@
     XglCommandBufferObj cmdBuffer(m_device);
     cmdBuffer.AddRenderTarget(m_renderTargets[0]);
 
-    ASSERT_XGL_SUCCESS(cmdBuffer.BeginCommandBuffer(renderPass()));
+    ASSERT_XGL_SUCCESS(BeginCommandBuffer(cmdBuffer));
 
     GenericDrawPreparation(&cmdBuffer, &pipelineobj, &descriptorSet);
 #ifdef DUMP_STATE_DOT
     DRAW_STATE_DUMP_DOT_FILE pDSDumpDot = (DRAW_STATE_DUMP_DOT_FILE)xglGetProcAddr(gpu(), (char*)"drawStateDumpDotFile");
     pDSDumpDot((char*)"triTest2.dot");
 #endif
+
     // render triangle
     cmdBuffer.Draw(0, 3, 0, 1);
 
     // finalize recording of the command buffer
-    cmdBuffer.EndCommandBuffer();
+    EndCommandBuffer(cmdBuffer);
+
     cmdBuffer.QueueCommandBuffer(m_memoryRefManager.GetMemoryRefList(), m_memoryRefManager.GetNumRefs());
 
     for (int i = 0; i < m_renderTargets.size(); i++)
@@ -796,7 +829,8 @@
     XglCommandBufferObj cmdBuffer(m_device);
     cmdBuffer.AddRenderTarget(m_renderTargets[0]);
 
-    ASSERT_XGL_SUCCESS(cmdBuffer.BeginCommandBuffer(renderPass()));
+    ASSERT_XGL_SUCCESS(BeginCommandBuffer(cmdBuffer));
+
     GenericDrawPreparation(&cmdBuffer, &pipelineobj, &descriptorSet);
 
     cmdBuffer.BindVertexBuffer(&meshBuffer, 0, 0);
@@ -805,7 +839,8 @@
     cmdBuffer.Draw(0, 6, 0, 1);
 
     // finalize recording of the command buffer
-    cmdBuffer.EndCommandBuffer();
+    EndCommandBuffer(cmdBuffer);
+
     cmdBuffer.QueueCommandBuffer(m_memoryRefManager.GetMemoryRefList(), m_memoryRefManager.GetNumRefs());
 
     for (int i = 0; i < m_renderTargets.size(); i++)
@@ -878,7 +913,7 @@
     cmdBuffer.AddRenderTarget(m_renderTargets[0]);
     cmdBuffer.AddRenderTarget(m_renderTargets[1]);
 
-    ASSERT_XGL_SUCCESS(cmdBuffer.BeginCommandBuffer(renderPass()));
+    ASSERT_XGL_SUCCESS(BeginCommandBuffer(cmdBuffer));
 
     GenericDrawPreparation(&cmdBuffer, &pipelineobj, &descriptorSet);
 
@@ -887,11 +922,12 @@
     DRAW_STATE_DUMP_DOT_FILE pDSDumpDot = (DRAW_STATE_DUMP_DOT_FILE)xglGetProcAddr(gpu(), (char*)"drawStateDumpDotFile");
     pDSDumpDot((char*)"triTest2.dot");
 #endif
+
     // render triangle
     cmdBuffer.Draw(0, 3, 0, 1);
 
     // finalize recording of the command buffer
-    cmdBuffer.EndCommandBuffer();
+    EndCommandBuffer(cmdBuffer);
     cmdBuffer.QueueCommandBuffer(m_memoryRefManager.GetMemoryRefList(), m_memoryRefManager.GetNumRefs());
 
     for (int i = 0; i < m_renderTargets.size(); i++)
@@ -986,7 +1022,7 @@
     m_memoryRefManager.AddRTMemoryRefs(m_renderTargets, m_renderTargets.size());
     XglCommandBufferObj cmdBuffer(m_device);
     cmdBuffer.AddRenderTarget(m_renderTargets[0]);
-    ASSERT_XGL_SUCCESS(cmdBuffer.BeginCommandBuffer(renderPass()));
+    ASSERT_XGL_SUCCESS(BeginCommandBuffer(cmdBuffer));
 
     GenericDrawPreparation(&cmdBuffer, &pipelineobj, &descriptorSet);
 
@@ -1002,7 +1038,7 @@
     cmdBuffer.DrawIndexed(0, 6, 0, 0, 1);
 
     // finalize recording of the command buffer
-    cmdBuffer.EndCommandBuffer();
+    EndCommandBuffer(cmdBuffer);
     cmdBuffer.QueueCommandBuffer(m_memoryRefManager.GetMemoryRefList(), m_memoryRefManager.GetNumRefs());
 
     for (int i = 0; i < m_renderTargets.size(); i++)
@@ -1084,7 +1120,7 @@
     XglCommandBufferObj cmdBuffer(m_device);
     cmdBuffer.AddRenderTarget(m_renderTargets[0]);
 
-    ASSERT_XGL_SUCCESS(cmdBuffer.BeginCommandBuffer(renderPass()));
+    ASSERT_XGL_SUCCESS(BeginCommandBuffer(cmdBuffer));
 
     GenericDrawPreparation(&cmdBuffer, &pipelineobj, &descriptorSet);
 
@@ -1093,11 +1129,12 @@
     DRAW_STATE_DUMP_DOT_FILE pDSDumpDot = (DRAW_STATE_DUMP_DOT_FILE)xglGetProcAddr(gpu(), (char*)"drawStateDumpDotFile");
     pDSDumpDot((char*)"triTest2.dot");
 #endif
+
     // render triangle
     cmdBuffer.Draw(0, 6, 0, 1);
 
     // finalize recording of the command buffer
-    cmdBuffer.EndCommandBuffer();
+    EndCommandBuffer(cmdBuffer);
     cmdBuffer.QueueCommandBuffer(m_memoryRefManager.GetMemoryRefList(), m_memoryRefManager.GetNumRefs());
 
     for (int i = 0; i < m_renderTargets.size(); i++)
@@ -1179,7 +1216,7 @@
     XglCommandBufferObj cmdBuffer(m_device);
     cmdBuffer.AddRenderTarget(m_renderTargets[0]);
 
-    ASSERT_XGL_SUCCESS(cmdBuffer.BeginCommandBuffer(renderPass()));
+    ASSERT_XGL_SUCCESS(BeginCommandBuffer(cmdBuffer));
 
     GenericDrawPreparation(&cmdBuffer, &pipelineobj, &descriptorSet);
 
@@ -1188,11 +1225,11 @@
     DRAW_STATE_DUMP_DOT_FILE pDSDumpDot = (DRAW_STATE_DUMP_DOT_FILE)xglGetProcAddr(gpu(), (char*)"drawStateDumpDotFile");
     pDSDumpDot((char*)"triTest2.dot");
 #endif
-    // render triangle
+    // render two triangles
     cmdBuffer.Draw(0, 6, 0, 1);
 
     // finalize recording of the command buffer
-    cmdBuffer.EndCommandBuffer();
+    EndCommandBuffer(cmdBuffer);
     cmdBuffer.QueueCommandBuffer(m_memoryRefManager.GetMemoryRefList(), m_memoryRefManager.GetNumRefs());
 
     for (int i = 0; i < m_renderTargets.size(); i++)
@@ -1284,7 +1321,7 @@
     XglCommandBufferObj cmdBuffer(m_device);
     cmdBuffer.AddRenderTarget(m_renderTargets[0]);
 
-    ASSERT_XGL_SUCCESS(cmdBuffer.BeginCommandBuffer(renderPass()));
+    ASSERT_XGL_SUCCESS(BeginCommandBuffer(cmdBuffer));
 
     GenericDrawPreparation(&cmdBuffer, &pipelineobj, &descriptorSet);
 
@@ -1293,11 +1330,12 @@
     DRAW_STATE_DUMP_DOT_FILE pDSDumpDot = (DRAW_STATE_DUMP_DOT_FILE)xglGetProcAddr(gpu(), (char*)"drawStateDumpDotFile");
     pDSDumpDot((char*)"triTest2.dot");
 #endif
-    // render triangle
+
+    // render two triangles
     cmdBuffer.Draw(0, 6, 0, 1);
 
     // finalize recording of the command buffer
-    cmdBuffer.EndCommandBuffer();
+    EndCommandBuffer(cmdBuffer);
     cmdBuffer.QueueCommandBuffer(m_memoryRefManager.GetMemoryRefList(), m_memoryRefManager.GetNumRefs());
 
     for (int i = 0; i < m_renderTargets.size(); i++)
@@ -1379,7 +1417,7 @@
     XglCommandBufferObj cmdBuffer(m_device);
     cmdBuffer.AddRenderTarget(m_renderTargets[0]);
 
-    ASSERT_XGL_SUCCESS(cmdBuffer.BeginCommandBuffer(renderPass()));
+    ASSERT_XGL_SUCCESS(BeginCommandBuffer(cmdBuffer));
 
     GenericDrawPreparation(&cmdBuffer, &pipelineobj, &descriptorSet);
 
@@ -1388,11 +1426,12 @@
     DRAW_STATE_DUMP_DOT_FILE pDSDumpDot = (DRAW_STATE_DUMP_DOT_FILE)xglGetProcAddr(gpu(), (char*)"drawStateDumpDotFile");
     pDSDumpDot((char*)"triTest2.dot");
 #endif
-    // render triangle
+
+    // render two triangles
     cmdBuffer.Draw(0, 6, 0, 1);
 
     // finalize recording of the command buffer
-    cmdBuffer.EndCommandBuffer();
+    EndCommandBuffer(cmdBuffer);
     cmdBuffer.QueueCommandBuffer(m_memoryRefManager.GetMemoryRefList(), m_memoryRefManager.GetNumRefs());
 
     for (int i = 0; i < m_renderTargets.size(); i++)
@@ -1454,7 +1493,7 @@
     XglCommandBufferObj cmdBuffer(m_device);
     cmdBuffer.AddRenderTarget(m_renderTargets[0]);
 
-    ASSERT_XGL_SUCCESS(cmdBuffer.BeginCommandBuffer(renderPass()));
+    ASSERT_XGL_SUCCESS(BeginCommandBuffer(cmdBuffer));
 
     GenericDrawPreparation(&cmdBuffer, &pipelineobj, &descriptorSet);
 
@@ -1463,11 +1502,12 @@
     DRAW_STATE_DUMP_DOT_FILE pDSDumpDot = (DRAW_STATE_DUMP_DOT_FILE)xglGetProcAddr(gpu(), (char*)"drawStateDumpDotFile");
     pDSDumpDot((char*)"triTest2.dot");
 #endif
-    // render triangle
+
+    // render two triangles
     cmdBuffer.Draw(0, 6, 0, 1);
 
     // finalize recording of the command buffer
-    cmdBuffer.EndCommandBuffer();
+    EndCommandBuffer(cmdBuffer);
     cmdBuffer.QueueCommandBuffer(m_memoryRefManager.GetMemoryRefList(), m_memoryRefManager.GetNumRefs());
 
     for (int i = 0; i < m_renderTargets.size(); i++)
@@ -1532,7 +1572,7 @@
     XglCommandBufferObj cmdBuffer(m_device);
     cmdBuffer.AddRenderTarget(m_renderTargets[0]);
 
-    ASSERT_XGL_SUCCESS(cmdBuffer.BeginCommandBuffer(renderPass()));
+    ASSERT_XGL_SUCCESS(BeginCommandBuffer(cmdBuffer));
 
     GenericDrawPreparation(&cmdBuffer, &pipelineobj, &descriptorSet);
 
@@ -1540,11 +1580,12 @@
     DRAW_STATE_DUMP_DOT_FILE pDSDumpDot = (DRAW_STATE_DUMP_DOT_FILE)xglGetProcAddr(gpu(), (char*)"drawStateDumpDotFile");
     pDSDumpDot((char*)"triTest2.dot");
 #endif
+
     // render triangle
     cmdBuffer.Draw(0, 3, 0, 1);
 
     // finalize recording of the command buffer
-    cmdBuffer.EndCommandBuffer();
+    EndCommandBuffer(cmdBuffer);
     cmdBuffer.QueueCommandBuffer(m_memoryRefManager.GetMemoryRefList(), m_memoryRefManager.GetNumRefs());
 
     for (int i = 0; i < m_renderTargets.size(); i++)
@@ -1621,7 +1662,7 @@
     XglCommandBufferObj cmdBuffer(m_device);
     cmdBuffer.AddRenderTarget(m_renderTargets[0]);
 
-    ASSERT_XGL_SUCCESS(cmdBuffer.BeginCommandBuffer(renderPass()));
+    ASSERT_XGL_SUCCESS(BeginCommandBuffer(cmdBuffer));
 
     GenericDrawPreparation(&cmdBuffer, &pipelineobj, &descriptorSet);
 
@@ -1630,11 +1671,12 @@
     DRAW_STATE_DUMP_DOT_FILE pDSDumpDot = (DRAW_STATE_DUMP_DOT_FILE)xglGetProcAddr(gpu(), (char*)"drawStateDumpDotFile");
     pDSDumpDot((char*)"triTest2.dot");
 #endif
-    // render triangle
+
+    // render two triangles
     cmdBuffer.Draw(0, 6, 0, 1);
 
     // finalize recording of the command buffer
-    cmdBuffer.EndCommandBuffer();
+    EndCommandBuffer(cmdBuffer);
     cmdBuffer.QueueCommandBuffer(m_memoryRefManager.GetMemoryRefList(), m_memoryRefManager.GetNumRefs());
 
     for (int i = 0; i < m_renderTargets.size(); i++)
@@ -1715,7 +1757,7 @@
     XglCommandBufferObj cmdBuffer(m_device);
     cmdBuffer.AddRenderTarget(m_renderTargets[0]);
 
-    ASSERT_XGL_SUCCESS(cmdBuffer.BeginCommandBuffer(renderPass()));
+    ASSERT_XGL_SUCCESS(BeginCommandBuffer(cmdBuffer));
 
     GenericDrawPreparation(&cmdBuffer, &pipelineobj, &descriptorSet);
 
@@ -1724,11 +1766,12 @@
     DRAW_STATE_DUMP_DOT_FILE pDSDumpDot = (DRAW_STATE_DUMP_DOT_FILE)xglGetProcAddr(gpu(), (char*)"drawStateDumpDotFile");
     pDSDumpDot((char*)"triTest2.dot");
 #endif
-    // render triangle
+
+    // render two triangles
     cmdBuffer.Draw(0, 6, 0, 1);
 
     // finalize recording of the command buffer
-    cmdBuffer.EndCommandBuffer();
+    EndCommandBuffer(cmdBuffer);
     cmdBuffer.QueueCommandBuffer(m_memoryRefManager.GetMemoryRefList(), m_memoryRefManager.GetNumRefs());
 
     for (int i = 0; i < m_renderTargets.size(); i++)
@@ -1829,7 +1872,7 @@
     XglCommandBufferObj cmdBuffer(m_device);
     cmdBuffer.AddRenderTarget(m_renderTargets[0]);
 
-    ASSERT_XGL_SUCCESS(cmdBuffer.BeginCommandBuffer(renderPass()));
+    ASSERT_XGL_SUCCESS(BeginCommandBuffer(cmdBuffer));
     GenericDrawPreparation(&cmdBuffer, &pipelineobj, &descriptorSet);
 
     cmdBuffer.BindVertexBuffer(&meshBuffer, 0, 0);
@@ -1837,11 +1880,13 @@
     DRAW_STATE_DUMP_DOT_FILE pDSDumpDot = (DRAW_STATE_DUMP_DOT_FILE)xglGetProcAddr(gpu(), (char*)"drawStateDumpDotFile");
     pDSDumpDot((char*)"triTest2.dot");
 #endif
-    // render triangle
+
+    // render triangles
     cmdBuffer.Draw(0, 36, 0, 1);
 
+
     // finalize recording of the command buffer
-    cmdBuffer.EndCommandBuffer();
+    EndCommandBuffer(cmdBuffer);
     cmdBuffer.QueueCommandBuffer(m_memoryRefManager.GetMemoryRefList(), m_memoryRefManager.GetNumRefs());
 
     for (int i = 0; i < m_renderTargets.size(); i++)
@@ -1899,7 +1944,7 @@
     XglCommandBufferObj cmdBuffer(m_device);
     cmdBuffer.AddRenderTarget(m_renderTargets[0]);
 
-    ASSERT_XGL_SUCCESS(cmdBuffer.BeginCommandBuffer(renderPass()));
+    ASSERT_XGL_SUCCESS(BeginCommandBuffer(cmdBuffer));
 
     GenericDrawPreparation(&cmdBuffer, &pipelineobj, &descriptorSet);
 
@@ -1907,11 +1952,12 @@
     DRAW_STATE_DUMP_DOT_FILE pDSDumpDot = (DRAW_STATE_DUMP_DOT_FILE)xglGetProcAddr(gpu(), (char*)"drawStateDumpDotFile");
     pDSDumpDot((char*)"triTest2.dot");
 #endif
+
     // render triangle
     cmdBuffer.Draw(0, 3, 0, 1);
 
     // finalize recording of the command buffer
-    cmdBuffer.EndCommandBuffer();
+    EndCommandBuffer(cmdBuffer);
     cmdBuffer.QueueCommandBuffer(m_memoryRefManager.GetMemoryRefList(), m_memoryRefManager.GetNumRefs());
 
     for (int i = 0; i < m_renderTargets.size(); i++)
@@ -1972,7 +2018,7 @@
     XglCommandBufferObj cmdBuffer(m_device);
     cmdBuffer.AddRenderTarget(m_renderTargets[0]);
 
-    ASSERT_XGL_SUCCESS(cmdBuffer.BeginCommandBuffer(renderPass()));
+    ASSERT_XGL_SUCCESS(BeginCommandBuffer(cmdBuffer));
 
     GenericDrawPreparation(&cmdBuffer, &pipelineobj, &descriptorSet);
 
@@ -1984,7 +2030,7 @@
     cmdBuffer.Draw(0, 3, 0, 1);
 
     // finalize recording of the command buffer
-    cmdBuffer.EndCommandBuffer();
+    EndCommandBuffer(cmdBuffer);
     cmdBuffer.QueueCommandBuffer(m_memoryRefManager.GetMemoryRefList(), m_memoryRefManager.GetNumRefs());
 
     for (int i = 0; i < m_renderTargets.size(); i++)
@@ -2056,7 +2102,7 @@
     XglCommandBufferObj cmdBuffer(m_device);
     cmdBuffer.AddRenderTarget(m_renderTargets[0]);
 
-    ASSERT_XGL_SUCCESS(cmdBuffer.BeginCommandBuffer(renderPass()));
+    ASSERT_XGL_SUCCESS(BeginCommandBuffer(cmdBuffer));
 
     GenericDrawPreparation(&cmdBuffer, &pipelineobj, &descriptorSet);
 
@@ -2068,7 +2114,7 @@
     cmdBuffer.Draw(0, 3, 0, 1);
 
     // finalize recording of the command buffer
-    cmdBuffer.EndCommandBuffer();
+    EndCommandBuffer(cmdBuffer);
     cmdBuffer.QueueCommandBuffer(m_memoryRefManager.GetMemoryRefList(), m_memoryRefManager.GetNumRefs());
 
     for (int i = 0; i < m_renderTargets.size(); i++)
@@ -2129,7 +2175,7 @@
     XglCommandBufferObj cmdBuffer(m_device);
     cmdBuffer.AddRenderTarget(m_renderTargets[0]);
 
-    ASSERT_XGL_SUCCESS(cmdBuffer.BeginCommandBuffer(renderPass()));
+    ASSERT_XGL_SUCCESS(BeginCommandBuffer(cmdBuffer));
 
     GenericDrawPreparation(&cmdBuffer, &pipelineobj, &descriptorSet);
 
@@ -2141,7 +2187,7 @@
     cmdBuffer.Draw(0, 3, 0, 1);
 
     // finalize recording of the command buffer
-    cmdBuffer.EndCommandBuffer();
+    EndCommandBuffer(cmdBuffer);
     cmdBuffer.QueueCommandBuffer(m_memoryRefManager.GetMemoryRefList(), m_memoryRefManager.GetNumRefs());
 
     for (int i = 0; i < m_renderTargets.size(); i++)
@@ -2223,7 +2269,7 @@
     XglCommandBufferObj cmdBuffer(m_device);
     cmdBuffer.AddRenderTarget(m_renderTargets[0]);
 
-    ASSERT_XGL_SUCCESS(cmdBuffer.BeginCommandBuffer(renderPass()));
+    ASSERT_XGL_SUCCESS(BeginCommandBuffer(cmdBuffer));
 
     GenericDrawPreparation(&cmdBuffer, &pipelineobj, &descriptorSet);
 
@@ -2235,7 +2281,7 @@
     cmdBuffer.Draw(0, 3, 0, 1);
 
     // finalize recording of the command buffer
-    cmdBuffer.EndCommandBuffer();
+    EndCommandBuffer(cmdBuffer);
     cmdBuffer.QueueCommandBuffer(m_memoryRefManager.GetMemoryRefList(), m_memoryRefManager.GetNumRefs());
 
     for (int i = 0; i < m_renderTargets.size(); i++)
@@ -2307,7 +2353,7 @@
     XglCommandBufferObj cmdBuffer(m_device);
     cmdBuffer.AddRenderTarget(m_renderTargets[0]);
 
-    ASSERT_XGL_SUCCESS(cmdBuffer.BeginCommandBuffer(renderPass()));
+    ASSERT_XGL_SUCCESS(BeginCommandBuffer(cmdBuffer));
 
     GenericDrawPreparation(&cmdBuffer, &pipelineobj, &descriptorSet);
 
@@ -2319,7 +2365,7 @@
     cmdBuffer.Draw(0, 3, 0, 1);
 
     // finalize recording of the command buffer
-    cmdBuffer.EndCommandBuffer();
+    EndCommandBuffer(cmdBuffer);
     cmdBuffer.QueueCommandBuffer(m_memoryRefManager.GetMemoryRefList(), m_memoryRefManager.GetNumRefs());
 
     for (int i = 0; i < m_renderTargets.size(); i++)
@@ -2410,7 +2456,7 @@
     XglCommandBufferObj cmdBuffer(m_device);
     cmdBuffer.AddRenderTarget(m_renderTargets[0]);
 
-    ASSERT_XGL_SUCCESS(cmdBuffer.BeginCommandBuffer(renderPass()));
+    ASSERT_XGL_SUCCESS(BeginCommandBuffer(cmdBuffer));
 
     GenericDrawPreparation(&cmdBuffer, &pipelineobj, &descriptorSet);
 
@@ -2422,7 +2468,7 @@
     cmdBuffer.Draw(0, 3, 0, 1);
 
     // finalize recording of the command buffer
-    cmdBuffer.EndCommandBuffer();
+    EndCommandBuffer(cmdBuffer);
     cmdBuffer.QueueCommandBuffer(m_memoryRefManager.GetMemoryRefList(), m_memoryRefManager.GetNumRefs());
 
     for (int i = 0; i < m_renderTargets.size(); i++)
@@ -2508,7 +2554,7 @@
     XglCommandBufferObj cmdBuffer(m_device);
     cmdBuffer.AddRenderTarget(m_renderTargets[0]);
 
-    ASSERT_XGL_SUCCESS(cmdBuffer.BeginCommandBuffer(renderPass()));
+    ASSERT_XGL_SUCCESS(BeginCommandBuffer(cmdBuffer));
 
     GenericDrawPreparation(&cmdBuffer, &pipelineobj, &descriptorSet);
 
@@ -2520,7 +2566,7 @@
     cmdBuffer.Draw(0, 3, 0, 1);
 
     // finalize recording of the command buffer
-    cmdBuffer.EndCommandBuffer();
+    EndCommandBuffer(cmdBuffer);
     cmdBuffer.QueueCommandBuffer(m_memoryRefManager.GetMemoryRefList(), m_memoryRefManager.GetNumRefs());
 
     for (int i = 0; i < m_renderTargets.size(); i++)
@@ -2638,7 +2684,8 @@
     XglCommandBufferObj cmdBuffer(m_device);
     cmdBuffer.AddRenderTarget(m_renderTargets[0]);
 
-    ASSERT_XGL_SUCCESS(cmdBuffer.BeginCommandBuffer(renderPass()));
+    ASSERT_XGL_SUCCESS(BeginCommandBuffer(cmdBuffer));
+
     GenericDrawPreparation(&cmdBuffer, &pipelineobj, &descriptorSet);
 
     cmdBuffer.BindVertexBuffer(&meshBuffer, 0, 0);
@@ -2650,7 +2697,7 @@
     cmdBuffer.Draw(0, 36, 0, 1);
 
     // finalize recording of the command buffer
-    cmdBuffer.EndCommandBuffer();
+    EndCommandBuffer(cmdBuffer);
     cmdBuffer.QueueCommandBuffer(m_memoryRefManager.GetMemoryRefList(), m_memoryRefManager.GetNumRefs());
 
     for (int i = 0; i < m_renderTargets.size(); i++)
@@ -2760,7 +2807,7 @@
     XglCommandBufferObj cmdBuffer(m_device);
     cmdBuffer.AddRenderTarget(m_renderTargets[0]);
 
-    ASSERT_XGL_SUCCESS(cmdBuffer.BeginCommandBuffer(renderPass()));
+    ASSERT_XGL_SUCCESS(BeginCommandBuffer(cmdBuffer));
 
     GenericDrawPreparation(&cmdBuffer, &pipelineobj, &descriptorSet);
 
@@ -2772,7 +2819,7 @@
     cmdBuffer.Draw(0, 3, 0, 1);
 
     // finalize recording of the command buffer
-    cmdBuffer.EndCommandBuffer();
+    EndCommandBuffer(cmdBuffer);
     cmdBuffer.QueueCommandBuffer(m_memoryRefManager.GetMemoryRefList(), m_memoryRefManager.GetNumRefs());
 
     for (int i = 0; i < m_renderTargets.size(); i++)
@@ -2876,7 +2923,7 @@
     XglCommandBufferObj cmdBuffer(m_device);
     cmdBuffer.AddRenderTarget(m_renderTargets[0]);
 
-    ASSERT_XGL_SUCCESS(cmdBuffer.BeginCommandBuffer(renderPass()));
+    ASSERT_XGL_SUCCESS(BeginCommandBuffer(cmdBuffer));
 
     GenericDrawPreparation(&cmdBuffer, &pipelineobj, &descriptorSet);
 
@@ -2888,7 +2935,7 @@
     cmdBuffer.Draw(0, 3, 0, 1);
 
     // finalize recording of the command buffer
-    cmdBuffer.EndCommandBuffer();
+    EndCommandBuffer(cmdBuffer);
     cmdBuffer.QueueCommandBuffer(m_memoryRefManager.GetMemoryRefList(), m_memoryRefManager.GetNumRefs());
 
     for (int i = 0; i < m_renderTargets.size(); i++)
@@ -3129,7 +3176,7 @@
     XglCommandBufferObj cmdBuffer(m_device);
     cmdBuffer.AddRenderTarget(m_renderTargets[0]);
 
-    ASSERT_XGL_SUCCESS(cmdBuffer.BeginCommandBuffer(renderPass()));
+    ASSERT_XGL_SUCCESS(BeginCommandBuffer(cmdBuffer));
 
     GenericDrawPreparation(&cmdBuffer, &pipelineobj, &descriptorSet);
 
@@ -3141,7 +3188,7 @@
     cmdBuffer.Draw(0, 3, 0, 1);
 
     // finalize recording of the command buffer
-    cmdBuffer.EndCommandBuffer();
+    EndCommandBuffer(cmdBuffer);
     cmdBuffer.QueueCommandBuffer(m_memoryRefManager.GetMemoryRefList(), m_memoryRefManager.GetNumRefs());
 
     for (int i = 0; i < m_renderTargets.size(); i++)
diff --git a/tests/xglrenderframework.cpp b/tests/xglrenderframework.cpp
index 9a46f78..3721816 100644
--- a/tests/xglrenderframework.cpp
+++ b/tests/xglrenderframework.cpp
@@ -76,7 +76,7 @@
     if (m_stateDepthStencil) xglDestroyObject(m_stateDepthStencil);
     if (m_stateRaster) xglDestroyObject(m_stateRaster);
     if (m_cmdBuffer) xglDestroyObject(m_cmdBuffer);
-    if (m_frameBuffer) xglDestroyObject(m_frameBuffer);
+    if (m_framebuffer) xglDestroyObject(m_framebuffer);
     if (m_renderPass) xglDestroyObject(m_renderPass);
 
     if (m_stateViewport) {
@@ -174,6 +174,9 @@
 
 void XglRenderFramework::InitRenderTarget(uint32_t targets)
 {
+    std::vector<XGL_ATTACHMENT_LOAD_OP> load_ops;
+    std::vector<XGL_ATTACHMENT_STORE_OP> store_ops;
+    std::vector<XGL_CLEAR_COLOR> clear_colors;
     uint32_t i;
 
     for (i = 0; i < targets; i++) {
@@ -184,16 +187,11 @@
         m_colorBindings[i].view  = img->targetView();
         m_colorBindings[i].layout = XGL_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
         m_renderTargets.push_back(img);
+        load_ops.push_back(XGL_ATTACHMENT_LOAD_OP_LOAD);
+        store_ops.push_back(XGL_ATTACHMENT_STORE_OP_STORE);
+        clear_colors.push_back(m_clear_color);
     }
       // Create Framebuffer and RenderPass with color attachments and any depth/stencil attachment
-    XGL_ATTACHMENT_LOAD_OP load_op = XGL_ATTACHMENT_LOAD_OP_LOAD;
-    XGL_ATTACHMENT_STORE_OP store_op = XGL_ATTACHMENT_STORE_OP_STORE;
-    XGL_CLEAR_COLOR clear_color;
-    clear_color.color.rawColor[0] = 64;
-    clear_color.color.rawColor[1] = 64;
-    clear_color.color.rawColor[2] = 64;
-    clear_color.color.rawColor[3] = 0;
-    clear_color.useRawValue = XGL_TRUE;
     XGL_DEPTH_STENCIL_BIND_INFO *dsBinding;
     if (m_depthStencilBinding.view)
         dsBinding = &m_depthStencilBinding;
@@ -211,19 +209,26 @@
     fb_info.layers = 1;
 
     XGL_RENDER_PASS_CREATE_INFO rp_info;
+
     memset(&rp_info, 0 , sizeof(rp_info));
-    xglCreateFramebuffer(device(), &fb_info, &(m_frameBuffer));
-    rp_info.framebuffer = m_frameBuffer;
+    xglCreateFramebuffer(device(), &fb_info, &m_framebuffer);
+
     rp_info.sType = XGL_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
     rp_info.renderArea.extent.width = m_width;
     rp_info.renderArea.extent.height = m_height;
     rp_info.colorAttachmentCount = m_renderTargets.size();
-    rp_info.pColorLoadOps = &load_op;
-    rp_info.pColorStoreOps = &store_op;
-    rp_info.pColorLoadClearValues = &clear_color;
+    rp_info.pColorFormats = &m_render_target_fmt;
+    rp_info.pColorLayouts = &m_colorBindings[0].layout;
+    rp_info.pColorLoadOps = &load_ops[0];
+    rp_info.pColorStoreOps = &store_ops[0];
+    rp_info.pColorLoadClearValues = &clear_colors[0];
+    rp_info.depthStencilFormat = m_depth_stencil_fmt;
+    rp_info.depthStencilLayout = m_depthStencilBinding.layout;
     rp_info.depthLoadOp = XGL_ATTACHMENT_LOAD_OP_LOAD;
+    rp_info.depthLoadClearValue = m_depth_clear_color;
     rp_info.depthStoreOp = XGL_ATTACHMENT_STORE_OP_STORE;
     rp_info.stencilLoadOp = XGL_ATTACHMENT_LOAD_OP_LOAD;
+    rp_info.stencilLoadClearValue = m_stencil_clear_color;
     rp_info.stencilStoreOp = XGL_ATTACHMENT_STORE_OP_STORE;
     xglCreateRenderPass(device(), &rp_info, &m_renderPass);
 }
@@ -1128,9 +1133,9 @@
     return XGL_SUCCESS;
 }
 
-XGL_RESULT XglCommandBufferObj::BeginCommandBuffer(XGL_RENDER_PASS renderpass_obj)
+XGL_RESULT XglCommandBufferObj::BeginCommandBuffer(XGL_RENDER_PASS renderpass_obj, XGL_FRAMEBUFFER framebuffer_obj)
 {
-    begin(renderpass_obj);
+    begin(renderpass_obj, framebuffer_obj);
     return XGL_SUCCESS;
 }
 
@@ -1283,6 +1288,21 @@
     }
 }
 
+void XglCommandBufferObj::BeginRenderPass(XGL_RENDER_PASS renderpass, XGL_FRAMEBUFFER framebuffer)
+{
+    XGL_RENDER_PASS_BEGIN rp_begin = {
+        renderpass,
+        framebuffer,
+    };
+
+    xglCmdBeginRenderPass( obj(), &rp_begin);
+}
+
+void XglCommandBufferObj::EndRenderPass(XGL_RENDER_PASS renderpass)
+{
+    xglCmdEndRenderPass( obj(), renderpass);
+}
+
 void XglCommandBufferObj::BindStateObject(XGL_STATE_BIND_POINT stateBindPoint, XGL_DYNAMIC_STATE_OBJECT stateObject)
 {
     xglCmdBindDynamicStateObject( obj(), stateBindPoint, stateObject);
diff --git a/tests/xglrenderframework.h b/tests/xglrenderframework.h
index 4bf55f1..531063d 100644
--- a/tests/xglrenderframework.h
+++ b/tests/xglrenderframework.h
@@ -55,6 +55,7 @@
     XGL_DEVICE device() {return m_device->device();}
     XGL_PHYSICAL_GPU gpu() {return objs[0];}
     XGL_RENDER_PASS renderPass() {return m_renderPass;}
+    XGL_FRAMEBUFFER framebuffer() {return m_framebuffer;}
     void InitViewport(float width, float height);
     void InitViewport();
     void InitRenderTarget();
@@ -72,7 +73,7 @@
     XglDevice                              *m_device;
     XGL_CMD_BUFFER                          m_cmdBuffer;
     XGL_RENDER_PASS                         m_renderPass;
-    XGL_FRAMEBUFFER                         m_frameBuffer;
+    XGL_FRAMEBUFFER                         m_framebuffer;
     XGL_MEMORY_REF                          m_memRefs[5];
     XGL_DYNAMIC_RS_STATE_OBJECT             m_stateRaster;
     XGL_DYNAMIC_CB_STATE_OBJECT             m_colorBlend;
@@ -118,7 +119,7 @@
     XglCommandBufferObj(XglDevice *device);
     XGL_CMD_BUFFER GetBufferHandle();
     XGL_RESULT BeginCommandBuffer(XGL_CMD_BUFFER_BEGIN_INFO *pInfo);
-    XGL_RESULT BeginCommandBuffer(XGL_RENDER_PASS renderpass_obj);
+    XGL_RESULT BeginCommandBuffer(XGL_RENDER_PASS renderpass_obj, XGL_FRAMEBUFFER framebuffer_obj);
     XGL_RESULT BeginCommandBuffer();
     XGL_RESULT EndCommandBuffer();
     void PipelineBarrier(XGL_PIPELINE_BARRIER *barrierPtr);
@@ -131,6 +132,8 @@
     void BindVertexBuffer(XglConstantBufferObj *vertexBuffer, uint32_t offset, uint32_t binding);
     void BindIndexBuffer(XglIndexBufferObj *indexBuffer, uint32_t offset);
     void BindStateObject(XGL_STATE_BIND_POINT stateBindPoint, XGL_DYNAMIC_STATE_OBJECT stateObject);
+    void BeginRenderPass(XGL_RENDER_PASS renderpass, XGL_FRAMEBUFFER framebuffer);
+    void EndRenderPass(XGL_RENDER_PASS renderpass);
     void Draw(uint32_t firstVertex, uint32_t vertexCount, uint32_t firstInstance, uint32_t instanceCount);
     void DrawIndexed(uint32_t firstIndex, uint32_t indexCount, int32_t vertexOffset, uint32_t firstInstance, uint32_t instanceCount);
     void QueueCommandBuffer(XGL_MEMORY_REF *memRefs, uint32_t numMemRefs);
diff --git a/tests/xgltestbinding.cpp b/tests/xgltestbinding.cpp
index fcd91b7..8394566 100644
--- a/tests/xgltestbinding.cpp
+++ b/tests/xgltestbinding.cpp
@@ -914,13 +914,14 @@
     EXPECT(xglBeginCommandBuffer(obj(), info) == XGL_SUCCESS);
 }
 
-void CmdBuffer::begin(XGL_RENDER_PASS renderpass_obj)
+void CmdBuffer::begin(XGL_RENDER_PASS renderpass_obj, XGL_FRAMEBUFFER framebuffer_obj)
 {
     XGL_CMD_BUFFER_BEGIN_INFO info = {};
     XGL_CMD_BUFFER_GRAPHICS_BEGIN_INFO graphics_cmd_buf_info = {};
     graphics_cmd_buf_info.sType = XGL_STRUCTURE_TYPE_CMD_BUFFER_GRAPHICS_BEGIN_INFO;
     graphics_cmd_buf_info.pNext = NULL;
-    graphics_cmd_buf_info.renderPass = renderpass_obj;
+    graphics_cmd_buf_info.renderPassContinue.renderPass = renderpass_obj;
+    graphics_cmd_buf_info.renderPassContinue.framebuffer = framebuffer_obj;
 
     info.flags = XGL_CMD_BUFFER_OPTIMIZE_GPU_SMALL_BATCH_BIT |
           XGL_CMD_BUFFER_OPTIMIZE_ONE_TIME_SUBMIT_BIT;
diff --git a/tests/xgltestbinding.h b/tests/xgltestbinding.h
index 4d1f213..86f27f0 100644
--- a/tests/xgltestbinding.h
+++ b/tests/xgltestbinding.h
@@ -591,7 +591,7 @@
 
     // xglBeginCommandBuffer()
     void begin(const XGL_CMD_BUFFER_BEGIN_INFO *info);
-    void begin(XGL_RENDER_PASS renderpass_obj);
+    void begin(XGL_RENDER_PASS renderpass_obj, XGL_FRAMEBUFFER framebuffer_obj);
     void begin();
 
     // xglEndCommandBuffer()
diff --git a/tools/glave/src/glv_extensions/glvreplay_xgl/glvreplay_xgl_xglreplay.cpp b/tools/glave/src/glv_extensions/glvreplay_xgl/glvreplay_xgl_xglreplay.cpp
index f6a55b5..f4caba2 100644
--- a/tools/glave/src/glv_extensions/glvreplay_xgl/glvreplay_xgl_xglreplay.cpp
+++ b/tools/glave/src/glv_extensions/glvreplay_xgl/glvreplay_xgl_xglreplay.cpp
@@ -832,18 +832,8 @@
 {
     XGL_RESULT replayResult = XGL_ERROR_UNKNOWN;
     glv_replay::GLV_REPLAY_RESULT returnValue = glv_replay::GLV_REPLAY_SUCCESS;
-    XGL_RENDER_PASS_CREATE_INFO *pInfo = (XGL_RENDER_PASS_CREATE_INFO *) pPacket->pCreateInfo;
-    // remap framebuffer
-    XGL_FRAMEBUFFER savedFB = 0, *pFB = &(pInfo->framebuffer);
-    if (*pFB != NULL)
-    {
-        savedFB = pInfo->framebuffer;
-        *pFB = m_objMapper.remap(pInfo->framebuffer);
-    }
     XGL_RENDER_PASS local_renderpass;
     replayResult = m_xglFuncs.real_xglCreateRenderPass(m_objMapper.remap(pPacket->device), pPacket->pCreateInfo, &local_renderpass);
-    if (*pFB != NULL)
-        pInfo->framebuffer = savedFB;
     if (replayResult == XGL_SUCCESS)
     {
         m_objMapper.add_to_map(pPacket->pRenderPass, &local_renderpass);
@@ -858,7 +848,7 @@
     glv_replay::GLV_REPLAY_RESULT returnValue = glv_replay::GLV_REPLAY_SUCCESS;
     XGL_CMD_BUFFER_BEGIN_INFO* pInfo = (XGL_CMD_BUFFER_BEGIN_INFO*)pPacket->pBeginInfo;
     // assume only zero or one graphics_begin_info in the chain
-    XGL_RENDER_PASS savedRP, *pRP;
+    XGL_RENDER_PASS_BEGIN savedRP, *pRP;
     XGL_CMD_BUFFER_GRAPHICS_BEGIN_INFO *pGInfo = NULL;
     while (pInfo != NULL)
     {
@@ -866,16 +856,17 @@
         if (pInfo->sType == XGL_STRUCTURE_TYPE_CMD_BUFFER_GRAPHICS_BEGIN_INFO)
         {
             pGInfo = (XGL_CMD_BUFFER_GRAPHICS_BEGIN_INFO *) pInfo;
-            savedRP = pGInfo->renderPass;
-            pRP = &(pGInfo->renderPass);
-            *pRP = m_objMapper.remap(pGInfo->renderPass);
+            savedRP = pGInfo->renderPassContinue;
+            pRP = &(pGInfo->renderPassContinue);
+            pRP->renderPass = m_objMapper.remap(savedRP.renderPass);
+            pRP->framebuffer = m_objMapper.remap(savedRP.framebuffer);
             break;
         }
         pInfo = (XGL_CMD_BUFFER_BEGIN_INFO*) pInfo->pNext;
     }
     replayResult = m_xglFuncs.real_xglBeginCommandBuffer(m_objMapper.remap(pPacket->cmdBuffer), pPacket->pBeginInfo);
     if (pGInfo != NULL)
-        pGInfo->renderPass = savedRP;
+        pGInfo->renderPassContinue = savedRP;
     CHECK_RETURN_VALUE(xglBeginCommandBuffer);
     return returnValue;
 }
diff --git a/xgl.py b/xgl.py
index e917f82..6afe794 100644
--- a/xgl.py
+++ b/xgl.py
@@ -808,7 +808,7 @@
 
         Proto("void", "CmdBeginRenderPass",
             [Param("XGL_CMD_BUFFER", "cmdBuffer"),
-             Param("XGL_RENDER_PASS", "renderPass")]),
+             Param("const XGL_RENDER_PASS_BEGIN*", "pRenderPassBegin")]),
 
         Proto("void", "CmdEndRenderPass",
             [Param("XGL_CMD_BUFFER", "cmdBuffer"),