Mesa (openchrome-branch): openchrome: Implement pbo and non-pbo glBitmap Acceleration.

Thomas Hellstrom thomash at kemper.freedesktop.org
Tue Mar 24 22:10:01 UTC 2009


Module: Mesa
Branch: openchrome-branch
Commit: dd3446647705dd4f9d8566e54fd7cae8c97322e7
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=dd3446647705dd4f9d8566e54fd7cae8c97322e7

Author: Thomas Hellstrom <thomas-at-shipmail-dot-org>
Date:   Tue Mar 24 21:27:07 2009 +0100

openchrome: Implement pbo and non-pbo glBitmap Acceleration.

Use A1 textures and "texture transparency" to kill transparent
bitmap pixels based on incoming alpha before fog application.
Enable the use of the libwsbm slabpool for fast small-granularity
bitmap and drawpixel textures.

Signed-off-by: Thomas Hellstrom <thomas-at-shipmail-dot-org>

---

 src/mesa/drivers/dri/openchrome/via_context.c      |    2 +-
 src/mesa/drivers/dri/openchrome/via_context.h      |    5 +
 src/mesa/drivers/dri/openchrome/via_ioctl.c        |    3 +-
 src/mesa/drivers/dri/openchrome/via_meta.c         |  187 ++++++++++++++++----
 src/mesa/drivers/dri/openchrome/via_pixel.c        |  154 +++++++++++++++-
 src/mesa/drivers/dri/openchrome/via_screen.c       |   41 ++++-
 src/mesa/drivers/dri/openchrome/via_screen.h       |    2 +
 src/mesa/drivers/dri/openchrome/via_state.c        |   14 ++-
 .../drivers/dri/openchrome/via_teximage_accel.c    |   11 +-
 9 files changed, 356 insertions(+), 63 deletions(-)

diff --git a/src/mesa/drivers/dri/openchrome/via_context.c b/src/mesa/drivers/dri/openchrome/via_context.c
index 81c2f0b..35bd14c 100644
--- a/src/mesa/drivers/dri/openchrome/via_context.c
+++ b/src/mesa/drivers/dri/openchrome/via_context.c
@@ -308,7 +308,7 @@ viaCreateContext(const __GLcontextModes * visual,
     if (!vmesa->reloc_info)
 	goto out_err0;
 
-    vmesa->validate_list = wsbmBOCreateList(64, 1);
+    vmesa->validate_list = wsbmBOCreateList(256, 1);
     if (!vmesa->validate_list)
 	goto out_err1;
 
diff --git a/src/mesa/drivers/dri/openchrome/via_context.h b/src/mesa/drivers/dri/openchrome/via_context.h
index f60df39..0368221 100644
--- a/src/mesa/drivers/dri/openchrome/via_context.h
+++ b/src/mesa/drivers/dri/openchrome/via_context.h
@@ -113,6 +113,9 @@ struct via_meta_state
     uint32_t regMPMD;
     uint32_t regCLODu;
     uint32_t regTexFM;
+    uint32_t regTRCH;
+    uint32_t regTRCL;
+    uint32_t regTRAH;
     uint32_t saveCmdB;
 
     uint32_t texWidth;
@@ -126,6 +129,7 @@ struct via_meta_state
     GLboolean flip_src;
     struct _WsbmBufferObject *src_buf;
     uint32_t src_offset;
+    int bitMap;
 
     /*
      * Dst data.
@@ -554,6 +558,7 @@ extern void via_meta_install_src(struct via_context *vmesa,
 				 uint32_t width, uint32_t height,
 				 uint32_t stride, uint32_t src_offset,
 				 GLboolean flip_src,
+				 GLboolean bitmap,
 				 struct _WsbmBufferObject *buf);
 extern void via_meta_uninstall(struct via_context *vmesa);
 extern uint32_t via_src_fmt_to_hw(GLenum format, GLenum type, uint32_t * cpp);
diff --git a/src/mesa/drivers/dri/openchrome/via_ioctl.c b/src/mesa/drivers/dri/openchrome/via_ioctl.c
index 6aff6a7..9c3df57 100644
--- a/src/mesa/drivers/dri/openchrome/via_ioctl.c
+++ b/src/mesa/drivers/dri/openchrome/via_ioctl.c
@@ -1602,13 +1602,11 @@ via_execbuf(struct via_context *vmesa, GLuint fire_flags)
      * Validate our buffers.
      */
 
-#if 0
     ret = wsbmBOValidateUserList(vmesa->validate_list);
     if (ret) {
 	via_abort_cmdbuf(vmesa);
 	return;
     }
-#endif
 
     valList = wsbmGetKernelValidateList(vmesa->validate_list);
     iterator = validateListIterator(valList);
@@ -1737,6 +1735,7 @@ via_execbuf(struct via_context *vmesa, GLuint fire_flags)
     }
 
     wsbmFenceCmdUnlock(fence_mgr, VIA_ENGINE_CMD);
