summaryrefslogtreecommitdiffstats
path: root/src/gallium/drivers/r300
diff options
context:
space:
mode:
authorCorbin Simpson <[email protected]>2010-06-13 20:52:58 -0700
committerCorbin Simpson <[email protected]>2010-06-16 10:54:08 -0700
commite163fc0b15c80172fb2615fc04d7fc7bdc0d25c3 (patch)
treec552147f9bdf3b7c385e9894aa229773e8837298 /src/gallium/drivers/r300
parenta91fea65dc574cc0ba2ccec936d60366b034489a (diff)
r300g: Add resource resolve function.
Diffstat (limited to 'src/gallium/drivers/r300')
-rw-r--r--src/gallium/drivers/r300/r300_render.c35
1 files changed, 35 insertions, 0 deletions
diff --git a/src/gallium/drivers/r300/r300_render.c b/src/gallium/drivers/r300/r300_render.c
index b97f7be7d40..c5a4406a921 100644
--- a/src/gallium/drivers/r300/r300_render.c
+++ b/src/gallium/drivers/r300/r300_render.c
@@ -1013,6 +1013,39 @@ struct draw_stage* r300_draw_stage(struct r300_context* r300)
return stage;
}
+/****************************************************************************
+ * End of SW TCL functions *
+ ***************************************************************************/
+
+static void r300_resource_resolve(struct pipe_context* pipe,
+ struct pipe_resource* dest,
+ struct pipe_subresource subdest,
+ struct pipe_resource* src,
+ struct pipe_subresource subsrc)
+{
+ struct r300_context* r300 = r300_context(pipe);
+ struct r300_texture* tex;
+ CS_LOCALS(r300);
+
+ assert(tex && tex->buffer && "resolvebuf is marked, but NULL!");
+
+ OUT_CS_REG_SEQ(R300_RB3D_AARESOLVE_OFFSET, 1);
+ OUT_CS_TEX_RELOC(tex, tex->offset, 0, RADEON_GEM_DOMAIN_VRAM, 0);
+
+ OUT_CS_REG_SEQ(R300_RB3D_AARESOLVE_PITCH, 1);
+ OUT_CS_TEX_RELOC(tex, tex->fb_state.colorpitch[tex->level],
+ 0, RADEON_GEM_DOMAIN_VRAM, 0);
+
+ OUT_CS_REG(R300_RB3D_AARESOLVE_CTL,
+ R300_RB3D_AARESOLVE_CTL_AARESOLVE_MODE_RESOLVE |
+ R300_RB3D_AARESOLVE_CTL_AARESOLVE_ALPHA_AVERAGE);
+
+ r300->context.resource_fill_region(pipe,
+ src, subsrc, 0, 0, 0, src->width0, src->height0, 0x0);
+
+ OUT_CS_REG(R300_RB3D_AARESOLVE_CTL, 0x0);
+}
+
void r300_init_render_functions(struct r300_context *r300)
{
/* Set generic functions. */
@@ -1027,6 +1060,8 @@ void r300_init_render_functions(struct r300_context *r300)
r300->context.draw_range_elements = r300_swtcl_draw_range_elements;
}
+ r300->context.resource_resolve = r300_resource_resolve;
+
/* Plug in the two-sided stencil reference value fallback if needed. */
if (!r300->screen->caps.is_r500)
r300_plug_in_stencil_ref_fallback(r300);