X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fmesa%2Fdrivers%2Fdri%2Funichrome%2Fvia_span.c;h=b908f0fb23a93a774c8d491d4be74471cb6750c2;hb=726a04a2cd1bf159a6c40584b4b2b9bc5948a82e;hp=fb5a82a797a4f82995f6f4eb143ef6f11cd826e1;hpb=f18598cbd2802e61c2cbb1d610630da9b5951169;p=mesa.git diff --git a/src/mesa/drivers/dri/unichrome/via_span.c b/src/mesa/drivers/dri/unichrome/via_span.c index fb5a82a797a..b908f0fb23a 100644 --- a/src/mesa/drivers/dri/unichrome/via_span.c +++ b/src/mesa/drivers/dri/unichrome/via_span.c @@ -22,389 +22,179 @@ * DEALINGS IN THE SOFTWARE. */ -#include "glheader.h" -#include "macros.h" -#include "mtypes.h" -#include "colormac.h" +#include "main/glheader.h" +#include "main/macros.h" +#include "main/mtypes.h" +#include "main/colormac.h" #include "via_context.h" #include "via_span.h" #include "via_ioctl.h" #include "swrast/swrast.h" #define DBG 0 -#if 0 -#define LOCAL_VARS \ - viaContextPtr vmesa = VIA_CONTEXT(ctx); \ - __DRIdrawablePrivate *dPriv = vmesa->driDrawable; \ - viaScreenPrivate *viaScreen = vmesa->viaScreen; \ - GLuint pitch = vmesa->drawPitch; \ - GLuint height = dPriv->h; \ - GLushort p; \ - char *buf = (char *)(vmesa->drawMap + \ - dPriv->x * viaScreen->bytesPerPixel + \ - dPriv->y * pitch); \ - char *read_buf = (char *)(vmesa->readMap + \ - dPriv->x * viaScreen->bytesPerPixel + \ - dPriv->y * pitch); \ - (void)read_buf; (void)buf; (void)p -#endif - -#define LOCAL_DEPTH_VARS \ - viaContextPtr vmesa = VIA_CONTEXT(ctx); \ - __DRIdrawablePrivate *dPriv = vmesa->driDrawable; \ - viaScreenPrivate *viaScreen = vmesa->viaScreen; \ - GLuint pitch = viaScreen->backPitch; \ - GLuint height = dPriv->h; \ - char *buf = (char *)(vmesa->depth.map + \ - dPriv->x * 2 + \ - dPriv->y * pitch) - -#define CLIPPIXEL(_x,_y) (_x >= minx && _x < maxx && \ - _y >= miny && _y < maxy) - - -#define CLIPSPAN(_x, _y, _n, _x1, _n1, _i) \ - if (_y < miny || _y >= maxy) { \ - _n1 = 0, _x1 = x; \ - } \ - else { \ - _n1 = _n; \ - _x1 = _x; \ - if (_x1 < minx) _i += (minx -_x1), n1 -= (minx -_x1), _x1 = minx; \ - if (_x1 + _n1 >= maxx) n1 -= (_x1 + n1 - maxx); \ - } #define Y_FLIP(_y) (height - _y - 1) -#define HW_LOCK() \ - viaContextPtr vmesa = VIA_CONTEXT(ctx); \ - LOCK_HARDWARE_QUIESCENT(vmesa); - -/*=* [DBG] csmash saam : bitmap option menu can't be drawn in saam *=*/ -/*#define HW_CLIPLOOP() \ - do { \ - __DRIdrawablePrivate *dPriv = vmesa->driDrawable; \ - int _nc = dPriv->numClipRects; \ - while (_nc--) { \ - int minx = dPriv->pClipRects[_nc].x1 - dPriv->x; \ - int miny = dPriv->pClipRects[_nc].y1 - dPriv->y; \ - int maxx = dPriv->pClipRects[_nc].x2 - dPriv->x; \ - int maxy = dPriv->pClipRects[_nc].y2 - dPriv->y;*/ -#define HW_CLIPLOOP() \ - do { \ - __DRIdrawablePrivate *dPriv = vmesa->driDrawable; \ - int _nc = dPriv->numClipRects; \ - GLuint scrn = vmesa->saam & S_MASK; \ - if(scrn == S1) _nc = 1; \ - while (_nc--) { \ - int minx; \ - int miny; \ - int maxx; \ - int maxy; \ - if (!vmesa->saam) { \ - minx = dPriv->pClipRects[_nc].x1 - dPriv->x; \ - miny = dPriv->pClipRects[_nc].y1 - dPriv->y; \ - maxx = dPriv->pClipRects[_nc].x2 - dPriv->x; \ - maxy = dPriv->pClipRects[_nc].y2 - dPriv->y; \ - } \ - else { \ - minx = -10000; \ - miny = -10000; \ - maxx = 10000; \ - maxy = 10000; \ - } - - /*else if (scrn == S0) { \ - minx = dPriv->pClipRects[_nc].x1 - dPriv->x; \ - miny = dPriv->pClipRects[_nc].y1 - dPriv->y; \ - maxx = dPriv->pClipRects[_nc].x2 - dPriv->x; \ - maxy = dPriv->pClipRects[_nc].y2 - dPriv->y; \ - } \ - else if (scrn == S1) { \ - drm_clip_rect_t *b = vmesa->sarea->boxes; \ - minx = b->x1; \ - miny = b->y1; \ - maxx = b->x2; \ - maxy = b->y2; \ - } \ - else { \ - drm_clip_rect_t *b = vmesa->sarea->boxes + vmesa->numClipRects;\ - minx = b->x1; \ - miny = b->y1; \ - maxx = b->x2; \ - maxy = b->y2; \ - }*/ - -#define HW_ENDCLIPLOOP() \ - } \ - } while (0) - -#define HW_UNLOCK() \ - UNLOCK_HARDWARE(vmesa); - - -/* 16 bit, 565 rgb color spanline and pixel functions - */ -/*=* [DBG] csmash : fix options worng position *=*/ -/*#define LOCAL_VARS \ - __DRIdrawablePrivate *dPriv = vmesa->driDrawable; \ - GLuint pitch = vmesa->drawPitch; \ - GLuint height = dPriv->h; \ - GLushort p; \ - char *buf = (char *)(vmesa->drawMap + \ - dPriv->x * 2 + \ - dPriv->y * pitch); \ - char *read_buf = (char *)(vmesa->readMap + \ - dPriv->x * 2 + \ - dPriv->y * pitch); \ - (void)read_buf; (void)buf; (void)p*/ - -#define LOCAL_VARS \ - __DRIdrawablePrivate *dPriv = vmesa->driDrawable; \ - GLuint pitch = vmesa->drawPitch; \ - GLuint height = dPriv->h; \ - GLushort p; \ - char *buf, *read_buf; \ - p = 0; \ - if (vmesa->glCtx->Color._DrawDestMask & BACK_LEFT_BIT) { \ - buf = (char *)(vmesa->drawMap); \ - read_buf = (char *)(vmesa->readMap); \ - } \ - else { \ - buf = (char *)(vmesa->drawMap + \ - dPriv->x * 2 + \ - dPriv->y * pitch); \ - read_buf = (char *)(vmesa->readMap + \ - dPriv->x * 2 + \ - dPriv->y * pitch); \ - } - -#define INIT_MONO_PIXEL(p, color) \ - p = PACK_COLOR_565(color[0], color[1], color[2]) - -#define WRITE_RGBA(_x, _y, r, g, b, a) \ - *(GLushort *)(buf + _x * 2 + _y * pitch) = ((((int)r & 0xf8) << 8) | \ - (((int)g & 0xfc) << 3) | \ - (((int)b & 0xf8) >> 3)) - -#define WRITE_PIXEL(_x, _y, p) \ - *(GLushort *)(buf + _x * 2 + _y * pitch) = p - -#define READ_RGBA(rgba, _x, _y) \ - do { \ - GLushort p = *(GLushort *)(read_buf + _x * 2 + _y * pitch); \ - rgba[0] = ((p >> 8) & 0xf8) * 255 / 0xf8; \ - rgba[1] = ((p >> 3) & 0xfc) * 255 / 0xfc; \ - rgba[2] = ((p << 3) & 0xf8) * 255 / 0xf8; \ - rgba[3] = 255; \ - } while (0) - -#define TAG(x) via##x##_565 -#include "spantmp.h" - -/* 32 bit, 8888 argb color spanline and pixel functions - */ +#define HW_LOCK() + +#define HW_UNLOCK() + #undef LOCAL_VARS -#undef LOCAL_DEPTH_VARS - -/*=* [DBG] csmash : fix options worng position *=*/ -/*#define LOCAL_VARS \ - viaContextPtr vmesa = VIA_CONTEXT(ctx); \ - __DRIdrawablePrivate *dPriv = vmesa->driDrawable; \ - GLuint pitch = vmesa->drawPitch; \ - GLuint height = dPriv->h; \ - GLuint p; \ - char *buf = (char *)(vmesa->drawMap + \ - dPriv->x * 4 + \ - dPriv->y * pitch); \ - char *read_buf = (char *)(vmesa->readMap + \ - dPriv->x * 4 + \ - dPriv->y * pitch); \ - (void)read_buf; (void)buf; (void)p*/ #define LOCAL_VARS \ - viaContextPtr vmesa = VIA_CONTEXT(ctx); \ - __DRIdrawablePrivate *dPriv = vmesa->driDrawable; \ - GLuint pitch = vmesa->drawPitch; \ + struct via_renderbuffer *vrb = (struct via_renderbuffer *) rb; \ + __DRIdrawablePrivate *dPriv = vrb->dPriv; \ + GLuint pitch = vrb->pitch; \ GLuint height = dPriv->h; \ - GLuint p; \ - char *buf, *read_buf; \ - p = 0; \ - if (vmesa->glCtx->Color._DrawDestMask & BACK_LEFT_BIT) { \ - buf = (char *)(vmesa->drawMap); \ - read_buf = (char *)(vmesa->readMap); \ - } \ - else { \ - buf = (char *)(vmesa->drawMap + \ - dPriv->x * 4 + \ - dPriv->y * pitch); \ - read_buf = (char *)(vmesa->readMap + \ - dPriv->x * 4 + \ - dPriv->y * pitch); \ - } - - -#undef INIT_MONO_PIXEL -#define INIT_MONO_PIXEL(p, color) \ - p = PACK_COLOR_8888(color[3], color[0], color[1], color[2]) - -#define WRITE_RGBA(_x, _y, r, g, b, a) \ - *(GLuint *)(buf + _x * 4 + _y * pitch) = ((r << 16) | \ - (g << 8) | \ - (b << 0) | \ - (a << 24)); - - -#define WRITE_PIXEL(_x, _y, p) \ - *(GLuint *)(buf + _x * 4 + _y * pitch) = p - -#define READ_RGBA(rgba, _x, _y) \ - do { \ - GLuint p = *(GLuint *)(read_buf + _x * 4 + _y * pitch); \ - rgba[0] = (p >> 16) & 0xff; \ - rgba[1] = (p >> 8) & 0xff; \ - rgba[2] = (p >> 0) & 0xff; \ - rgba[3] = 255; \ - } while (0) - -#define TAG(x) via##x##_8888 -#include "spantmp.h" -/*#include "via_spantmp.h"*/ + GLint p = 0; \ + char *buf = (char *)(vrb->origMap); \ + (void) p; + +/* ================================================================ + * Color buffer + */ + +/* 16 bit, RGB565 color spanline and pixel functions + */ +#define GET_PTR(_x, _y) (buf + (_x) * 2 + (_y) * pitch) +#define SPANTMP_PIXEL_FMT GL_RGB +#define SPANTMP_PIXEL_TYPE GL_UNSIGNED_SHORT_5_6_5 + +#define TAG(x) via##x##_565 +#define TAG2(x,y) via##x##_565##y +#include "spantmp2.h" + + +/* 32 bit, ARGB8888 color spanline and pixel functions + */ +#define GET_PTR(_x, _y) (buf + (_x) * 4 + (_y) * pitch) +#define SPANTMP_PIXEL_FMT GL_BGRA +#define SPANTMP_PIXEL_TYPE GL_UNSIGNED_INT_8_8_8_8_REV + +#define TAG(x) via##x##_8888 +#define TAG2(x,y) via##x##_8888##y +#include "spantmp2.h" + /* 16 bit depthbuffer functions. */ -/*=* John Sheng [2003.6.16] fix exy press 'i' dirty screen *=*/ -/*#define LOCAL_DEPTH_VARS \ - __DRIdrawablePrivate *dPriv = vmesa->driDrawable; \ - GLuint pitch = vmesa->depth.pitch; \ - GLuint height = dPriv->h; \ - char *buf = (char *)(vmesa->depth.map + \ - dPriv->x * 2 + \ - dPriv->y * pitch) */ -#define LOCAL_DEPTH_VARS \ - viaContextPtr vmesa = VIA_CONTEXT(ctx); \ - __DRIdrawablePrivate *dPriv = vmesa->driDrawable; \ - /*viaScreenPrivate *viaScreen = vmesa->viaScreen;*/ \ - GLuint pitch = vmesa->depth.pitch; \ - GLuint height = dPriv->h; \ - char *buf = (char *)(vmesa->depth.map) +#define LOCAL_DEPTH_VARS \ + struct via_renderbuffer *vrb = (struct via_renderbuffer *) rb; \ + __DRIdrawablePrivate *dPriv = vrb->dPriv; \ + GLuint depth_pitch = vrb->pitch; \ + GLuint height = dPriv->h; \ + char *buf = (char *)(vrb->map) +#define LOCAL_STENCIL_VARS LOCAL_DEPTH_VARS + +#define VALUE_TYPE GLushort #define WRITE_DEPTH(_x, _y, d) \ - *(GLushort *)(buf + _x * 2 + _y * pitch) = d; + *(GLushort *)(buf + (_x) * 2 + (_y) * depth_pitch) = d; #define READ_DEPTH(d, _x, _y) \ - d = *(GLushort *)(buf + _x * 2 + _y * pitch); + d = *(volatile GLushort *)(buf + (_x) * 2 + (_y) * depth_pitch); -#define TAG(x) via##x##_16 +#define TAG(x) via##x##_z16 #include "depthtmp.h" /* 32 bit depthbuffer functions. */ +#define VALUE_TYPE GLuint + #define WRITE_DEPTH(_x, _y, d) \ - *(GLuint *)(buf + _x * 4 + _y * pitch) = d; + *(GLuint *)(buf + (_x) * 4 + (_y) * depth_pitch) = d; #define READ_DEPTH(d, _x, _y) \ - d = *(GLuint *)(buf + _x * 4 + _y * pitch); + d = *(volatile GLuint *)(buf + (_x) * 4 + (_y) * depth_pitch); -#define TAG(x) via##x##_32 +#define TAG(x) via##x##_z32 #include "depthtmp.h" -/* 24/8 bit depthbuffer functions. + + +/* 24/8 bit interleaved depth/stencil functions */ -/* -#define WRITE_DEPTH(_x, _y, d) { \ - GLuint tmp = *(GLuint *)(buf + _x * 4 + y * pitch); \ - tmp &= 0xff; \ - tmp |= (d) & 0xffffff00; \ - *(GLuint *)(buf + _x * 4 + _y * pitch) = tmp; \ +#define VALUE_TYPE GLuint -#define READ_DEPTH(d, _x, _y) \ - d = (*(GLuint *)(buf + _x * 4 + _y * pitch) & ~0xff) >> 8; +#define WRITE_DEPTH( _x, _y, d ) { \ + GLuint tmp = *(GLuint *)(buf + (_x)*4 + (_y)*depth_pitch); \ + tmp &= 0x000000ff; \ + tmp |= ((d)<<8); \ + *(GLuint *)(buf + (_x)*4 + (_y)*depth_pitch) = tmp; \ +} -#define TAG(x) via##x##_24_8 +#define READ_DEPTH( d, _x, _y ) \ + d = (*(GLuint *)(buf + (_x)*4 + (_y)*depth_pitch)) >> 8; + + +#define TAG(x) via##x##_z24_s8 #include "depthtmp.h" -*/ + +#define WRITE_STENCIL( _x, _y, d ) { \ + GLuint tmp = *(GLuint *)(buf + (_x)*4 + (_y)*depth_pitch); \ + tmp &= 0xffffff00; \ + tmp |= (d); \ + *(GLuint *)(buf + (_x)*4 + (_y)*depth_pitch) = tmp; \ +} + +#define READ_STENCIL( d, _x, _y ) \ + d = *(GLuint *)(buf + (_x)*4 + (_y)*depth_pitch) & 0xff; + +#define TAG(x) via##x##_z24_s8 +#include "stenciltmp.h" -void viaSetBuffer(GLcontext *ctx, GLframebuffer *colorBuffer, - GLuint bufferBit) + + +/* Move locking out to get reasonable span performance. + */ +void viaSpanRenderStart( GLcontext *ctx ) { - viaContextPtr vmesa = VIA_CONTEXT(ctx); -#ifdef DEBUG - if (VIA_DEBUG) fprintf(stderr, "%s in\n", __FUNCTION__); -#endif - if (bufferBit == FRONT_LEFT_BIT) { - vmesa->drawMap = (char *)vmesa->driScreen->pFB; - vmesa->readMap = (char *)vmesa->driScreen->pFB; - vmesa->drawPitch = vmesa->front.pitch; - vmesa->readPitch = vmesa->front.pitch; - } - else if (bufferBit == BACK_LEFT_BIT) { - vmesa->drawMap = vmesa->back.map; - vmesa->readMap = vmesa->back.map; - vmesa->drawPitch = vmesa->back.pitch; - vmesa->readPitch = vmesa->back.pitch; - } - else { - ASSERT(0); - } -#ifdef DEBUG - if (VIA_DEBUG) fprintf(stderr, "%s out\n", __FUNCTION__); -#endif + struct via_context *vmesa = VIA_CONTEXT(ctx); + viaWaitIdle(vmesa, GL_FALSE); + LOCK_HARDWARE(vmesa); } +void viaSpanRenderFinish( GLcontext *ctx ) +{ + struct via_context *vmesa = VIA_CONTEXT(ctx); + _swrast_flush( ctx ); + UNLOCK_HARDWARE( vmesa ); +} void viaInitSpanFuncs(GLcontext *ctx) { - viaContextPtr vmesa = VIA_CONTEXT(ctx); struct swrast_device_driver *swdd = _swrast_GetDeviceDriverReference(ctx); + swdd->SpanRenderStart = viaSpanRenderStart; + swdd->SpanRenderFinish = viaSpanRenderFinish; +} + + - swdd->SetBuffer = viaSetBuffer; -#ifdef DEBUG - if (VIA_DEBUG) fprintf(stderr, "%s in\n", __FUNCTION__); -#endif - if (vmesa->viaScreen->bitsPerPixel == 0x10) { - swdd->WriteRGBASpan = viaWriteRGBASpan_565; - swdd->WriteRGBSpan = viaWriteRGBSpan_565; - swdd->WriteMonoRGBASpan = viaWriteMonoRGBASpan_565; - swdd->WriteRGBAPixels = viaWriteRGBAPixels_565; - swdd->WriteMonoRGBAPixels = viaWriteMonoRGBAPixels_565; - swdd->ReadRGBASpan = viaReadRGBASpan_565; - swdd->ReadRGBAPixels = viaReadRGBAPixels_565; - } - else if (vmesa->viaScreen->bitsPerPixel == 0x20) { - swdd->WriteRGBASpan = viaWriteRGBASpan_8888; - swdd->WriteRGBSpan = viaWriteRGBSpan_8888; - swdd->WriteMonoRGBASpan = viaWriteMonoRGBASpan_8888; - swdd->WriteRGBAPixels = viaWriteRGBAPixels_8888; - swdd->WriteMonoRGBAPixels = viaWriteMonoRGBAPixels_8888; - swdd->ReadRGBASpan = viaReadRGBASpan_8888; - swdd->ReadRGBAPixels = viaReadRGBAPixels_8888; - } - else - ASSERT(0); - - if (vmesa->glCtx->Visual.depthBits == 0x10) { - swdd->ReadDepthSpan = viaReadDepthSpan_16; - swdd->WriteDepthSpan = viaWriteDepthSpan_16; - swdd->ReadDepthPixels = viaReadDepthPixels_16; - swdd->WriteDepthPixels = viaWriteDepthPixels_16; - } - else if (vmesa->glCtx->Visual.depthBits == 0x20) { - swdd->ReadDepthSpan = viaReadDepthSpan_32; - swdd->WriteDepthSpan = viaWriteDepthSpan_32; - swdd->ReadDepthPixels = viaReadDepthPixels_32; - swdd->WriteDepthPixels = viaWriteDepthPixels_32; - } - - swdd->WriteCI8Span = NULL; - swdd->WriteCI32Span = NULL; - swdd->WriteMonoCISpan = NULL; - swdd->WriteCI32Pixels = NULL; - swdd->WriteMonoCIPixels = NULL; - swdd->ReadCI32Span = NULL; - swdd->ReadCI32Pixels = NULL; -#ifdef DEBUG - if (VIA_DEBUG) fprintf(stderr, "%s out\n", __FUNCTION__); -#endif +/** + * Plug in the Get/Put routines for the given driRenderbuffer. + */ +void +viaSetSpanFunctions(struct via_renderbuffer *vrb, const GLvisual *vis) +{ + if (vrb->Base.InternalFormat == GL_RGBA) { + if (vis->redBits == 5 && vis->greenBits == 6 && vis->blueBits == 5) { + viaInitPointers_565(&vrb->Base); + } + else { + viaInitPointers_8888(&vrb->Base); + } + } + else if (vrb->Base.InternalFormat == GL_DEPTH_COMPONENT16) { + viaInitDepthPointers_z16(&vrb->Base); + } + else if (vrb->Base.InternalFormat == GL_DEPTH_COMPONENT24) { + viaInitDepthPointers_z24_s8(&vrb->Base); + } + else if (vrb->Base.InternalFormat == GL_DEPTH_COMPONENT32) { + viaInitDepthPointers_z32(&vrb->Base); + } + else if (vrb->Base.InternalFormat == GL_STENCIL_INDEX8_EXT) { + viaInitStencilPointers_z24_s8(&vrb->Base); + } }