+    wsbmBOFenceUserList(vmesa->validate_list, vmesa->last_fence);
     via_drop_cmdbuf(vmesa);
     return;
 }
diff --git a/src/mesa/drivers/dri/openchrome/via_meta.c b/src/mesa/drivers/dri/openchrome/via_meta.c
index 04a257d..8f20516 100644
--- a/src/mesa/drivers/dri/openchrome/via_meta.c
+++ b/src/mesa/drivers/dri/openchrome/via_meta.c
@@ -34,6 +34,7 @@
 
 #include "main/image.h"
 #include "main/state.h"
+#include "main/macros.h"
 #include "swrast/swrast.h"
 
 #include "via_context.h"
@@ -108,19 +109,108 @@ via_meta_install_dst_fb(struct via_context *vmesa)
     meta->regEnable &= ~(HC_HenTXEnvMap_MASK |
 			 HC_HenFBCull_MASK |
 			 HC_HenAA_MASK | HC_HenTXPP_MASK | HC_HenTXTR_MASK);
-    meta->regEnable |= (HC_HenCW_MASK |
-			HC_HenTXMP_MASK | HC_HenTXCH_MASK | HC_HenAW_MASK);
+    meta->regEnable |= (HC_HenCW_MASK | HC_HenTXCH_MASK |
+			HC_HenTXMP_MASK | HC_HenAW_MASK);
+    if (meta->bitMap)
+	meta->regEnable |= HC_HenTXTR_MASK;
+
     meta->saveCmdB = vmesa->regCmdB;
     vmesa->meta_flags &= ~VIA_META_DST_ENABLE;
 }
 
