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/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)