r300g: Add resource resolve function.
authorCorbin Simpson <MostAwesomeDude@gmail.com>
Mon, 14 Jun 2010 03:52:58 +0000 (20:52 -0700)
committerCorbin Simpson <MostAwesomeDude@gmail.com>
Wed, 16 Jun 2010 17:54:08 +0000 (10:54 -0700)
src/gallium/drivers/r300/r300_render.c

index b97f7be7d40fbe5640c517b153edd70b1ebcfe55..c5a4406a921ddf0e4b373b0d4b735585c5aad845 100644 (file)
@@ -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);