+static void
+via_meta_bitmap_state(struct via_context *vmesa)
+{
+    GLcontext *ctx = vmesa->glCtx;
+    struct via_meta_state *meta = &vmesa->meta;
+    uint8_t alpha = FLOAT_TO_UBYTE(ctx->Current.RasterColor[3]);
+
+    /*
+     * Set up the following texture blending equation:
+     *
+     * Ca = regCA = (Rbitmap, Gbitmap, Bbitmap)
+     * Cb = (1, 1, 1)
+     * Cc = (0, 0, 0)
+     * Cbias = 0
+     * Cshift = 0
+     *
+     * Alpha see below.
+     */
+
+    meta->regCsat = (HC_SubA_HTXnTBLCsat << 24) |
+	HC_HTXnTBLCsat_MASK |
+	HC_HTXnTBLCa_TOPC |
+	HC_HTXnTBLCa_HTXnTBLRC |
+	HC_HTXnTBLCb_InvTOPC |
+	HC_HTXnTBLCb_0 | HC_HTXnTBLCc_TOPC | HC_HTXnTBLCc_0;
+
+    meta->regCop = (HC_SubA_HTXnTBLCop << 24) |
+	HC_HTXnTBLCop_Add |
+	HC_HTXnTBLCbias_Cbias |
+	HC_HTXnTBLCbias_0|
+	HC_HTXnTBLCshift_No |
+	HC_HTXnTBLAop_Add |
+	HC_HTXnTBLAbias_HTXnTBLRAbias | HC_HTXnTBLAshift_No;
+
+    meta->regAfog = (HC_SubA_HTXnTBLRFog << 24);
+    meta->regAa = (HC_SubA_HTXnTBLRAa << 24) | (alpha << 16);
+
+    meta->regCa = (HC_SubA_HTXnTBLRCa << 24) |
+	(FLOAT_TO_UBYTE(ctx->Current.RasterColor[0]) << 16) |
+	(FLOAT_TO_UBYTE(ctx->Current.RasterColor[1]) << 8) |
+	(FLOAT_TO_UBYTE(ctx->Current.RasterColor[2]));
+
+    /**
+     * Transparency independant of RGB value.
+     */
+
+    meta->regTRCH = (HC_SubA_HTXnTRCH << 24) | 0xFFFFFF;
+    meta->regTRCL = (HC_SubA_HTXnTRCL << 24) | 0x000000;
+
+    if (alpha != 0) {
+
+	/**
+	 * Multiply alpha with bitmap [0,1].
+	 * Kill fragment if alpha == 0.
+	 */
+
+	meta->regAsat = (HC_SubA_HTXnTBLAsat << 24) |
+	    HC_HTXnTBLAsat_MASK |
+	    HC_HTXnTBLAa_TOPA |
+	    HC_HTXnTBLAa_HTXnTBLRA |
+	    HC_HTXnTBLAb_TOPA |
+	    HC_HTXnTBLAb_Atex | HC_HTXnTBLAc_TOPA | HC_HTXnTBLAc_HTXnTBLRA;
+	meta->regTRAH = (HC_SubA_HTXnTRAH << 24) |
+	    (0x00 << HC_HTXnTRAH_SHIFT) |
+	    (0x00 << HC_HTXnTRAL_SHIFT);
+    } else {
+
+	/**
+	 * Calculate alpha = (1 - bitmap [0,1]).
+	 * Kill fragment if alpha != 0.
+	 */
+
+	meta->regAsat = (HC_SubA_HTXnTBLAsat << 24) |
+	    HC_HTXnTBLAsat_MASK |
+	    HC_HTXnTBLAa_InvTOPA |
+	    HC_HTXnTBLAa_HTXnTBLRA |
+	    HC_HTXnTBLAb_InvTOPA |
+	    HC_HTXnTBLAb_Atex | HC_HTXnTBLAc_TOPA | HC_HTXnTBLAc_HTXnTBLRA;
+	meta->regTRAH = (HC_SubA_HTXnTRAH << 24) |
+	    (0xFF << HC_HTXnTRAH_SHIFT) |
+	    (0x01 << HC_HTXnTRAL_SHIFT);
+    }
+}
+
+
 void
 via_meta_install_src(struct via_context *vmesa,
 		     uint32_t scale_rgba, uint32_t bias_rgba,
 		     uint32_t srcFmt, float scaleX, float scaleY,
 		     uint32_t width, uint32_t height,
 		     uint32_t stride, uint32_t src_offset,
-		     GLboolean flip_src, struct _WsbmBufferObject *buf)
+		     GLboolean flip_src, GLboolean bitmap,
+		     struct _WsbmBufferObject *buf)
 {
     struct via_meta_state *meta = &vmesa->meta;
     uint32_t log2Tmp;
@@ -143,31 +233,41 @@ via_meta_install_src(struct via_context *vmesa,
      * Ashift = 0
      */
 
-    meta->regCsat = (HC_SubA_HTXnTBLCsat << 24) |
-	HC_HTXnTBLCsat_MASK |
-	HC_HTXnTBLCa_TOPC |
-	HC_HTXnTBLCa_HTXnTBLRC |
-	HC_HTXnTBLCb_TOPC |
-	HC_HTXnTBLCb_Tex | HC_HTXnTBLCc_TOPC | HC_HTXnTBLCc_0;
-    meta->regCop = (HC_SubA_HTXnTBLCop << 24) |
-	HC_HTXnTBLCop_Add |
-	HC_HTXnTBLCbias_Cbias |
-	HC_HTXnTBLCbias_HTXnTBLRC |
-	HC_HTXnTBLCshift_No |
-	HC_HTXnTBLAop_Add |
-	HC_HTXnTBLAbias_HTXnTBLRAbias | HC_HTXnTBLAshift_No;
-    meta->regAsat = (HC_SubA_HTXnTBLAsat << 24) |
+    if (!bitmap) {
+	meta->regCsat = (HC_SubA_HTXnTBLCsat << 24) |
+	    HC_HTXnTBLCsat_MASK |
+	    HC_HTXnTBLCa_TOPC |
+	    HC_HTXnTBLCa_HTXnTBLRC |
+	    HC_HTXnTBLCb_TOPC |
+	    HC_HTXnTBLCb_Tex | HC_HTXnTBLCc_TOPC | HC_HTXnTBLCc_0;
+	meta->regCop = (HC_SubA_HTXnTBLCop << 24) |
+	    HC_HTXnTBLCop_Add |
+	    HC_HTXnTBLCbias_Cbias |
+	    HC_HTXnTBLCbias_HTXnTBLRC |
+	    HC_HTXnTBLCshift_No |
+	    HC_HTXnTBLAop_Add |
+	    HC_HTXnTBLAbias_HTXnTBLRAbias | HC_HTXnTBLAshift_No;
+	meta->regAsat = (HC_SubA_HTXnTBLAsat << 24) |
 	HC_HTXnTBLAsat_MASK |
-	HC_HTXnTBLAa_TOPA |
-	HC_HTXnTBLAa_HTXnTBLRA |
+	    HC_HTXnTBLAa_TOPA |
+	    HC_HTXnTBLAa_HTXnTBLRA |
 	HC_HTXnTBLAb_TOPA |
-	HC_HTXnTBLAb_Atex | HC_HTXnTBLAc_TOPA | HC_HTXnTBLAc_HTXnTBLRA;
-    meta->regCa = (HC_SubA_HTXnTBLRCa << 24) | (scale_rgba >> 8);
-    meta->regCbias = (HC_SubA_HTXnTBLRCbias << 24) | (bias_rgba >> 8);
-    meta->regAa = (HC_SubA_HTXnTBLRAa << 24) | ((scale_rgba & 0xFF) << 16);
-    meta->regAfog = (HC_SubA_HTXnTBLRFog << 24) | (bias_rgba & 0xFF);
-    meta->regL0Pit = (HC_SubA_HTXnL0Pit << 24) |
-	HC_HTXnEnPit_MASK | (stride & HC_HTXnLnPit_MASK);
+	    HC_HTXnTBLAb_Atex | HC_HTXnTBLAc_TOPA | HC_HTXnTBLAc_HTXnTBLRA;
+	meta->regCa = (HC_SubA_HTXnTBLRCa << 24) | (scale_rgba >> 8);
+	meta->regCbias = (HC_SubA_HTXnTBLRCbias << 24) | (bias_rgba >> 8);
+	meta->regAa = (HC_SubA_HTXnTBLRAa << 24) | ((scale_rgba & 0xFF) << 16);
+	meta->regAfog = (HC_SubA_HTXnTBLRFog << 24) | (bias_rgba & 0xFF);
+    } else
+	via_meta_bitmap_state(vmesa);
+
+    meta->bitMap = bitmap;
+
+    if (stride == 8)
+	meta->regL0Pit = (HC_SubA_HTXnL0Pit << 24) | (3 << 20);
+    else
+	meta->regL0Pit = (HC_SubA_HTXnL0Pit << 24) |
+	    HC_HTXnEnPit_MASK | (stride & HC_HTXnLnPit_MASK);
+
     meta->regL0Os = (HC_SubA_HTXnL0OS << 24) | 0;
     meta->regTB = (HC_SubA_HTXnTB << 24) |
 	HC_HTXnTB_NoTB |
@@ -436,19 +536,26 @@ via_meta_emit_src_clip(struct via_context *vmesa,
     float x1 = (float)dx + (s1 - sOrig) * meta->sToX + meta->xoff;
     float y0 = (float)dy + (t0 - tOrig) * meta->tToY;
     float y1 = (float)dy + (t1 - tOrig) * meta->tToY;
-    uint32_t fog = via_meta_compute_fog(vmesa->glCtx);
+    uint32_t fog = 0;
     uint32_t uiz = via_fui(z);
+    uint32_t uiw = via_fui(1.f);
     uint32_t *vb;
+    GLcontext * ctx = vmesa->glCtx;
+    int hasFog;
 
-    /*
-     * Backface is clockwise?
+    /**
+     * W is needed to get texturing right. Not sure why...
      */
 
     VIA_FINISH_PRIM(vmesa);
-
     vmesa->regCmdB &= ~(HC_HBFace_MASK | HC_HVPMSK_MASK);
     vmesa->regCmdB |= HC_HVPMSK_X | HC_HVPMSK_Y | HC_HVPMSK_Z |
-	HC_HVPMSK_Cs | HC_HVPMSK_S | HC_HVPMSK_T;
+	HC_HVPMSK_W | HC_HVPMSK_S | HC_HVPMSK_T;
+
+    if ((hasFog = ctx->Fog.Enabled)) {
+	fog = via_meta_compute_fog(ctx);
+	vmesa->regCmdB |= HC_HVPMSK_Cs;
+    }
 
     viaRasterPrimitive(vmesa->glCtx, GL_TRIANGLE_STRIP, GL_TRIANGLE_STRIP);
 
@@ -462,33 +569,41 @@ via_meta_emit_src_clip(struct via_context *vmesa,
 	t1 = meta->maxT - t1;
     }
 
-    vb = viaExtendPrimitive(vmesa, 6 * 4 * sizeof(uint32_t));
+    vb = viaExtendPrimitive(vmesa, (hasFog ? 7 : 6) * 4 * sizeof(uint32_t));
 
     *vb++ = via_fui(x0);
     *vb++ = via_fui(y1);
     *vb++ = uiz;
-    *vb++ = fog;
+    *vb++ = uiw;
+    if (hasFog)
+	*vb++ = fog;
     *vb++ = via_fui(s0);
     *vb++ = via_fui(t1);
 
     *vb++ = via_fui(x1);
     *vb++ = via_fui(y1);
     *vb++ = uiz;
-    *vb++ = fog;
+    *vb++ = uiw;
+    if (hasFog)
+	*vb++ = fog;
     *vb++ = via_fui(s1);
     *vb++ = via_fui(t1);
 
     *vb++ = via_fui(x0);
     *vb++ = via_fui(y0);
     *vb++ = uiz;
-    *vb++ = fog;
+    *vb++ = uiw;
+    if (hasFog)
+	*vb++ = fog;
     *vb++ = via_fui(s0);
     *vb++ = via_fui(t0);
 
     *vb++ = via_fui(x1);
     *vb++ = via_fui(y0);
     *vb++ = uiz;
-    *vb++ = fog;
+    *vb++ = uiw;
+    if (hasFog)
+	*vb++ = fog;
     *vb++ = via_fui(s1);
     *vb++ = via_fui(t0);
 
diff --git a/src/mesa/drivers/dri/openchrome/via_pixel.c b/src/mesa/drivers/dri/openchrome/via_pixel.c
index 7e6161f..81588a6 100644
--- a/src/mesa/drivers/dri/openchrome/via_pixel.c
+++ b/src/mesa/drivers/dri/openchrome/via_pixel.c
@@ -32,6 +32,7 @@
 
 #include "main/image.h"
 #include "main/state.h"
+#include "main/macros.h"
 #include "swrast/swrast.h"
 
 #include "via_pixel.h"
@@ -39,7 +40,15 @@
 #include "via_ioctl.h"
 #include "via_buffer_objects.h"
 
-#include "wsbm_manager.h"
+#include <wsbm_manager.h>
+#include <via_3d_reg.h>
+
+static uint32_t via_tex_stride(uint32_t stride)
+{
+    if (stride <= 8)
+	return 8;
+    return (stride + 0x0f) & ~0x0f;
+}
 
 static GLboolean
 via_check_copypixel_blit_fragment_ops(GLcontext * ctx)
@@ -439,7 +448,8 @@ via_read_pixels(GLcontext * ctx,
 			 1.0f, 1.0f,
 			 readableWidth, vfb->Base.Height,
 			 read_buf->pitch, src_offset,
-			 (vfb->Base.Name == 0), read_buf->buf);
+			 (vfb->Base.Name == 0),
+			 GL_FALSE, read_buf->buf);
 
     vmesa->clearTexCache = 1;
     via_meta_install_dst_bufobj(vmesa, dst_fmt, stride, height, dst_offset,
@@ -515,7 +525,8 @@ via_draw_pixels(GLcontext * ctx,
     struct drm_via_clip_rect clip;
     struct via_renderbuffer *draw_buf = viaDrawRenderBuffer(vmesa);
 
-    if (!draw_buf)
+    if (!draw_buf || draw_buf->hwformat == VIA_FMT_ERROR ||
+	vmesa->Fallback & VIA_FALLBACK_USER_DISABLE)
 	goto out_sw;
 
     if (!via_check_fragment_ops(ctx) ||
@@ -532,7 +543,7 @@ via_draw_pixels(GLcontext * ctx,
     stride = (stride + unpack->Alignment - 1) & ~(unpack->Alignment - 1);
 
     if (src) {
-	if (stride & 0x0f)
+	if (stride & 0x07)
 	    goto out_sw;
 
 	src_offset = (unsigned long)_mesa_image_address(2, unpack, pixels,
@@ -547,13 +558,13 @@ via_draw_pixels(GLcontext * ctx,
 	const unsigned char *tmp_pixels;
 	int col;
 	uint32_t data_stride = width * cpp;
-	uint32_t new_stride = (data_stride + 0x0f) & ~0x0f;
+	int32_t new_stride = via_tex_stride(data_stride);
 
 	/*
 	 * Pipelined drawpixels from system memory.
 	 */
 
-	ret = wsbmGenBuffers(vmesa->viaScreen->bufferPool,
+	ret = wsbmGenBuffers(vmesa->viaScreen->scratchPool,
 			     1, &buf, 0, VIA_PL_FLAG_AGP);
 	if (ret)
 	    goto out_sw;
@@ -575,7 +586,7 @@ via_draw_pixels(GLcontext * ctx,
 					 width, height,
 					 format, type, 0, 0, 0);
 	if (unpack->Invert)
-	    data_stride -= data_stride;
+	    stride = -stride;
 
 	savemap = map;
 	for (col = 0; col < height; ++col) {
@@ -592,7 +603,8 @@ via_draw_pixels(GLcontext * ctx,
 
     via_meta_install_src(vmesa, scale_rgba, bias_rgba, src_fmt,
 			 ctx->Pixel.ZoomX, ctx->Pixel.ZoomY, width, height,
-			 stride, src_offset, GL_FALSE, buf);
+			 stride, src_offset, GL_FALSE,
+			 GL_FALSE, buf);
     via_meta_install_dst_fb(vmesa);
 
     vmesa->clearTexCache = 1;
@@ -619,6 +631,130 @@ via_draw_pixels(GLcontext * ctx,
 }
 
 static void
+via_bitmap(GLcontext * ctx,
+	   GLint x, GLint y,
+	   GLsizei width, GLsizei height,
+	   const struct gl_pixelstore_attrib *unpack,
+	   const GLubyte * pixels)
+{
+    uint32_t scale_rgba = 0xff;
+    uint32_t bias_rgba = 0x00;
+    uint32_t src_fmt;
+    struct via_buffer_object *src = via_buffer_object(unpack->BufferObj);
+    struct _WsbmBufferObject *buf = NULL;
+    struct via_context *vmesa = VIA_CONTEXT(ctx);
+    int stride;
+    uint32_t src_offset;
+    struct drm_via_clip_rect clip;
+    struct via_renderbuffer *draw_buf = viaDrawRenderBuffer(vmesa);
+
+    if (width == 0 || height == 0)
+	return;
+
+    if (!draw_buf || draw_buf->hwformat == VIA_FMT_ERROR ||
+	vmesa->Fallback & VIA_FALLBACK_USER_DISABLE)
+	goto out_sw;
+
+    if (!via_check_fragment_ops(ctx)) {
+	goto out_sw;
+    }
+
+    src_fmt = HC_HTXnFM_A1;
+
+    if (!unpack->LsbFirst)
+	src_fmt |= 0x4000;
+
+    stride = (((unpack->RowLength > 0) ? unpack->RowLength : width) + 7) >> 3;
+    stride = (stride + unpack->Alignment - 1) & ~(unpack->Alignment - 1);
+
+    if (src) {
+	if (stride & 0x07)
+	    goto out_sw;
+
+	src_offset = (unsigned long)_mesa_image_address2d(unpack, pixels,
+							  width, height,
+							  GL_COLOR_INDEX,
+							  GL_BITMAP, 0, 0);
+
+	buf = wsbmBOReference(via_bufferobj_buffer(src));
+    } else if (!src) {
+	int ret;
+	unsigned char *map, *savemap;
+	const unsigned char *tmp_pixels;
+	int col;
+	uint32_t data_len;
+	uint32_t new_stride = (width + 7) >> 3;
+
+	new_stride = via_tex_stride(new_stride);
+
+	/*
+	 * Pipelined drawpixels from system memory.
+	 */
+
+	ret = wsbmGenBuffers(vmesa->viaScreen->scratchPool,
+			     1, &buf, 0,
+			     WSBM_PL_FLAG_VRAM |
+			     WSBM_PL_FLAG_WC);
+	if (ret)
+	    goto out_sw;
+
+	ret = wsbmBOData(buf, new_stride * height, NULL, NULL, 0);
+	if (ret)
+	    goto out_sw;
+
+	map = wsbmBOMap(buf, WSBM_ACCESS_WRITE);
+	if (!map)
+	    goto out_sw;
+
+	data_len = (width + 7) >> 3;
+	tmp_pixels = _mesa_image_address2d(unpack, pixels,
+					   width, height,
+					   GL_COLOR_INDEX, GL_BITMAP, 0, 0);
+	if (unpack->Invert)
+	    stride = -stride;
+
+	savemap = map;
+	for (col = 0; col < height; ++col) {
+	    memcpy(map, tmp_pixels, data_len);
+	    map += new_stride;
+	    tmp_pixels += stride;
+	}
+
+	wsbmBOUnmap(buf);
+
+	src_offset = 0;
+	stride = new_stride;
+    }
+
+    via_meta_install_src(vmesa, scale_rgba, bias_rgba, src_fmt,
+			 1.f, 1.f, width, height,
+			 stride, src_offset, GL_FALSE,
+			 GL_TRUE, buf);
+    via_meta_install_dst_fb(vmesa);
+
+    vmesa->clearTexCache = 1;
+
+    clip.x1 = 0;
+    clip.x2 = width;
+    clip.y1 = 0;
+    clip.y2 = height;
+
+    via_meta_emit_src_clip(vmesa, 0, 0,
+			   x, y, &clip, ctx->Current.RasterPos[2]);
+
+    via_meta_uninstall(vmesa);
+    vmesa->clearTexCache = 1;
+    wsbmBOUnreference(&buf);
+
+    return;
+  out_sw:
+    wsbmBOUnreference(&buf);
+    _swrast_Bitmap(ctx, x, y, width, height, unpack, pixels);
+
+    return;
+}
+
+static void
 via_copy_pixels(GLcontext * ctx,
 		GLint srcx, GLint srcy,
 		GLsizei width, GLsizei height,
@@ -635,7 +771,7 @@ void
 viaInitPixelFuncs(struct dd_function_table *functions)
 {
     functions->Accum = _swrast_Accum;
-    functions->Bitmap = _swrast_Bitmap;
+    functions->Bitmap = via_bitmap;
     functions->CopyPixels = via_copy_pixels;
     functions->ReadPixels = via_read_pixels;
     functions->DrawPixels = via_draw_pixels;
diff --git a/src/mesa/drivers/dri/openchrome/via_screen.c b/src/mesa/drivers/dri/openchrome/via_screen.c
index cce5198..dc8bfe5 100644
--- a/src/mesa/drivers/dri/openchrome/via_screen.c
+++ b/src/mesa/drivers/dri/openchrome/via_screen.c
@@ -167,11 +167,31 @@ viaInitDriver(__DRIscreenPrivate * sPriv)
 	goto out_err2;
     }
 
+    viaScreen->slabCache = wsbmSlabCacheInit(100, 200);
+    if (!viaScreen->slabCache) {
+	_mesa_printf("VIA slab cache creation failed.\n");
+	goto out_err2;
+    }
+
     viaScreen->bufferPool = wsbmTTMPoolInit(sPriv->fd,
 					    ext_arg.rep.driver_ioctl_offset);
     if (!viaScreen->bufferPool) {
 	_mesa_printf("VIA buffer manager creation failed.\n");
-	goto out_err2;
+	goto out_err3;
+    }
+
+    viaScreen->scratchPool = wsbmSlabPoolInit(sPriv->fd,
+					      ext_arg.rep.driver_ioctl_offset,
+					      WSBM_PL_FLAG_VRAM |
+					      WSBM_PL_FLAG_WC,
+					      WSBM_PL_FLAG_VRAM |
+					      WSBM_PL_FLAG_WC,
+					      64, 8, 128, 16384, 0,
+					      viaScreen->slabCache);
+
+    if (!viaScreen->scratchPool) {
+	_mesa_printf("VIA scratch buffer manager creation failed.\n");
+	goto out_err4;
     }
 
     strncpy(ext_arg.extension, exec_ext, sizeof(ext_arg.extension));
@@ -179,7 +199,7 @@ viaInitDriver(__DRIscreenPrivate * sPriv)
 			      sizeof(ext_arg));
     if (ret != 0 || !ext_arg.rep.exists) {
 	_mesa_printf("Could not detect DRM extension \"%s\".\n", exec_ext);
-	goto out_err3;
+	goto out_err5;
     }
     viaScreen->execIoctlOffset = ext_arg.rep.driver_ioctl_offset;
 
@@ -192,7 +212,7 @@ viaInitDriver(__DRIscreenPrivate * sPriv)
     if (!viaCreateDummyHWContext(sPriv, &viaScreen->dummyContextID,
 				 &viaScreen->dummyContext)) {
 	_mesa_printf("Could not create dummy screen context.\n");
-	goto out_err3;
+	goto out_err5;
     }
 #endif
     if (VIA_DEBUG & DEBUG_DRI) {
@@ -216,7 +236,7 @@ viaInitDriver(__DRIscreenPrivate * sPriv)
 			      sizeof(ext_arg));
     if (ret != 0 || !ext_arg.rep.exists) {
 	_mesa_printf("Could not detect DRM extension \"%s\".\n", fence_ext);
-	goto out_err4;
+	goto out_err6;
     }
 
     viaScreen->fence_mgr = wsbmFenceMgrTTMInit(sPriv->fd, 5,
@@ -225,7 +245,7 @@ viaInitDriver(__DRIscreenPrivate * sPriv)
 
     if (!viaScreen->fence_mgr) {
 	_mesa_printf("VIA fence manager creation failed.\n");
-	goto out_err4;
+	goto out_err6;
     }
 
     i = 0;
@@ -240,10 +260,14 @@ viaInitDriver(__DRIscreenPrivate * sPriv)
     sPriv->extensions = viaScreen->extensions;
 
     return GL_TRUE;
-  out_err4:
+  out_err6:
     //    viaDestroyDummyHWContext(sPriv, viaScreen->dummyContextID);
-  out_err3:
+ out_err5:
+    viaScreen->scratchPool->takeDown(viaScreen->scratchPool);
+  out_err4:
     viaScreen->bufferPool->takeDown(viaScreen->bufferPool);
+ out_err3:
+    wsbmSlabCacheFinish(viaScreen->slabCache);
   out_err2:
     viaScreen->mallocPool->takeDown(viaScreen->mallocPool);
   out_err1:
@@ -261,10 +285,11 @@ viaDestroyScreen(__DRIscreenPrivate * sPriv)
 {
     viaScreenPrivate *viaScreen = (viaScreenPrivate *) sPriv->private;
 
-
+    viaScreen->scratchPool->takeDown(viaScreen->scratchPool);
     wsbmFenceMgrTTMTakedown(viaScreen->fence_mgr);
     //    viaDestroyDummyHWContext(sPriv, viaScreen->dummyContextID);
     viaScreen->bufferPool->takeDown(viaScreen->bufferPool);
+    wsbmSlabCacheFinish(viaScreen->slabCache);
     viaScreen->mallocPool->takeDown(viaScreen->mallocPool);
     driDestroyOptionCache(&viaScreen->parsedCache);
     driDestroyOptionInfo(&viaScreen->optionCache);
diff --git a/src/mesa/drivers/dri/openchrome/via_screen.h b/src/mesa/drivers/dri/openchrome/via_screen.h
index a1284de..a3578ca 100644
--- a/src/mesa/drivers/dri/openchrome/via_screen.h
+++ b/src/mesa/drivers/dri/openchrome/via_screen.h
@@ -65,6 +65,8 @@ typedef struct _viaScreenPrivate
 
     struct _WsbmBufferPool *mallocPool;
     struct _WsbmBufferPool *bufferPool;
+    struct _WsbmBufferPool *scratchPool;
+    struct _WsbmSlabCache *slabCache;
 
     /* Dummy hw context */
 #if 0
diff --git a/src/mesa/drivers/dri/openchrome/via_state.c b/src/mesa/drivers/dri/openchrome/via_state.c
index af2f127..01ce658 100644
--- a/src/mesa/drivers/dri/openchrome/via_state.c
+++ b/src/mesa/drivers/dri/openchrome/via_state.c
@@ -99,9 +99,9 @@ viaDoEmitMeta(struct via_context *vmesa, GLint lostState)
     OUT_RING(HC_HEADER2);
     OUT_RING(HC_ParaType_NotTex << 16);
     OUT_RING((HC_SubA_HEnable << 24) | meta->regEnable);
-    OUT_RING((HC_SubA_HEnable << 24) | meta->regEnable);
     OUT_RING((HC_SubA_HFBBMSKL << 24) | 0x00FFFFFF);
     OUT_RING((HC_SubA_HROP << 24) | HC_HROP_P | 0x000000FF);
+    OUT_RING(0xCCCCCCCC);
     ADVANCE_RING();
 
     BEGIN_STATE_RING(4, lostState);
@@ -118,7 +118,8 @@ viaDoEmitMeta(struct via_context *vmesa, GLint lostState)
     }
     ADVANCE_RING();
 
-    BEGIN_STATE_RING(13, lostState);
+
+    BEGIN_STATE_RING(meta->bitMap ? 18 : 14, lostState);
     OUT_RING(HC_HEADER2);
     OUT_RING((HC_ParaType_Tex << 16) | (0 << 24));
     OUT_RING(meta->regCsat);
@@ -132,6 +133,13 @@ viaDoEmitMeta(struct via_context *vmesa, GLint lostState)
     OUT_RING(meta->regL0_5WE);
     OUT_RING(meta->regL0_5HE);
     OUT_RING(meta->regL0Os);
+    OUT_RING(meta->regTB);
+    if (meta->bitMap) {
+	OUT_RING(meta->regTRCH);
+	OUT_RING(meta->regTRCL);
+	OUT_RING(meta->regTRAH);
+	OUT_RING(meta->regTRAH);
+    }
     ADVANCE_RING();
 
     BEGIN_RING(8);
@@ -151,8 +159,8 @@ viaDoEmitMeta(struct via_context *vmesa, GLint lostState)
 			     0,
 			     meta->regTexFM,
 			     WSBM_PL_FLAG_TT |
-			     VIA_PL_FLAG_AGP |
 			     WSBM_PL_FLAG_VRAM |
+			     VIA_PL_FLAG_AGP |
 			     VIA_ACCESS_READ,
 			     WSBM_PL_MASK_MEM | VIA_ACCESS_READ);
 
diff --git a/src/mesa/drivers/dri/openchrome/via_teximage_accel.c b/src/mesa/drivers/dri/openchrome/via_teximage_accel.c
index 4a3edb7..2b568ab 100644
--- a/src/mesa/drivers/dri/openchrome/via_teximage_accel.c
+++ b/src/mesa/drivers/dri/openchrome/via_teximage_accel.c
@@ -80,7 +80,8 @@ via_generate_one_mipmap(GLcontext * ctx,
 
     via_meta_install_src(vmesa, 0xFFFFFFFF, 0x00000000, src_fmt,
 			 xFactor, yFactor, srcImage->Width,
-			 srcImage->Height, src_stride, 0, GL_FALSE, src->buf);
+			 srcImage->Height, src_stride, 0, GL_FALSE,
+			 GL_FALSE,src->buf);
 
     clip.x1 = 0;
     clip.x2 = dstImage->Width;
@@ -161,7 +162,7 @@ via_try_3d_upload(GLcontext * ctx,
     via_meta_install_src(vmesa, scale_rgba, bias_rgba, src_fmt,
 			 1.0f, 1.0f, width, height,
 			 src_stride, src_offset,
-			 GL_FALSE, via_bufferobj_buffer(src));
+			 GL_FALSE, GL_FALSE, via_bufferobj_buffer(src));
 
     clip.x1 = 0;
     clip.x2 = width;
@@ -241,7 +242,8 @@ via_try_3d_download(GLcontext * ctx,
 
     via_meta_install_src(vmesa, scale_rgba, bias_rgba, src_fmt,
 			 1.0f, 1.0f, width, height,
-			 src_stride, 0, GL_FALSE, viaImage->buf);
+			 src_stride, 0, GL_FALSE, GL_FALSE,
+			 viaImage->buf);
 
     dst_xoff = (dst_offset & 0x0f) / cpp;
     dst_offset &= ~0x0f;
@@ -334,7 +336,8 @@ via_try_3d_copy(GLcontext * ctx,
 			 1.0f, 1.0f,
 			 readableWidth, vfb->Base.Height,
 			 read_buf->pitch, src_offset,
-			 (vfb->Base.Name == 0), read_buf->buf);
+			 (vfb->Base.Name == 0),
+			 GL_FALSE, read_buf->buf);
 
     clip.x1 = 0;
     clip.x2 = width;




More information about the mesa-commit mailing list