* DEALINGS IN THE SOFTWARE.
*/
-#include "mtypes.h"
+#include "main/mtypes.h"
#include "savagedd.h"
#include "savagespan.h"
#include "savageioctl.h"
#define DBG 0
-#define LOCAL_VARS \
- __DRIdrawablePrivate *dPriv = imesa->mesa_drawable; \
- savageScreenPrivate *savageScreen = imesa->savageScreen; \
- GLuint cpp = savageScreen->cpp; \
- GLuint pitch = imesa->aperturePitch; \
- GLuint height = dPriv->h; \
- char *buf = (char *)(imesa->drawMap + \
- dPriv->x * cpp + \
- dPriv->y * pitch); \
- char *read_buf = (char *)(imesa->readMap + \
- dPriv->x * cpp + \
- dPriv->y * pitch); \
- GLuint p = SAVAGE_CONTEXT( ctx )->MonoColor; \
- (void) read_buf; (void) buf; (void) p
-
-#define LOCAL_DEPTH_VARS \
- __DRIdrawablePrivate *dPriv = imesa->mesa_drawable; \
- savageScreenPrivate *savageScreen = imesa->savageScreen; \
- GLuint zpp = savageScreen->zpp; \
- GLuint pitch = imesa->aperturePitch; \
- GLuint height = dPriv->h; \
- char *buf = (char *)(imesa->apertureBase[TARGET_DEPTH] + \
- dPriv->x * zpp + \
- dPriv->y * pitch)
+#define LOCAL_VARS \
+ driRenderbuffer *drb = (driRenderbuffer *) rb; \
+ __DRIdrawablePrivate *const dPriv = drb->dPriv; \
+ GLuint cpp = drb->cpp; \
+ GLuint pitch = drb->pitch; \
+ GLuint height = dPriv->h; \
+ GLubyte *buf = drb->Base.Data + dPriv->x * cpp + dPriv->y * pitch; \
+ GLuint p; \
+ (void) p
+
+#define LOCAL_DEPTH_VARS \
+ driRenderbuffer *drb = (driRenderbuffer *) rb; \
+ __DRIdrawablePrivate *const dPriv = drb->dPriv; \
+ GLuint zpp = drb->cpp; \
+ GLuint pitch = drb->pitch; \
+ GLuint height = dPriv->h; \
+ GLubyte *buf = drb->Base.Data + dPriv->x * zpp + dPriv->y * pitch;
#define LOCAL_STENCIL_VARS LOCAL_DEPTH_VARS
-#define INIT_MONO_PIXEL(p)
-
-#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() savageContextPtr imesa = SAVAGE_CONTEXT(ctx); \
- WAIT_IDLE_EMPTY;\
+#define HW_LOCK()
-#define HW_CLIPLOOP() \
- do { \
- __DRIdrawablePrivate *dPriv = imesa->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_UNLOCK()
+#define HW_WRITE_LOCK()
-#define HW_ENDCLIPLOOP() \
- } \
- } while (0)
-
-#if 0
-#define HW_UNLOCK() \
- UNLOCK_HARDWARE(imesa);
-#endif
-#define HW_UNLOCK() { }
+#define HW_READ_LOCK()
/* 16 bit, 565 rgb color spanline and pixel functions
*/
-#undef INIT_MONO_PIXEL
-#define INIT_MONO_PIXEL(p, color) \
- p = SAVAGEPACKCOLOR565( color[0], color[1], color[2] )
-
-#define WRITE_RGBA( _x, _y, r, g, b, a ) \
-do{ \
- *(GLushort *)(buf + (_x<<1) + _y*pitch) = ( (((int)r & 0xf8) << 8) |\
- (((int)g & 0xfc) << 3) | \
- (((int)b & 0xf8) >> 3)); \
-}while(0)
-#define WRITE_PIXEL( _x, _y, p ) \
-do{ \
- *(GLushort *)(buf + (_x<<1) + _y*pitch) = p; \
-}while(0)
-
-#define READ_RGBA( rgba, _x, _y ) \
-do { \
- GLushort p = *(GLushort *)(read_buf + (_x<<1) + _y*pitch); \
- rgba[0] = (((p >> 11) & 0x1f) * 255) >>5; \
- rgba[1] = (((p >> 5) & 0x3f) * 255) >>6; \
- rgba[2] = (((p >> 0) & 0x1f) * 255) >>5; \
- rgba[3] = 255; \
-} while(0)
+#define SPANTMP_PIXEL_FMT GL_RGB
+#define SPANTMP_PIXEL_TYPE GL_UNSIGNED_SHORT_5_6_5
#define TAG(x) savage##x##_565
-#include "spantmp.h"
+#define TAG2(x,y) savage##x##_565##y
+#include "spantmp2.h"
/* 32 bit, 8888 ARGB color spanline and pixel functions
*/
-#undef INIT_MONO_PIXEL
-#define INIT_MONO_PIXEL(p, color) \
- p = SAVAGEPACKCOLOR8888( color[0], color[1], color[2], color[3] )
-
-#define WRITE_RGBA( _x, _y, r, g, b, a ) \
- *(GLuint *)(buf + (_x<<2) + _y*pitch) = ( ((GLuint)a << 24) | \
- ((GLuint)r << 16) | \
- ((GLuint)g << 8) | \
- ((GLuint)b ))
-#define WRITE_PIXEL( _x, _y, p ) \
- *(GLuint *)(buf + (_x<<2) + _y*pitch) = p
-
-#define READ_RGBA( rgba, _x, _y ) \
-do { \
- GLuint p = *(GLuint *)(read_buf + (_x<<2) + _y*pitch); \
- rgba[0] = (p >> 16) & 0xFF; \
- rgba[1] = (p >> 8) & 0xFF; \
- rgba[2] = (p >> 0) & 0xFF; \
- rgba[3] = 0xFF; \
-} while(0)
+#define SPANTMP_PIXEL_FMT GL_BGRA
+#define SPANTMP_PIXEL_TYPE GL_UNSIGNED_INT_8_8_8_8_REV
#define TAG(x) savage##x##_8888
-#include "spantmp.h"
+#define TAG2(x,y) savage##x##_8888##y
+#include "spantmp2.h"
+
+#undef HW_WRITE_LOCK
+#define HW_WRITE_LOCK()
+#undef HW_READ_LOCK
+#define HW_READ_LOCK()
-/* 16 bit depthbuffer functions.
+/* 16 bit integer depthbuffer functions
+ * Depth range is reversed. See also savageCalcViewport.
*/
+#define VALUE_TYPE GLushort
+
#define WRITE_DEPTH( _x, _y, d ) \
-do{ \
- *(GLushort *)(buf + (_x<<1) + _y*pitch) = d; \
-}while(0)
-
+ *(GLushort *)(buf + ((_x)<<1) + (_y)*pitch) = 0xFFFF - d
+
#define READ_DEPTH( d, _x, _y ) \
-do{ \
- d = *(GLushort *)(buf + (_x<<1) + _y*pitch); \
-}while(0)
-
-/* d = 0xffff; */
-
-#define TAG(x) savage##x##_16
+ d = 0xFFFF - *(GLushort *)(buf + ((_x)<<1) + (_y)*pitch)
+
+#define TAG(x) savage##x##_z16
#include "depthtmp.h"
-
-/* 8-bit stencil /24-bit depth depthbuffer functions.
+/* 16 bit float depthbuffer functions
*/
-#define WRITE_DEPTH( _x, _y, d ) { \
- GLuint tmp = *(GLuint *)(buf + (_x<<2) + _y*pitch); \
- tmp &= 0xFF000000; \
- tmp |= d; \
+#define VALUE_TYPE GLushort
+
+#define WRITE_DEPTH( _x, _y, d ) \
+ *(GLushort *)(buf + ((_x)<<1) + (_y)*pitch) = \
+ savageEncodeFloat16( 1.0 - (GLfloat)d/65535.0 )
+
+#define READ_DEPTH( d, _x, _y ) \
+ d = 65535 - \
+ savageDecodeFloat16( *(GLushort *)(buf + ((_x)<<1) + (_y)*pitch) ) * \
+ 65535.0
+
+#define TAG(x) savage##x##_z16f
+#include "depthtmp.h"
+
+
+
+
+/* 8-bit stencil /24-bit integer depth depthbuffer functions.
+ * Depth range is reversed. See also savageCalcViewport.
+ */
+#define VALUE_TYPE GLuint
+
+#define WRITE_DEPTH( _x, _y, d ) do { \
+ GLuint tmp = *(GLuint *)(buf + ((_x)<<2) + (_y)*pitch); \
+ tmp &= 0xFF000000; \
+ tmp |= 0x00FFFFFF - d; \
*(GLuint *)(buf + (_x<<2) + _y*pitch) = tmp; \
-}
+} while(0)
#define READ_DEPTH( d, _x, _y ) \
- d = *(GLuint *)(buf + (_x<<2) + _y*pitch) & 0x00FFFFFF;
-
-/* d = 0x00ffffff; */
+ d = 0x00FFFFFF - (*(GLuint *)(buf + ((_x)<<2) + (_y)*pitch) & 0x00FFFFFF)
-#define TAG(x) savage##x##_8_24
+#define TAG(x) savage##x##_s8_z24
#include "depthtmp.h"
-#define WRITE_STENCIL( _x, _y, d ) { \
- GLuint tmp = *(GLuint *)(buf + (_x<<2) + _y*pitch); \
- tmp &= 0x00FFFFFF; \
- tmp |= (((GLuint)d)<<24) & 0xFF000000; \
- *(GLuint *)(buf + (_x<<2) + _y*pitch) = tmp; \
-}
-
-#define READ_STENCIL( d, _x, _y ) \
- d = (GLstencil)((*(GLuint *)(buf + (_x<<2) + _y*pitch) & 0xFF000000) >> 24);
-
-#define TAG(x) savage##x##_8_24
-#include "stenciltmp.h"
-
-/*
- * This function is called to specify which buffer to read and write
- * for software rasterization (swrast) fallbacks. This doesn't necessarily
- * correspond to glDrawBuffer() or glReadBuffer() calls.
+
+/* 24 bit float depthbuffer functions
*/
-static void savageDDSetBuffer(GLcontext *ctx, GLframebuffer *buffer,
- GLuint bufferBit)
-{
- savageContextPtr imesa = SAVAGE_CONTEXT(ctx);
- char *map;
+#define VALUE_TYPE GLuint
- assert((bufferBit == DD_FRONT_LEFT_BIT) || (bufferBit == DD_BACK_LEFT_BIT));
+#define WRITE_DEPTH( _x, _y, d ) do { \
+ GLuint tmp = *(GLuint *)(buf + ((_x)<<2) + (_y)*pitch); \
+ tmp &= 0xFF000000; \
+ tmp |= savageEncodeFloat24( 1.0 - (GLfloat)d/16777215.0 ); \
+ *(GLuint *)(buf + (_x<<2) + _y*pitch) = tmp; \
+} while(0)
+
+#define READ_DEPTH( d, _x, _y ) \
+ d = 16777215 - savageDecodeFloat24( \
+ *(GLuint *)(buf + ((_x)<<2) + (_y)*pitch) & 0x00FFFFFF) \
+ * 16777215.0
+
+#define TAG(x) savage##x##_s8_z24f
+#include "depthtmp.h"
- map = (bufferBit == DD_FRONT_LEFT_BIT)
- ? (char*)imesa->apertureBase[TARGET_FRONT]
- : (char*)imesa->apertureBase[TARGET_BACK];
- imesa->drawMap = map;
- imesa->readMap = map;
+#define WRITE_STENCIL( _x, _y, d ) do { \
+ GLuint tmp = *(GLuint *)(buf + ((_x)<<2) + (_y)*pitch); \
+ tmp &= 0x00FFFFFF; \
+ tmp |= (((GLuint)d)<<24) & 0xFF000000; \
+ *(GLuint *)(buf + ((_x)<<2) + (_y)*pitch) = tmp; \
+} while(0)
+
+#define READ_STENCIL( d, _x, _y ) \
+ d = (GLstencil)((*(GLuint *)(buf + ((_x)<<2) + (_y)*pitch) & 0xFF000000) >> 24)
+
+#define TAG(x) savage##x##_s8_z24
+#include "stenciltmp.h"
- assert( (buffer == imesa->driDrawable->driverPrivate)
- || (buffer == imesa->driReadable->driverPrivate) );
- imesa->mesa_drawable = (buffer == imesa->driDrawable->driverPrivate)
- ? imesa->driDrawable : imesa->driReadable;
+
+/*
+ * Wrappers around _swrast_Copy/Draw/ReadPixels that make sure all
+ * primitives are flushed and the hardware is idle before accessing
+ * the frame buffer.
+ */
+static void
+savageCopyPixels( GLcontext *ctx,
+ GLint srcx, GLint srcy, GLsizei width, GLsizei height,
+ GLint destx, GLint desty,
+ GLenum type )
+{
+ savageContextPtr imesa = SAVAGE_CONTEXT(ctx);
+ FLUSH_BATCH(imesa);
+ WAIT_IDLE_EMPTY(imesa);
+ _swrast_CopyPixels(ctx, srcx, srcy, width, height, destx, desty, type);
+}
+static void
+savageDrawPixels( GLcontext *ctx,
+ GLint x, GLint y,
+ GLsizei width, GLsizei height,
+ GLenum format, GLenum type,
+ const struct gl_pixelstore_attrib *packing,
+ const GLvoid *pixels )
+{
+ savageContextPtr imesa = SAVAGE_CONTEXT(ctx);
+ FLUSH_BATCH(imesa);
+ WAIT_IDLE_EMPTY(imesa);
+ _swrast_DrawPixels(ctx, x, y, width, height, format, type, packing, pixels);
+}
+static void
+savageReadPixels( GLcontext *ctx,
+ GLint x, GLint y, GLsizei width, GLsizei height,
+ GLenum format, GLenum type,
+ const struct gl_pixelstore_attrib *packing,
+ GLvoid *pixels )
+{
+ savageContextPtr imesa = SAVAGE_CONTEXT(ctx);
+ FLUSH_BATCH(imesa);
+ WAIT_IDLE_EMPTY(imesa);
+ _swrast_ReadPixels(ctx, x, y, width, height, format, type, packing, pixels);
+}
+
+/*
+ * Make sure the hardware is idle when span-rendering.
+ */
+static void savageSpanRenderStart( GLcontext *ctx )
+{
+ savageContextPtr imesa = SAVAGE_CONTEXT(ctx);
+ FLUSH_BATCH(imesa);
+ WAIT_IDLE_EMPTY(imesa);
}
void savageDDInitSpanFuncs( GLcontext *ctx )
{
- savageContextPtr imesa = SAVAGE_CONTEXT(ctx);
struct swrast_device_driver *swdd = _swrast_GetDeviceDriverReference(ctx);
+ swdd->SpanRenderStart = savageSpanRenderStart;
+
+ /* XXX these should probably be plugged in elsewhere */
+ ctx->Driver.CopyPixels = savageCopyPixels;
+ ctx->Driver.DrawPixels = savageDrawPixels;
+ ctx->Driver.ReadPixels = savageReadPixels;
+}
- swdd->SetBuffer = savageDDSetBuffer;
-
- switch (imesa->savageScreen->cpp)
- {
- case 2:
- swdd->WriteRGBASpan = savageWriteRGBASpan_565;
- swdd->WriteRGBSpan = savageWriteRGBSpan_565;
- swdd->WriteMonoRGBASpan = savageWriteMonoRGBASpan_565;
- swdd->WriteRGBAPixels = savageWriteRGBAPixels_565;
- swdd->WriteMonoRGBAPixels = savageWriteMonoRGBAPixels_565;
- swdd->ReadRGBASpan = savageReadRGBASpan_565;
- swdd->ReadRGBAPixels = savageReadRGBAPixels_565;
-
- break;
-
- case 4:
- swdd->WriteRGBASpan = savageWriteRGBASpan_8888;
- swdd->WriteRGBSpan = savageWriteRGBSpan_8888;
- swdd->WriteMonoRGBASpan = savageWriteMonoRGBASpan_8888;
- swdd->WriteRGBAPixels = savageWriteRGBAPixels_8888;
- swdd->WriteMonoRGBAPixels = savageWriteMonoRGBAPixels_8888;
- swdd->ReadRGBASpan = savageReadRGBASpan_8888;
- swdd->ReadRGBAPixels = savageReadRGBAPixels_8888;
- }
- switch (imesa->savageScreen->zpp)
- {
- case 2:
- swdd->ReadDepthSpan = savageReadDepthSpan_16;
- swdd->WriteDepthSpan = savageWriteDepthSpan_16;
- swdd->ReadDepthPixels = savageReadDepthPixels_16;
- swdd->WriteDepthPixels = savageWriteDepthPixels_16;
-
- break;
- case 4:
- swdd->ReadDepthSpan = savageReadDepthSpan_8_24;
- swdd->WriteDepthSpan = savageWriteDepthSpan_8_24;
- swdd->ReadDepthPixels = savageReadDepthPixels_8_24;
- swdd->WriteDepthPixels = savageWriteDepthPixels_8_24;
-#if HW_STENCIL
- swdd->ReadStencilSpan = savageReadStencilSpan_8_24;
- swdd->WriteStencilSpan = savageWriteStencilSpan_8_24;
- swdd->ReadStencilPixels = savageReadStencilPixels_8_24;
- swdd->WriteStencilPixels = savageWriteStencilPixels_8_24;
-#endif
- break;
-
+
+/**
+ * Plug in the Get/Put routines for the given driRenderbuffer.
+ */
+void
+savageSetSpanFunctions(driRenderbuffer *drb, const GLvisual *vis,
+ GLboolean float_depth)
+{
+ if (drb->Base.InternalFormat == GL_RGBA) {
+ if (vis->redBits == 5 && vis->greenBits == 6 && vis->blueBits == 5) {
+ savageInitPointers_565(&drb->Base);
+ }
+ else {
+ savageInitPointers_8888(&drb->Base);
+ }
+ }
+ else if (drb->Base.InternalFormat == GL_DEPTH_COMPONENT16) {
+ if (float_depth) {
+ savageInitDepthPointers_z16f(&drb->Base);
+ }
+ else {
+ savageInitDepthPointers_z16(&drb->Base);
+ }
+ }
+ else if (drb->Base.InternalFormat == GL_DEPTH_COMPONENT24) {
+ if (float_depth) {
+ savageInitDepthPointers_s8_z24f(&drb->Base);
+ }
+ else {
+ savageInitDepthPointers_s8_z24(&drb->Base);
+ }
+ }
+ else if (drb->Base.InternalFormat == GL_STENCIL_INDEX8_EXT) {
+ savageInitStencilPointers_s8_z24(&drb->Base);
}
- swdd->WriteCI8Span =NULL;
- swdd->WriteCI32Span =NULL;
- swdd->WriteMonoCISpan =NULL;
- swdd->WriteCI32Pixels =NULL;
- swdd->WriteMonoCIPixels =NULL;
- swdd->ReadCI32Span =NULL;
- swdd->ReadCI32Pixels =NULL;
-
- /* Pixel path fallbacks.
- */
- ctx->Driver.Accum = _swrast_Accum;
- ctx->Driver.Bitmap = _swrast_Bitmap;
- ctx->Driver.CopyPixels = _swrast_CopyPixels;
- ctx->Driver.DrawPixels = _swrast_DrawPixels;
- ctx->Driver.ReadPixels = _swrast_ReadPixels;
}